ขอสิทธิ์เข้าถึงตำแหน่ง

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

วิดีโอ

ตัวอย่าง