Bluetooth izinleri

Uygulamanızda Bluetooth özelliklerini kullanmak için birkaç izin beyan etmeniz gerekir. Ayrıca, uygulamanızın Bluetooth klasik veya Bluetooth Düşük Enerji (BDE) desteğine ihtiyaç duyup duymadığını belirtmeniz gerekir. Uygulamanız için klasik Bluetooth veya BLE gerekmiyor ancak bu teknolojilerden yararlanabiliyorsa çalışma zamanında kullanılabilirliği kontrol edebilirsiniz.

İzinleri beyan etme

Uygulamanızda beyan ettiğiniz izin grubu, uygulamanızın hedef SDK sürümüne bağlıdır.

Android 12 veya sonraki sürümleri hedefleme

Not: Android 8.0 (API seviyesi 26) ve sonraki sürümlerde, Companion Device Manager (CDM), bu bölümde açıklanan izinlere kıyasla tamamlayıcı cihazlara bağlanmak için daha basit bir yöntem sunar. CDM sistemi, uygulamanız adına bir eşleme kullanıcı arayüzü sağlar ve konum izinleri gerektirmez.

Eşleme ve bağlantı deneyimi üzerinde daha fazla kontrol sahibi olmak istiyorsanız bu bölümde açıklanan izinleri kullanın.

Bluetooth izinleri iletişim kutusu
Kullanıcıdan yakındaki cihazları keşfetme, reklam gösterme ve bunlara bağlanma için uygulama izni vermesini isteyen sistem izinleri iletişim kutusu.

Uygulamanız Android 12 (API düzeyi 31) veya sonraki sürümleri hedefliyorsa uygulamanızın manifest dosyasında aşağıdaki izinleri beyan edin:

  1. Uygulamanız BLE çevre birimleri gibi Bluetooth cihazlarını arıyorsa BLUETOOTH_SCAN iznini belirtin.
  2. Uygulamanız mevcut cihazı diğer Bluetooth cihazları tarafından bulunabilir hale getiriyor ise BLUETOOTH_ADVERTISE iznini belirtin.
  3. Uygulamanız zaten eşlenmiş Bluetooth cihazlarla iletişim kuruyorsa BLUETOOTH_CONNECT iznini belirtin.
  4. Eski Bluetooth izin beyanlarınız için android:maxSdkVersion değerini 30 olarak ayarlayın. Bu uygulama uyumluluğu adımı, sistemin Android 12 veya sonraki sürümleri çalıştıran cihazlara yüklendiğinde uygulamanıza yalnızca ihtiyaç duyduğu Bluetooth izinlerini vermesine yardımcı olur.
  5. Uygulamanız fiziksel konumu belirlemek için Bluetooth tarama sonuçlarını kullanıyorsa ACCESS_FINE_LOCATION iznini beyan edin. Aksi takdirde, uygulamanızın fiziksel konumu elde etmediğini kesin bir şekilde beyan edebilirsiniz.

BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT ve BLUETOOTH_SCAN izinleri çalışma zamanı izinleridir. Bu nedenle, Bluetooth cihazları arayabilmek, bir cihazı diğer cihazlar tarafından bulunabilir hale getirmek veya önceden eşlenmiş Bluetooth cihazlarıyla iletişim kurabilmek için uygulamanızda açıkça kullanıcı onayı istemeniz gerekir. Uygulamanız bu izinlerden en az birini istediğinde sistem, kullanıcıdan uygulamanızın Yakındaki cihazlar'a erişmesine izin vermesini ister (Şekil 1).

Aşağıdaki kod snippet'inde, Android 12 veya sonraki sürümleri hedefleyen uygulamanızda Bluetooth ile ilgili izinlerin nasıl bildirileceği gösterilmektedir:

<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>

Uygulamanızın fiziksel konumu elde etmediğini kesin bir şekilde beyan edin

Uygulamanız fiziksel konumu belirlemek için Bluetooth tarama sonuçlarını kullanmıyorsa uygulamanızın fiziksel konumu belirlemek için Bluetooth izinlerini hiçbir zaman kullanmadığına dair güçlü bir beyanda bulunabilirsiniz. Bunun için aşağıdaki adımları uygulayın:

  1. BLUETOOTH_SCAN izin beyanınıza android:usesPermissionFlags özelliğini ekleyin ve bu özelliğin değerini neverForLocation olarak ayarlayın.

  2. Uygulamanız için konuma başka bir şekilde ihtiyaç yoksa ACCESS_FINE_LOCATION iznini uygulamanızın manifest dosyasından kaldırın.

Aşağıdaki kod snippet'inde, uygulamanızın manifest dosyasının nasıl güncelleneceği gösterilmektedir:

<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 veya önceki sürümleri hedefleme

Uygulamanız Android 11 (API düzeyi 30) veya daha eski bir sürümü hedefliyorsa uygulamanızın manifest dosyasında aşağıdaki izinleri beyan edin:

  • Bağlantı isteme, bağlantı kabul etme ve veri aktarma gibi Bluetooth klasik veya BDE iletişimi gerçekleştirmek için BLUETOOTH gereklidir.
  • Android 11 ve önceki sürümlerde Bluetooth taraması, kullanıcının konumu hakkında bilgi toplamak için kullanılabileceğinden ACCESS_FINE_LOCATION gereklidir.

Konum izinleri çalışma zamanında istenen izinler olduğundan, manifest dosyanızda beyan etmenin yanı sıra çalışma zamanında bu izinleri istemeniz gerekir.

Yerel Bluetooth cihazlarını keşfetme

Uygulamanızın cihaz keşfini başlatmasını veya Bluetooth ayarlarını değiştirmesini istiyorsanız BLUETOOTH_ADMIN iznine sahip olmanız gerekir. Çoğu uygulamanın bu izne yalnızca yerel Bluetooth cihazlarını keşfedebilmek için ihtiyacı vardır. Uygulama, kullanıcı isteği üzerine Bluetooth ayarlarını değiştiren bir "güç yöneticisi" olmadığı sürece bu izinle verilen diğer özellikleri kullanmayın. İzni uygulamanızın manifest dosyasında beyan edin. Örneğin:

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

Uygulamanız bir hizmeti destekliyorsa ve Android 10 (API düzeyi 29) veya Android 11'de çalışabiliyorsa Bluetooth cihazlarını keşfetme ACCESS_BACKGROUND_LOCATION iznini de belirtmeniz gerekir. Bu şart hakkında daha fazla bilgi için Arka planda konuma erişme bölümüne bakın.

Aşağıdaki kod snippet'inde, ACCESS_BACKGROUND_LOCATION izininin nasıl bildirileceği gösterilmektedir:

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

Uygulama izinlerini bildirme hakkında daha fazla bilgi için <uses-permission> referansına bakın.

Bluetooth özelliğinin kullanımını belirtme

Bluetooth, uygulamanızın kritik bir parçasıysa manifest dosyanıza bu koşulu belirten işaretler ekleyebilirsiniz. <uses-feature> öğesi, uygulamanızın kullandığı donanım türünü ve gerekli olup olmadığını belirtmenize olanak tanır.

Bu örnekte, uygulamanız için Bluetooth Classic'in gerekli olduğunu nasıl belirteceğiniz gösterilmektedir.

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

Uygulamanız Bluetooth Düşük Enerji'yi kullanıyorsa aşağıdakileri kullanabilirsiniz:

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

Bu özelliğin uygulamanız için gerekli olduğunu belirtirseniz Google Play Store, uygulamanızı bu özelliklere sahip olmayan cihazlardaki kullanıcılardan gizler. Bu nedenle, gerekli özelliği yalnızca uygulamanız bu özellik olmadan çalışamıyorsa true olarak ayarlamanız gerekir.

Çalışma zamanında özellik kullanılabilirliğini kontrol etme

Uygulamanızı Bluetooth klasik veya BLE'yi desteklemeyen cihazlarda kullanılabilir hale getirmek için uygulamanızın manifest dosyasına <uses-feature> öğesini eklemeye devam etmeniz gerekir ancak required="false" değerini ayarlayın. Ardından, çalışma zamanında PackageManager.hasSystemFeature() kullanarak özellik kullanılabilirliğini belirleyebilirsiniz:

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);