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

แอปที่ใช้บริการตำแหน่งต้องขอสิทธิ์เข้าถึงตำแหน่งเพื่อปกป้องความเป็นส่วนตัวของผู้ใช้

สิทธิ์หลายรายการเกี่ยวข้องกับตำแหน่ง สิทธิ์ที่คุณขอและวิธีขอสิทธิ์จะขึ้นอยู่กับข้อกำหนดตำแหน่งสำหรับ Use Case ของแอป

หน้านี้จะอธิบายข้อกำหนดด้านตำแหน่งประเภทต่างๆ และอธิบายวิธีขอสิทธิ์เข้าถึงตำแหน่งในแต่ละกรณี

หากต้องการขอสิทธิ์เข้าถึงตำแหน่ง ให้ทําตามแนวทางปฏิบัติแนะนําสําหรับสิทธิ์รันไทม์ทั้งหมด

ประเภทการเข้าถึงตำแหน่ง

สิทธิ์แต่ละรายการมีลักษณะต่อไปนี้รวมกัน

ตำแหน่งเบื้องหน้า

หากแอปมีฟีเจอร์ที่แชร์หรือรับข้อมูลตำแหน่งเพียงครั้งเดียวหรือเป็นระยะเวลาที่กําหนดไว้ ฟีเจอร์นั้นจะต้องเข้าถึงตําแหน่งในเบื้องหน้า ตัวอย่างบางส่วนมีดังนี้

  • ฟีเจอร์ภายในแอปการนำทางช่วยให้ผู้ใช้ขอเส้นทางแบบเลี้ยวต่อเลี้ยวได้
  • ฟีเจอร์ในแอปการรับส่งข้อความช่วยให้ผู้ใช้แชร์ตำแหน่งปัจจุบันกับผู้ใช้รายอื่นได้

ระบบจะถือว่าแอปของคุณใช้ตำแหน่งในเบื้องหน้าหากฟีเจอร์ของแอปเข้าถึงตำแหน่งปัจจุบันของอุปกรณ์ในสถานการณ์ใดสถานการณ์หนึ่งต่อไปนี้

  • กิจกรรมที่เป็นของแอปจะปรากฏขึ้น
  • แอปของคุณกำลังใช้บริการที่ทำงานอยู่เบื้องหน้า เมื่อบริการที่ทำงานอยู่เบื้องหน้าทำงานอยู่ ระบบจะแจ้งให้ผู้ใช้ทราบด้วยการแสดงการแจ้งเตือนแบบถาวร แอปจะยังคงมีสิทธิ์เข้าถึงเมื่อทำงานอยู่เบื้องหลัง เช่น เมื่อผู้ใช้กดปุ่มหน้าแรกบนอุปกรณ์หรือปิดจอแสดงผลของอุปกรณ์

    นอกจากนี้ คุณควรประกาศประเภทบริการที่ทำงานอยู่เบื้องหน้าเป็น 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>

ตำแหน่งในเบื้องหลัง

แอปต้องใช้สิทธิ์เข้าถึงตำแหน่งในเบื้องหลังหากฟีเจอร์ภายในแอปแชร์ตำแหน่งกับผู้ใช้รายอื่นอย่างต่อเนื่องหรือใช้ 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

วิดีโอ

ตัวอย่าง