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

หากต้องการใช้ฟีเจอร์บลูทูธในแอป คุณต้องประกาศสิ่งต่อไปนี้ สิทธิ์ นอกจากนี้คุณควรระบุว่าแอปต้องใช้หรือไม่ รองรับสำหรับบลูทูธแบบคลาสสิกหรือบลูทูธพลังงานต่ำ (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 สิทธิ์ แอปส่วนใหญ่ต้องการสิทธิ์นี้เพื่อให้สามารถสำรวจ อุปกรณ์บลูทูธที่อยู่ใกล้ๆ อย่าใช้ความสามารถอื่นๆ ที่สิทธิ์นี้ให้ไว้ เว้นแต่แอปจะเป็น "เครื่องมือจัดการพลังงาน" ที่แก้ไขการตั้งค่าบลูทูธตามคำขอของผู้ใช้ ประกาศสิทธิ์ในไฟล์ 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);