# การใช้โมดูลตำแหน่ง Pushwoosh ในแอป Android

<Aside type="caution">
โปรดทราบว่าการส่งข้อความตามตำแหน่งทางภูมิศาสตร์ไม่พร้อมใช้งานสำหรับอุปกรณ์ HMS (Huawei Mobile Services) เนื่องจากสร้างขึ้นบนบริการตำแหน่งของ Google
</Aside>

มีการเข้าถึงตำแหน่งสองประเภทใน Android:

*   การเข้าถึงตำแหน่ง **Foreground**
*   การเข้าถึงตำแหน่ง **Background**

สำหรับการอัปเดตตำแหน่งของผู้ใช้ใน **foreground** ควรเป็นไปตามเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้:

*   กิจกรรมใดกิจกรรมหนึ่งของแอปทำงานอยู่
*   บริการ Foreground ที่มี foregroundServiceType = “location” ถูกเปิดใช้งานสำหรับแอป

การเข้าถึง **Background** อนุญาตให้แอปรับตำแหน่งทางภูมิศาสตร์ของผู้ใช้ในขณะที่แอปไม่ได้ใช้งาน และไม่มีบริการ foreground ประเภท “location” ถูกเปิดใช้งานสำหรับแอปนั้น

## การเข้าถึงตำแหน่ง Foreground

หากคุณจะใช้โมดูลตำแหน่ง Pushwoosh เพื่ออัปเดตตำแหน่งของผู้ใช้เฉพาะเมื่อแอปของคุณทำงานอยู่ ให้เพิ่มโมดูล `pushwoosh-location` ลงใน **app/build.gradle** ของคุณ:

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

<Aside>
รับเวอร์ชันโมดูลล่าสุดใน Pushwoosh Github repo: [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 30 แทน 31 โปรดทราบว่าคุณสมบัติที่มีอยู่ใน Android 12 จะไม่พร้อมใช้งานในกรณีนี้
2.  ขอให้ผู้ใช้ของคุณปิดการเพิ่มประสิทธิภาพแบตเตอรี่สำหรับแอปของคุณ เพื่อให้ ForegroundService เริ่มทำงานในพื้นหลังได้
</Aside>

หากต้องการเปิดใช้งาน **ForegroundService** เมื่อเมธอด `startLocationTracking` ถูกเรียก ซึ่งอนุญาตให้รับตำแหน่งทางภูมิศาสตร์ของผู้ใช้เมื่อแอปพลิเคชันของคุณอยู่ในพื้นหลัง ให้ทำตามขั้นตอนที่อธิบายไว้ใน [ย่อหน้าก่อนหน้า](#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>
...
```

## การเข้าถึงตำแหน่ง Background

สำหรับการอัปเดตตำแหน่งทางภูมิศาสตร์ในพื้นหลังโดยไม่มี 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" />
```

*   ร้องขอการอนุญาตจากผู้ใช้ในการอัปเดตตำแหน่งในพื้นหลังหลังจากได้รับการอนุญาตตำแหน่ง foreground แล้ว (ดูแนวทางในเอกสารสำหรับนักพัฒนา 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) )

ในโมดูล `pushwoosh-location` เวอร์ชัน 6.3.2 เราได้รวมเมธอดเพิ่มเติมที่เปิดหน้าจอการตั้งค่าการอนุญาตตำแหน่ง หากเป็นไปตามเงื่อนไขต่อไปนี้:

*   มีการอนุญาตตำแหน่ง foreground สำหรับแอป;
*   มีการอนุญาตผู้ใช้ ACCESS\_BACKGROUND\_LOCATION อยู่ใน AndroidManifest.xml ของแอป

<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) เมื่อถูกร้องขอการอนุญาตเข้าถึงตำแหน่ง foreground ผู้ใช้สามารถเลือกความถี่และความแม่นยำที่แอปจะได้รับตำแหน่งของผู้ใช้ได้

มีการอนุญาตสองประเภทดังนี้:

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.6 กม.)
*   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)