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

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

สิทธิ์หลายอย่างเกี่ยวข้องกับตำแหน่ง สิทธิ์ที่คุณขอ และวิธีขอสิทธิ์ จะขึ้นอยู่กับข้อกำหนดด้านตำแหน่งสำหรับ 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 permission

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

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

การช่วยเตือนเกี่ยวกับการให้สิทธิ์เข้าถึงตำแหน่งในเบื้องหลัง

ใน Android 10 (API ระดับ 29) ขึ้นไป เมื่อฟีเจอร์ในแอปเข้าถึงตำแหน่งของอุปกรณ์ในเบื้องหลังเป็นครั้งแรกหลังจากที่ผู้ใช้ให้สิทธิ์เข้าถึงตำแหน่งในเบื้องหลัง ระบบจะกำหนดเวลาการแจ้งเตือนเพื่อส่งไปยังผู้ใช้ การแจ้งเตือนนี้จะเตือนผู้ใช้ว่าได้อนุญาตให้แอปของคุณเข้าถึง ตำแหน่งของอุปกรณ์ตลอดเวลา ตัวอย่างการแจ้งเตือนจะปรากฏในรูปที่ 8

ตรวจสอบข้อกำหนดด้านตำแหน่งในการอ้างอิง SDK ของแอป

ตรวจสอบว่าแอปใช้ SDK ที่ต้องอาศัยสิทธิ์เข้าถึงตำแหน่งหรือไม่ โดยเฉพาะสิทธิ์ ACCESS_FINE_LOCATION อ่านข้อมูลเพิ่มเติมได้ในบล็อกโพสต์ทำความรู้จัก ลักษณะการทำงานของทรัพยากร Dependency ของ SDK บน Medium

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์เข้าถึงตำแหน่งใน Android ได้ที่สื่อต่อไปนี้

Codelabs

วิดีโอ

ตัวอย่าง