Aby korzystać z funkcji Bluetooth w aplikacji, musisz zadeklarować kilka . Należy też określić, czy aplikacja wymaga obsługęklasycznego lub Bluetooth Low Energy (BLE). Jeśli Twoja aplikacja nie wymaga klasycznego Bluetootha ani Bluetootha LE, ale może korzystać z tych technologii, możesz sprawdzić ich dostępność w czasie działania.
Deklarowanie uprawnień
Zestaw uprawnień, które zadeklarujesz w aplikacji, zależy od jej ustawień kierowania. Wersja pakietu SDK.
Docelowa wersja Androida 12 lub nowszego
Uwaga: w Androidzie 8.0 (interfejs API na poziomie 26) i nowszych Menedżer urządzeń towarzyszących (CDM) zapewnia bardziej usprawniony sposób łączenia się z urządzeniami towarzyszącymi niż uprawnienia opisane w tej sekcji. System CDM zapewnia interfejs parowania w imieniu aplikacji i nie wymaga dostępu do lokalizacji.
Jeśli chcesz mieć większą kontrolę nad parowaniem i łączeniem, użyj uprawnień opisanych w tej sekcji.
Jeśli Twoja aplikacja jest kierowana na Androida 12 (poziom interfejsu API 31) lub nowszego, zadeklaruj w pliku manifestu aplikacji te uprawnienia:
- Jeśli aplikacja szuka Bluetootha
urządzeń, takich jak
urządzeń peryferyjnych BLE, zadeklaruj
BLUETOOTH_SCAN
. uprawnienia. - Jeśli aplikacja umożliwia wykrycie bieżącego urządzenia dla innych urządzeń Bluetooth
,
zadeklaruj
BLUETOOTH_ADVERTISE
. uprawnienia. - Jeśli aplikacja komunikuje się z urządzeniami Bluetooth, które zostały już sparowane, zadeklaruj uprawnienie
BLUETOOTH_CONNECT
. - W przypadku starszych deklaracji uprawnień dotyczących Bluetootha ustaw
android:maxSdkVersion
do30
. Ten krok dotyczący zgodności z aplikacją pomaga systemowi przyznaj aplikacji tylko te uprawnienia dotyczące Bluetootha, których potrzebuje, na urządzeniach z Androidem 12 lub nowszym. - Jeśli Twoja aplikacja używa wyników skanowania Bluetooth do określania lokalizacji fizycznej, zadeklaruj
ACCESS_FINE_LOCATION
uprawnienia. W przeciwnym razie możesz potwierdzić, że Twoja aplikacja nie uzyskuje dostępu do fizycznej lokalizacji.
Uprawnienia BLUETOOTH_ADVERTISE
, BLUETOOTH_CONNECT
i BLUETOOTH_SCAN
to uprawnienia czasu działania.
Dlatego musisz wyraźnie poprosić użytkownika o
do zatwierdzenia w aplikacji.
urządzeń Bluetooth, ustawić je jako wykrywalne dla innych urządzeń ani się komunikować;
z już sparowanymi urządzeniami Bluetooth. Gdy aplikacja wysyła żądanie co najmniej jednego z tych elementów:
system prosi użytkownika o zezwolenie aplikacji na dostęp
Urządzenia w pobliżu, jak pokazano na ilustracji 1.
Fragment kodu poniżej pokazuje, jak zadeklarować Bluetooth uprawnień w aplikacji, jeśli jest ona kierowana na Androida 12 lub nowszego:
<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>
Potwierdź, że Twoja aplikacja nie określa fizycznej lokalizacji
Jeśli aplikacja nie używa wyników skanowania Bluetooth do określenia lokalizacji fizycznej, może jednoznacznie stwierdzać, że aplikacja nigdy nie używa uprawnień dotyczących Bluetootha określić lokalizację fizyczną. W tym celu wykonaj następujące czynności:
Dodaj atrybut
android:usesPermissionFlags
do polaBLUETOOTH_SCAN
deklaracji uprawnień i ustaw wartość tego atrybutu naneverForLocation
.Jeśli lokalizacja nie jest potrzebna do działania aplikacji, usuń uprawnienie
ACCESS_FINE_LOCATION
z pliku manifestu aplikacji.
Ten fragment kodu pokazuje, jak zaktualizować plik manifestu aplikacji:
<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>
Kieruj na Androida w wersji 11 lub starszej
Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub starszego, zadeklaruj te informacje uprawnienia w pliku manifestu aplikacji:
- Pole
BLUETOOTH
jest wymagane do wykonywania dowolnej komunikacji Bluetooth (klasycznej) lub BLE, np. wysyłania żądania akceptacja połączenia i przesyłanie danych. ACCESS_FINE_LOCATION
jest konieczne, ponieważ na Androidzie 11 i starszych wersjach skanowanie przez Bluetooth mogłyby zostać użyte do zebrania informacji o lokalizacji użytkownika.
Uprawnienia do lokalizacji to uprawnienia czasu działania, musisz poprosić o te uprawnienia w czasie działania z deklaracją w pliku manifestu.
Wykrywanie lokalnych urządzeń Bluetooth
Jeśli chcesz, aby aplikacja inicjowała wykrywanie urządzenia lub wykorzystywała Bluetooth
musisz zadeklarować
BLUETOOTH_ADMIN
uprawnienia. Większość aplikacji potrzebuje tego uprawnienia wyłącznie po to, aby wykrywać
lokalnych urządzeń Bluetooth. Nie używaj innych umiejętności zapewnianych przez tę funkcję
chyba że aplikacja jest „menedżerem zasilania” która zmienia ustawienia Bluetootha
na żądanie użytkownika. Zadeklaruj uprawnienia w pliku manifestu aplikacji. Dla:
przykład:
<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>
Jeśli aplikacja obsługuje usługę i może działać na Androidzie 10 (poziom interfejsu API 29) lub
Androida 11, musisz również zadeklarować
ACCESS_BACKGROUND_LOCATION
do wykrywania urządzeń Bluetooth. Więcej informacji na ten temat
Więcej informacji znajdziesz w sekcji Lokalizacja dostępu do
.
Ten fragment kodu pokazuje, jak zadeklarować ACCESS_BACKGROUND_LOCATION
uprawnienie:
<manifest>
...
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
...
</manifest>
Więcej informacji o deklarowaniu uprawnień aplikacji znajdziesz w dokumentacji <uses-permission>
.
Określanie użycia funkcji Bluetooth
Jeśli Bluetooth jest kluczowym elementem Twojej aplikacji, możesz dodać flagi do pliku manifestu
wskazujący to wymaganie.
Element <uses-feature>
zezwala
określ typ sprzętu używanego przez aplikację oraz to, czy
Ten przykład pokazuje, jak wskazać, że klasyczny Bluetooth jest wymagany na urządzeniu .
<uses-feature android:name="android.hardware.bluetooth" android:required="true"/>
Jeśli Twoja aplikacja korzysta z Bluetooth Low Energy, możesz użyć tych funkcji:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
Jeśli oświadczysz, że dana funkcja jest wymagana w Twojej aplikacji, Sklep Google Play ukryje ją przed użytkownikami na urządzeniach, które nie mają tych funkcji. Z tego powodu
należy ustawiać wymagany atrybut na true
tylko wtedy, gdy aplikacja nie będzie działać
do danej funkcji.
Sprawdzanie dostępności funkcji w czasie działania
Aby udostępnić aplikację na urządzeniach, które nie obsługują klasycznego Bluetootha lub
BLE, nadal musisz umieścić element <uses-feature>
w tagu
pliku manifestu, ale ustaw required="false"
. Następnie w czasie działania możesz określić,
dostępności funkcji przy użyciu
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);