Bluetooth izinleri

Uygulamanızda Bluetooth özelliklerini kullanmak için çeşitli izinler bildirmeniz gerekir. Ayrıca, uygulamanızın Bluetooth Classic veya Bluetooth Düşük Enerji (BLE) desteği gerektirip gerektirmediğini de belirtmeniz gerekir. Uygulamanızın Bluetooth Classic veya BLE gerektirmemesine rağmen bu teknolojilerden yararlanabiliyorsa çalışma zamanında kullanılabilirliği kontrol edebilirsiniz.

İzinleri beyan etme

Uygulamanızda beyan ettiğiniz izinler, 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 düzeyi 26) ve sonraki sürümlerde Yardımcı Cihaz Yöneticisi (CDM), bu bölümde açıklanan izinlere kıyasla yardımcı cihazlara bağlanmak için daha kolay bir yöntem sunar. CDM sistemi, uygulamanız adına eşleme kullanıcı arayüzü sağlar ve konum izni 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şfetmek, reklamını yapmak ve bu cihazlara bağlanmak için bir uygulamaya izin vermesini isteyen sistem izinleri iletişim kutusu.

Uygulamanız Android 12'yi (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 Bluetooth cihazları arıyorsa (ör. BLE çevre birimleri) BLUETOOTH_SCAN iznini bildirin.
  2. Uygulamanız mevcut cihazı diğer Bluetooth cihazları tarafından keşfedilebilir hale getiriyorsa, BLUETOOTH_ADVERTISE iznini beyan edin.
  3. Uygulamanız önceden eşlenmiş Bluetooth cihazlarla iletişim kuruyorsa BLUETOOTH_CONNECT iznini bildirin.
  4. Eski Bluetooth ile ilgili 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ümlerin yüklü olduğu cihazlara yüklenen uygulamanıza yalnızca ihtiyaç duyduğu Bluetooth izinlerini vermesine yardımcı olur.
  5. Uygulamanız fiziksel konumu elde etmek için Bluetooth tarama sonuçlarını kullanıyorsa ACCESS_FINE_LOCATION iznini beyan edin. Aksi takdirde, uygulamanızın fiziksel konum elde etmediğini kesin bir şekilde beyan edebilir ve android:maxSdkVersion izin için ACCESS_FINE_LOCATION değerini 30 olarak ayarlayabilirsiniz.

BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT ve BLUETOOTH_SCAN izinleri çalışma zamanı izinleridir. Bu nedenle, Bluetooth cihazları aramadan, bir cihazı diğer cihazlar tarafından bulunabilir hale getirmeden veya halihazırda eşlenmiş Bluetooth cihazlarla iletişim kurmadan önce uygulamanızda kullanıcı onayını açıkça istemeniz gerekir. Uygulamanız bu izinlerden en az birini istediğinde sistem, kullanıcıdan Şekil 1'de gösterildiği gibi uygulamanızın yakındaki cihazlara erişmesine izin vermesini ister.

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

<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 konum elde etmediğini net bir şekilde belirtin.

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

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

  2. Uygulamanızın başka bir amaçla konuma ihtiyacı 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" />

    <!-- Set maxSdkVersion to 30 if you can strongly assert that, on
         Android 12 and higher, your app never derives physical location from
         Bluetooth scan results and doesn't need location access for any other
         purpose. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="30" />
    ...
</manifest>

Android 11 veya önceki sürümleri hedefleme

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

  • Bağlantı isteğinde bulunma, bağlantıyı kabul etme ve veri aktarma gibi klasik Bluetooth veya BLE iletişimi gerçekleştirmek için BLUETOOTH gereklidir.
  • ACCESS_FINE_LOCATION Android 11 ve önceki sürümlerde Bluetooth taraması, kullanıcının konumuyla ilgili bilgi toplamak için kullanılabileceğinden gereklidir.

Konum izinleri çalışma zamanı izinleri olduğundan, bunları manifestinizde beyan etmenin yanı sıra çalışma zamanında da istemeniz gerekir.

Yerel Bluetooth cihazları keşfetme

Uygulamanızın cihaz keşfini başlatmasını veya Bluetooth ayarlarını değiştirmesini istiyorsanız BLUETOOTH_ADMIN iznini beyan etmeniz gerekir. Çoğu uygulama bu izni yalnızca yerel Bluetooth cihazları keşfedebilmek için ister. Uygulama, kullanıcı isteği üzerine Bluetooth ayarlarını değiştiren bir "güç yöneticisi" olmadığı sürece bu izinle verilen diğer yetkileri kullanmayın. İzni uygulama manifest dosyanızda 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ı keşfetmek için ACCESS_BACKGROUND_LOCATION iznini de beyan etmeniz gerekir. Bu şart hakkında daha fazla bilgi için Arka planda konuma erişme başlıklı makaleyi inceleyin.

Aşağıdaki kod snippet'inde ACCESS_BACKGROUND_LOCATION izninin 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 önemli bir parçasıysa manifest dosyanıza bu gereksinimi belirten işaretler ekleyebilirsiniz. <uses-feature> öğesi, uygulamanızın kullandığı donanım türünü ve bunun 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'ye dayanıyorsa aşağıdakileri kullanabilirsiniz:

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

Uygulamanız için özelliğin gerekli olduğunu belirtirseniz Google Play Store, bu özelliklerin bulunmadığı cihazlardaki kullanıcılardan uygulamanızı gizler. Bu nedenle, uygulamanız bu özellik olmadan çalışamıyorsa gerekli özelliği yalnızca true olarak ayarlamalısınız.

Çalışma zamanında özelliklerin kullanılabilirlik durumunu kontrol etme

Uygulamanızı Bluetooth Classic veya BLE'yi desteklemeyen cihazlarda kullanılabilir hale getirmek için uygulamanızın manifest dosyasına <uses-feature> öğesini eklemeye devam etmeniz ancak required="false" değerini ayarlamanız gerekir. 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);