# Android 앱에서 Pushwoosh location module 사용하기

<Aside type="caution">
지리 기반 메시징은 Google 위치 서비스를 기반으로 하므로 HMS (Huawei Mobile Services) 기기에서는 사용할 수 없습니다.
</Aside>

Android에는 두 가지 위치 액세스 범주가 있습니다:

*   **포그라운드** 위치 액세스
*   **백그라운드** 위치 액세스

사용자의 위치를 **포그라운드**에서 업데이트하려면 다음 조건 중 하나를 충족해야 합니다:

*   앱의 활동 중 하나가 활성 상태인 경우
*   앱에 대해 foregroundServiceType = "location"인 포그라운드 서비스가 실행된 경우

**백그라운드** 액세스는 앱이 비활성 상태이고 해당 앱에 대해 "location" 유형의 포그라운드 서비스가 실행되지 않은 동안에도 앱이 사용자의 지리적 위치를 가져올 수 있도록 합니다.

## 포그라운드 위치 액세스

앱이 활성 상태일 때만 Pushwoosh 위치 모듈을 사용하여 사용자의 위치를 업데이트하려면 `pushwoosh-location` 모듈을 **app/build.gradle**에 추가합니다:

```java title="build.gradle"
implementation 'com.pushwoosh:pushwoosh-location:6.+'
```

<Aside>
최신 모듈 버전은 Pushwoosh Github 리포지토리에서 확인하세요: [https://github.com/Pushwoosh/pushwoosh-android-sdk/releases](https://github.com/Pushwoosh/pushwoosh-android-sdk/releases)
</Aside>

모듈을 시작하려면 `startLocationTracking` 메서드를 사용합니다:

<Tabs>
<TabItem label="Java">
```java
PushwooshLocation.startLocationTracking();
```
</TabItem>

<TabItem label="Kotlin">
```kotlin
PushwooshLocation.startLocationTracking()
```
</TabItem>
</Tabs>

<Aside type="note">
`pushwoosh-location` 모듈은 사용자로부터 필요한 모든 권한 (ACCESS\_COARSE\_LOCATION, ACCESS\_FINE\_LOCATION)을 요청합니다.
</Aside>

## 애플리케이션이 백그라운드에 있을 때 ForegroundService를 사용하여 위치 요청하기

<Aside type="caution" title="사용 중단됨">

Android 12 업데이트로 인해 ForegroundService가 올바르게 작동하지 않아 사용 중단되었으며, 향후 Pushwoosh SDK에서 제거될 예정입니다.

백그라운드에서 사용자 위치를 추적하기 위한 몇 가지 해결 방법은 다음과 같습니다:

1.  targetSdkVersion 31 대신 30을 사용합니다. 이 경우 Android 12의 기능은 사용할 수 없습니다.
2.  ForegroundService가 백그라운드에서 시작될 수 있도록 사용자에게 앱의 배터리 최적화를 비활성화하도록 요청합니다.
</Aside>

`startLocationTracking` 메서드가 호출될 때 **ForegroundService**를 시작하여 애플리케이션이 백그라운드에 있을 때 사용자의 지리적 위치를 가져올 수 있도록 하려면, [이전 단락](#foreground-location-access)에 설명된 단계를 따른 다음, 다음 메타데이터를 **AndroidManifest.xml**에 추가합니다:

```txt
...
<application>
....
    <meta-data
        android:name="com.pushwoosh.start_foreground_service"
        android:value="true" />
...
</application>
...
```

**ForegroundService**가 시작되면 알림이 생성됩니다. 프로젝트의 **AndroidManifest.xml**에 추가 메타데이터를 지정하여 알림을 사용자 정의할 수 있습니다:

```txt
...
<application>
....
    <meta-data
        android:name="com.pushwoosh.foreground_service_notification_text"
        android:value="My notification text" />
    <meta-data
        android:name="com.pushwoosh.foreground_service_notification_channel_name"
        android:value="My notification channel name" />
...
</application>
...
```

## 백그라운드 위치 액세스

ForegroundService 실행 없이 백그라운드에서 지리적 위치를 업데이트하려면 다음이 필요합니다:

*   앱의 백그라운드 위치 액세스에 대한 Google Play 승인을 받습니다 (자세한 내용은 [https://support.google.com/googleplay/android-developer/answer/9799150?hl=en](https://support.google.com/googleplay/android-developer/answer/9799150?hl=en) 참조).
*   AndroidManifest.xml에 권한을 추가합니다:

```txt
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
```

*   포그라운드 위치 권한을 받은 후 백그라운드에서 위치 업데이트에 대한 사용자 권한을 요청합니다 (Android 개발자 문서에서 가이드라인을 찾으세요: [https://developer.android.com/training/location/permissions#background-dialog-target-android-11](https://developer.android.com/training/location/permissions#background-dialog-target-android-11)).

6.3.2 `pushwoosh-location` 모듈 버전에는 다음 조건이 충족될 경우 위치 권한 설정 화면을 여는 추가 메서드가 포함되어 있습니다:

*   앱에 포그라운드 위치 권한이 부여된 경우
*   앱의 AndroidManifest.xml에 `ACCESS_BACKGROUND_LOCATION` 사용자 권한이 있는 경우

<Aside type="caution">
앱이 백그라운드에서 사용자 위치에 액세스해야 하는 이유와 목적을 사용자에게 명확하게 설명해야 합니다. 자세한 내용은 [Android 개발자 가이드](https://developer.android.com/training/location/permissions#background-dialog-target-android-11)를 참조하세요.
</Aside>

메서드를 다음과 같이 호출합니다:

<Tabs>
<TabItem label="Java">
```java
PushwooshLocation.requestBackgroundLocationPermission();
```
</TabItem>

<TabItem label="Kotlin">
```
PushwooshLocation.requestBackgroundLocationPermission()
```
</TabItem>
</Tabs>

## Android 12 이상 권한 유형

[Android 12부터](https://developer.android.com/about/versions/12/approximate-location) 포그라운드 위치 액세스 권한을 요청받을 때, 사용자는 앱이 사용자의 위치를 얼마나 자주, 어떤 정밀도로 가져올지 선택할 수 있습니다.

두 가지 유형의 권한이 있습니다:

1.  `ACCESS_COARSE_LOCATION`과 동일한 대략적인 위치
2.  `ACCESS_FINE_LOCATION` 및 `ACCESS_COARSE_LOCATION`과 동일한 정확한 위치

<Aside type="caution">
`Manifest.permission.ACCESS_COARSE_LOCATION`이 있고 `Manifest.permission.ACCESS_FINE_LOCATION`이 없는 애플리케이션의 위치 요청은 자동으로 더 느린 간격으로 조절되며, 위치 객체는 대략적인 정확도 수준만 표시하도록 난독화됩니다. 자세한 내용은 [https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest)를 참조하세요.
</Aside>

<Aside type="note">
정밀도 수준은 요청하는 권한에 따라 달라진다는 점을 명심하세요:

*   `ACCESS_COARSE_LOCATION` – 장치의 위치를 약 1마일(1.6km) 이내로 추정합니다.
*   `ACCESS_FINE_LOCATION` – 장치의 위치를 가능한 한 정확하게 추정하며, 일반적으로 약 160피트(50미터) 이내이고 때로는 10피트(몇 미터) 이내 또는 그 이상으로 정확합니다.

출처: [https://developer.android.com/training/location/permissions](https://developer.android.com/training/location/permissions)
</Aside>

## 피드백을 공유해주세요

귀하의 피드백은 더 나은 경험을 만드는 데 도움이 되므로, SDK 통합 과정에서 문제가 발생하면 기꺼이 의견을 듣고 싶습니다. 어려움이 있으시면 [이 양식](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform)을 통해 주저하지 말고 의견을 공유해 주세요.