การขอข้อมูลตำแหน่งของผู้ใช้ใน Android มีหลายวิธี และวิธีที่ดีที่สุดจะแตกต่างกันไปตามกรณีการใช้งาน คู่มือนี้อธิบายสถานการณ์การเข้าถึงตำแหน่งต่างๆ และอธิบายวิธีขอสิทธิ์เข้าถึงตำแหน่งในแต่ละกรณี
ก่อนอื่น โปรดอ่านแนวทางปฏิบัติแนะนำสำหรับสิทธิ์รันไทม์ทั้งหมด รวมถึงคำแนะนำที่กว้างขึ้นสำหรับการลดคำขอสิทธิ์
ประเภทการเข้าถึงตำแหน่ง
สิทธิ์แต่ละรายการมีลักษณะต่อไปนี้รวมกัน
- หมวดหมู่: ตำแหน่งในเบื้องหน้าหรือตำแหน่งในเบื้องหลัง
- ความแม่นยำ: ตำแหน่งที่แน่นอนหรือตำแหน่งโดยประมาณ
ตำแหน่งที่ทำงานอยู่เบื้องหน้า
หากแอปของคุณมีฟีเจอร์ที่แชร์หรือรับข้อมูลตำแหน่งเพียงครั้งเดียวหรือเป็นระยะเวลาที่กำหนด ฟีเจอร์นั้นจะต้องมีสิทธิ์เข้าถึงตำแหน่งในเบื้องหน้า ตัวอย่างเช่น
- ฟีเจอร์ภายในแอปการนำทางช่วยให้ผู้ใช้ดูเส้นทางแบบเลี้ยวต่อเลี้ยวได้
- ภายในแอปรับส่งข้อความ ฟีเจอร์หนึ่งช่วยให้ผู้ใช้แชร์ตำแหน่งปัจจุบันกับผู้ใช้รายอื่นได้
ระบบจะถือว่าแอปของคุณใช้ตำแหน่งในเบื้องหน้าหากฟีเจอร์ของแอปเข้าถึงตำแหน่งปัจจุบันของอุปกรณ์ในสถานการณ์ใดสถานการณ์หนึ่งต่อไปนี้
- กิจกรรมที่เป็นของแอปของคุณจะปรากฏขึ้น
แอปของคุณกำลังเรียกใช้บริการที่ทำงานอยู่เบื้องหน้า เมื่อบริการที่ทำงานอยู่เบื้องหน้าทำงานอยู่ ระบบจะแจ้งให้ผู้ใช้ทราบโดยแสดงการแจ้งเตือนแบบถาวร แอปจะยังคงเข้าถึงได้เมื่ออยู่ในเบื้องหลัง เช่น เมื่อผู้ใช้กดปุ่มหน้าแรกบนอุปกรณ์หรือปิดจอแสดงผลของอุปกรณ์
นอกจากนี้ คุณควรประกาศประเภทบริการที่ทำงานอยู่เบื้องหน้าเป็น
locationดังที่แสดงในข้อมูลโค้ดต่อไปนี้ ใน Android 10 (ระดับ API 29) ขึ้นไป คุณต้องประกาศประเภทบริการที่ทำงานอยู่เบื้องหน้านี้<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements would go here. --> </service>
คุณประกาศความจำเป็นในการเข้าถึงตำแหน่งในเบื้องหน้าเมื่อแอปขอสิทธิ์ ACCESS_COARSE_LOCATION หรือสิทธิ์ ACCESS_FINE_LOCATION ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
<manifest ... >
<!-- Always include this permission -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Include only if your app benefits from precise location access. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
การเข้าถึงแบบครั้งเดียว นอกเหนือจากการเข้าถึงข้อมูลตำแหน่งในเบื้องหน้าแล้ว กรณีการใช้งานบางอย่างยังมีข้อแตกต่างเพิ่มเติมคือต้องการเข้าถึงตำแหน่งของผู้ใช้ ณ จุดที่เฉพาะเจาะจงในประสบการณ์การใช้งานแอปเท่านั้น แทนที่จะอัปเดตอย่างสม่ำเสมอตลอดการใช้งานแอป ในกรณีเหล่านี้ แอปควรใช้ปุ่มตำแหน่งเพื่อขอสิทธิ์เข้าถึงตำแหน่งสำหรับเซสชันการใช้งานแอปแต่ละเซสชัน นอกจากนี้ หากแอปกำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไปและมีเฉพาะฟีเจอร์ที่ต้องใช้การเข้าถึงตำแหน่งตามเซสชัน ข้อกำหนดด้านนโยบายของ Google Play กำหนดให้คุณต้องใช้ปุ่มตำแหน่ง ดูรายละเอียดเพิ่มเติมได้ที่นโยบายปุ่มตำแหน่ง
ตำแหน่งในเบื้องหลัง
แอปต้องมีสิทธิ์เข้าถึงตำแหน่งในเบื้องหลังหากฟีเจอร์ภายในแอปแชร์ตำแหน่งกับผู้ใช้คนอื่นๆ อย่างต่อเนื่องหรือใช้ Geofencing API ตัวอย่างมีดังนี้
- ภายในแอปแชร์ตำแหน่งของครอบครัว ฟีเจอร์หนึ่งช่วยให้ผู้ใช้แชร์ตำแหน่งกับสมาชิกในครอบครัวได้อย่างต่อเนื่อง
- ภายในแอป IoT ฟีเจอร์หนึ่งช่วยให้ผู้ใช้กำหนดค่าอุปกรณ์สมาร์ทโฮมได้ เช่น ปิดเมื่อผู้ใช้ออกจากบ้านและเปิดอีกครั้งเมื่อผู้ใช้กลับถึงบ้าน
ระบบจะถือว่าแอปของคุณใช้ตำแหน่งในเบื้องหลังหากแอปเข้าถึงตำแหน่งปัจจุบันของอุปกรณ์ในสถานการณ์อื่นนอกเหนือจากที่อธิบายไว้ในส่วนตำแหน่งในเบื้องหน้า ความแม่นยำของตำแหน่งในเบื้องหลังจะเหมือนกับความแม่นยำของตำแหน่งในเบื้องหน้า ซึ่งขึ้นอยู่กับสิทธิ์เข้าถึงตำแหน่งที่แอปของคุณประกาศ
ใน Android 10 (ระดับ API 29) ขึ้นไป คุณต้องประกาศสิทธิ์ ACCESS_BACKGROUND_LOCATION ในไฟล์ Manifest ของแอปเพื่อขอสิทธิ์เข้าถึงตำแหน่งในเบื้องหลังที่รันไทม์ ใน Android เวอร์ชันก่อนหน้า เมื่อแอปได้รับสิทธิ์เข้าถึงตำแหน่งในเบื้องหน้า แอปจะได้รับสิทธิ์เข้าถึงตำแหน่งในเบื้องหลังโดยอัตโนมัติด้วย
<manifest ... >
<!-- Required only when requesting background location access on
Android 10 (API level 29) and higher. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
ความแม่นยำ
Android รองรับความแม่นยำของตำแหน่งในระดับต่อไปนี้
- โดยประมาณ
- ระบุตำแหน่งโดยประมาณของอุปกรณ์ หากการประมาณตำแหน่งนี้มาจาก
LocationManagerServiceหรือFusedLocationProviderการประมาณนี้จะแม่นยำภายในพื้นที่ประมาณ 3 ตารางกิโลเมตร (ประมาณ 1.2 ตารางไมล์) แอปจะรับตำแหน่งที่ความแม่นยำระดับนี้ได้เมื่อคุณประกาศสิทธิ์ACCESS_COARSE_LOCATIONแต่ไม่ได้ประกาศสิทธิ์ACCESS_FINE_LOCATION - แน่นอน
- ระบุตำแหน่งอุปกรณ์โดยประมาณที่แม่นยำที่สุดเท่าที่จะเป็นไปได้
หากการประมาณตำแหน่งมาจาก
LocationManagerServiceหรือFusedLocationProviderการประมาณนี้มักจะอยู่ภายในระยะประมาณ 50 เมตร (160 ฟุต) และบางครั้งอาจแม่นยำภายในระยะไม่กี่เมตร (10 ฟุต) หรือดีกว่านั้น แอปของคุณจะรับตำแหน่งที่ความแม่นยำระดับนี้ได้เมื่อคุณประกาศสิทธิ์ACCESS_FINE_LOCATION
หากผู้ใช้ให้สิทธิ์เข้าถึงตำแหน่งโดยประมาณ แอปของคุณจะมีสิทธิ์เข้าถึงเฉพาะตำแหน่งโดยประมาณเท่านั้น ไม่ว่าแอปจะประกาศสิทธิ์เข้าถึงตำแหน่งใดก็ตาม
แอปของคุณควรยังคงทำงานได้เมื่อผู้ใช้ให้สิทธิ์เข้าถึงตำแหน่งโดยประมาณเท่านั้น หากฟีเจอร์ในแอปจำเป็นต้องเข้าถึงตำแหน่งที่แน่นอนโดยใช้สิทธิ์ ACCESS_FINE_LOCATION คุณสามารถขอให้ผู้ใช้อนุญาตให้แอปเข้าถึงตำแหน่งที่แน่นอนได้
การช่วยเตือนเกี่ยวกับการให้สิทธิ์เข้าถึงตำแหน่งในเบื้องหลัง
ใน Android 10 (ระดับ API 29) ขึ้นไป เมื่อฟีเจอร์ในแอปเข้าถึงตำแหน่งของอุปกรณ์ในเบื้องหลังเป็นครั้งแรกหลังจากที่ผู้ใช้ให้สิทธิ์เข้าถึงตำแหน่งในเบื้องหลัง ระบบจะกำหนดเวลาการแจ้งเตือนเพื่อส่งให้ผู้ใช้ การแจ้งเตือนนี้จะช่วยเตือนผู้ใช้ว่าได้อนุญาตให้แอปของคุณเข้าถึงตำแหน่งของอุปกรณ์ตลอดเวลา ตัวอย่างการแจ้งเตือนจะปรากฏในรูปที่ 8
ตรวจสอบข้อกำหนดสถานที่ตั้งในการขึ้นต่อกันของ SDK ของแอป
ตรวจสอบว่าแอปของคุณใช้ SDK ที่ขึ้นอยู่กับสิทธิ์เข้าถึงตำแหน่งหรือไม่ โดยเฉพาะสิทธิ์ ACCESS_FINE_LOCATION ดูข้อมูลเพิ่มเติมได้ที่บล็อกโพสต์ทำความรู้จักลักษณะการทำงานของทรัพยากร Dependency ของ SDK ใน Medium
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์เข้าถึงตำแหน่งใน Android ได้จากแหล่งข้อมูลต่อไปนี้
Codelab
วิดีโอ
ตัวอย่าง
- แอปตัวอย่างเพื่อสาธิตการใช้สิทธิ์เข้าถึงตำแหน่ง