สิทธิ์การใช้บลูทูธ

หากต้องการใช้ฟีเจอร์บลูทูธในแอป คุณต้องประกาศสิ่งต่อไปนี้ สิทธิ์ นอกจากนี้คุณควรระบุว่าแอปต้องใช้หรือไม่ รองรับสำหรับบลูทูธแบบคลาสสิกหรือบลูทูธพลังงานต่ำ (BLE) หาก แอปไม่ต้องใช้บลูทูธแบบคลาสสิกหรือ BLE แต่ยังได้รับประโยชน์จากฟีเจอร์เหล่านี้ คุณสามารถตรวจสอบความพร้อมใช้งานขณะรันไทม์

ประกาศสิทธิ์

ชุดของสิทธิ์ที่คุณประกาศในแอปจะขึ้นอยู่กับเป้าหมายของแอป เวอร์ชันของ SDK

กำหนดเป้าหมายเป็น Android 12 ขึ้นไป

หมายเหตุ: ใน Android 8.0 (API ระดับ 26) ขึ้นไป ค่า โฆษณาที่แสดงร่วมกัน โปรแกรมจัดการอุปกรณ์ (CDM) มอบวิธีที่มีประสิทธิภาพยิ่งขึ้นในการเชื่อมต่อกับ อุปกรณ์ที่ใช้ร่วมกัน เทียบกับสิทธิ์ที่อธิบายไว้ในส่วนนี้ ระบบ CDM มี UI การจับคู่ในนามของแอปและคุณไม่ต้อง สิทธิ์เข้าถึงตำแหน่ง

หากต้องการควบคุมการจับคู่และการเชื่อมต่อได้มากขึ้น ให้ใช้ สิทธิ์ที่อธิบายในส่วนนี้

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

หากแอปกำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป ให้ประกาศสิ่งต่อไปนี้ สิทธิ์ในไฟล์ Manifest ของแอป

  1. หากแอปของคุณมองหาบลูทูธ อุปกรณ์ เช่น อุปกรณ์ต่อพ่วง BLE ให้ประกาศ BLUETOOTH_SCAN สิทธิ์
  2. หากแอปทำให้บลูทูธอื่นค้นพบอุปกรณ์ปัจจุบันได้ อุปกรณ์ ประกาศ BLUETOOTH_ADVERTISE สิทธิ์
  3. หากแอปสื่อสารกับบลูทูธที่จับคู่ไว้แล้ว อุปกรณ์ โปรดประกาศ BLUETOOTH_CONNECT สิทธิ์
  4. สำหรับการประกาศสิทธิ์ที่เกี่ยวข้องกับบลูทูธแบบเดิม ให้ตั้งค่า android:maxSdkVersion ไปยัง 30 ขั้นตอนความเข้ากันได้ของแอปนี้จะช่วยให้ระบบ ให้สิทธิ์แอปเข้าถึงบลูทูธที่จำเป็นต้องใช้เมื่อติดตั้งเท่านั้น อุปกรณ์ที่ใช้ Android 12 ขึ้นไป
  5. หากแอปใช้ผลการสแกนหาบลูทูธเพื่อค้นหาตำแหน่งจริง ให้ประกาศ เวลา ACCESS_FINE_LOCATION สิทธิ์ ไม่เช่นนั้น ให้ยืนยันอย่างหนักแน่นว่าแอปของคุณไม่ได้มาจากแหล่งที่มา สถานที่ตั้งจริง

สิทธิ์ BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT และ BLUETOOTH_SCAN คือสิทธิ์รันไทม์ ดังนั้น คุณต้องขอสิทธิ์จากผู้ใช้ การอนุมัติในแอปก่อนที่จะค้นหา อุปกรณ์บลูทูธ ทำให้อุปกรณ์อื่นค้นพบอุปกรณ์ได้ หรือสื่อสาร กับอุปกรณ์บลูทูธที่จับคู่แล้ว เมื่อแอปขออย่างน้อย 1 รายการ สิทธิ์เหล่านี้แล้ว ระบบจะแจ้งให้ผู้ใช้อนุญาตให้แอปของคุณเข้าถึง อุปกรณ์ที่อยู่ใกล้เคียงดังที่แสดงในรูปที่ 1

ข้อมูลโค้ดต่อไปนี้แสดงวิธีประกาศเกี่ยวกับบลูทูธ สิทธิ์ในแอปหากแอปกำหนดเป้าหมายเป็น Android 12 ขึ้นไป

<manifest>
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH"
                     android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                     android:maxSdkVersion="30" />

    <!-- Needed only if your app looks for Bluetooth devices.
         If your app doesn't use Bluetooth scan results to derive physical
         location information, you can
         <a href="#assert-never-for-location">strongly assert that your app
         doesn't derive physical location</a>. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

    <!-- Needed only if your app makes the device discoverable to Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />

    <!-- Needed only if your app communicates with already-paired Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- Needed only if your app uses Bluetooth scan results to derive physical location. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

ยืนยันอย่างหนักแน่นว่าแอปของคุณไม่ได้มาจากตำแหน่งที่ตั้งจริง

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

  1. เพิ่มแอตทริบิวต์ android:usesPermissionFlags ลงใน BLUETOOTH_SCAN การประกาศสิทธิ์ และตั้งค่าของแอตทริบิวต์นี้เป็น neverForLocation

  2. หากไม่จำเป็นต้องใช้ตำแหน่งสำหรับแอป ให้นำ ACCESS_FINE_LOCATION จากไฟล์ Manifest ของแอป

ข้อมูลโค้ดต่อไปนี้แสดงวิธีอัปเดตไฟล์ Manifest ของแอป

<manifest>
    <!-- Include "neverForLocation" only if you can strongly assert that
         your app never derives physical location from Bluetooth scan results. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                     android:usesPermissionFlags="neverForLocation" />

    <!-- Not needed if you can strongly assert that your app never derives
         physical location from Bluetooth scan results and doesn't need location
         access for any other purpose. -->
    <strike><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /></strike>
    ...
</manifest>

กำหนดเป้าหมายเป็น Android 11 หรือต่ำกว่า

หากแอปกำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) หรือต่ำกว่า ให้ประกาศสิ่งต่อไปนี้ สิทธิ์ในไฟล์ Manifest ของแอป

  • ต้องมี BLUETOOTH เพื่อสื่อสารด้วยบลูทูธแบบคลาสสิกหรือ BLE เช่นการส่งคำขอ การเชื่อมต่อ การยอมรับการเชื่อมต่อ และการโอนข้อมูล
  • ACCESS_FINE_LOCATION ใน Android 11 และต่ำกว่า การสแกนหาบลูทูธ เพื่อรวบรวมข้อมูลเกี่ยวกับตำแหน่งของ ผู้ใช้

เนื่องจากสิทธิ์เข้าถึงตำแหน่งเป็นสิทธิ์รันไทม์ คุณต้องขอสิทธิ์เหล่านี้ระหว่างรันไทม์ พร้อมทั้งประกาศไว้ในไฟล์ Manifest

สำรวจอุปกรณ์บลูทูธในพื้นที่

หากต้องการให้แอปเริ่มการค้นหาอุปกรณ์หรือจัดการบลูทูธ คุณต้องประกาศ BLUETOOTH_ADMIN สิทธิ์ แอปส่วนใหญ่ต้องการสิทธิ์นี้เพื่อให้สามารถสำรวจ อุปกรณ์บลูทูธที่อยู่ใกล้ๆ อย่าใช้ความสามารถอื่นๆ ที่ได้รับจากการดำเนินการนี้ ยกเว้นกรณีที่แอปนั้นเป็น "Power Manager" ที่แก้ไขการตั้งค่าบลูทูธ ตามคำขอของผู้ใช้ ประกาศสิทธิ์ในไฟล์ Manifest ของแอป สำหรับ ตัวอย่าง:

<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>

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

ข้อมูลโค้ดต่อไปนี้แสดงวิธีประกาศ ACCESS_BACKGROUND_LOCATION สิทธิ์:

<manifest>
...
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
...
</manifest>

โปรดดู<uses-permission> ข้อมูลอ้างอิงเกี่ยวกับการประกาศสิทธิ์ของแอป

ระบุการใช้ฟีเจอร์บลูทูธ

หากบลูทูธเป็นส่วนสำคัญของแอป คุณสามารถเพิ่ม Flag ในไฟล์ Manifest ได้ ซึ่งระบุข้อกำหนดนี้ องค์ประกอบ <uses-feature> ช่วยให้ คุณจะระบุประเภทฮาร์ดแวร์ที่แอปใช้และระบุว่า ต้องระบุ

ตัวอย่างนี้แสดงวิธีระบุว่าต้องใช้บลูทูธแบบคลาสสิกสำหรับ แอป

<uses-feature android:name="android.hardware.bluetooth" android:required="true"/>

หากแอปต้องใช้บลูทูธพลังงานต่ำ คุณจะใช้สิ่งต่อไปนี้ได้

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

หากคุณระบุว่าต้องใช้ฟีเจอร์นี้สำหรับแอปของคุณ Google Play Store จะ ซ่อนแอปของคุณจากผู้ใช้ในอุปกรณ์ที่ไม่มีฟีเจอร์ดังกล่าว ด้วยเหตุนี้ คุณ ควรตั้งค่าแอตทริบิวต์ที่จำเป็นเป็น true เฉพาะกรณีที่แอปของคุณจะทำงานไม่ได้หากไม่มี กับคุณลักษณะ

ตรวจสอบความพร้อมใช้งานของฟีเจอร์ขณะรันไทม์

เพื่อให้แอปใช้ได้กับอุปกรณ์ที่ไม่รองรับบลูทูธแบบคลาสสิก หรือ BLE คุณควรรวมเอลิเมนต์ <uses-feature> ในแอป ไฟล์ Manifest แต่ตั้งค่า required="false" จากนั้น ขณะรันไทม์ คุณสามารถระบุ ความพร้อมใช้งานของฟีเจอร์โดยใช้ PackageManager.hasSystemFeature():

Kotlin

// Check to see if the Bluetooth classic feature is available.
val bluetoothAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)

// Check to see if the BLE feature is available.
val bluetoothLEAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)

Java

// Use this check to determine whether Bluetooth classic is supported on the device.
// Then you can selectively disable BLE-related features.
boolean bluetoothAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);

// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
boolean bluetoothLEAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);