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 ตารางกิโลเมตร แอปจะได้รับตำแหน่งที่มีความแม่นยำระดับนี้เมื่อคุณ ประกาศสิทธิ์ACCESS_COARSE_LOCATIONแต่ไม่ได้ประกาศสิทธิ์ACCESS_FINE_LOCATION - แน่นอน
- ให้ค่าประมาณตำแหน่งของอุปกรณ์ที่มีความแม่นยำมากที่สุดเท่าที่จะเป็นไปได้
หากค่าประมาณตำแหน่งมาจาก
LocationManagerServiceหรือFusedLocationProviderค่าประมาณนี้มักจะอยู่ภายในระยะประมาณ 50 เมตร และบางครั้งก็มีความแม่นยำภายในระยะไม่กี่เมตรหรือดีกว่า แอปจะได้รับตำแหน่งที่มีความแม่นยำระดับนี้เมื่อคุณประกาศสิทธิ์ACCESS_FINE_LOCATION
แอปของคุณควรยังคงทำงานได้เมื่อผู้ใช้ให้สิทธิ์เข้าถึงตำแหน่งโดยประมาณเท่านั้น หากฟีเจอร์ในแอปของคุณจำเป็นต้องเข้าถึงตำแหน่งที่แน่นอน
โดยใช้สิทธิ์ ACCESS_FINE_LOCATION คุณสามารถขอให้ผู้ใช้ อนุญาตให้
แอปเข้าถึงตำแหน่งที่แน่นอนได้
การช่วยเตือนเกี่ยวกับการให้สิทธิ์เข้าถึงตำแหน่งในเบื้องหลัง
ใน Android 10 (ระดับ API 29) ขึ้นไป เมื่อฟีเจอร์ในแอปเข้าถึงตำแหน่งของอุปกรณ์ในเบื้องหลังเป็นครั้งแรกหลังจากที่ผู้ใช้ให้สิทธิ์เข้าถึงตำแหน่งในเบื้องหลัง ระบบจะกำหนดเวลาส่งการแจ้งเตือนไปยังผู้ใช้ การแจ้งเตือนนี้จะช่วยเตือนผู้ใช้ว่าได้อนุญาตให้แอปเข้าถึงตำแหน่งของอุปกรณ์ตลอดเวลา ตัวอย่างการแจ้งเตือนจะปรากฏในรูปที่ 8
ตรวจสอบข้อกำหนดด้านตำแหน่งในทรัพยากร Dependency ของ SDK ของแอป
ตรวจสอบว่าแอปใช้ SDK ที่ต้องใช้สิทธิ์เข้าถึงตำแหน่ง โดยเฉพาะสิทธิ์ ACCESS_FINE_LOCATION หรือไม่ ดูข้อมูลเพิ่มเติมได้ในบล็อกโพสต์ Getting to know the
behaviors of your SDK dependencies ใน Medium for
more.
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์เข้าถึงตำแหน่งใน Android ได้จากแหล่งข้อมูลต่อไปนี้
Codelab
วิดีโอ
ตัวอย่าง
- แอปตัวอย่าง เพื่อแสดงการใช้สิทธิ์เข้าถึงตำแหน่ง