Bluetooth izinleri

Uygulamanızda Bluetooth özelliklerini kullanmak için çeşitli izin beyan etmeniz gerekir. Ayrıca, uygulamanızın Bluetooth klasik veya Bluetooth Düşük Enerji (BDE) için destek gerektirip gerektirmediğini de belirtmeniz gerekir. Uygulamanız Bluetooth klasik veya BDE gerektirmiyorsa ancak yine de bu teknolojilerden yararlanabiliyorsa çalışma zamanında kullanılabilir olup olmadığını kontrol edebilirsiniz.

İzinleri beyan et

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 hedefleyin

Not: Android 8.0 (API düzeyi 26) ve sonraki sürümlerde, Companion Device Manager (CDM), bu bölümde açıklanan izinlerle karşılaştırıldığında tamamlayıcı cihazlara bağlanmak için daha kolay bir yöntem sağlar. 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
Sistem izinleri iletişim kutusu, kullanıcıdan yakındaki cihazları keşfetmesi, reklamını yapması ve bu cihazlara bağlanması için uygulamaya izin vermesi isteniyor.

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ı arıyorsa BLUETOOTH_SCAN iznini beyan edin.
  2. Uygulamanız, mevcut cihazı diğer Bluetooth cihazlar tarafından bulunabilir hale getiriyorsa BLUETOOTH_ADVERTISE iznini beyan edin.
  3. Uygulamanız zaten eşlenmiş Bluetooth cihazlarla iletişim kuruyorsa BLUETOOTH_CONNECT iznini beyan edin.
  4. Bluetooth ile ilgili eski izin beyanlarınız için android:maxSdkVersion değerini 30 olarak ayarlayın. Bu uygulama uyumluluğu adımı, sistemin uygulamanıza yalnızca Android 12 veya sonraki sürümleri çalıştıran cihazlara yüklendiğinde ihtiyacı olan Bluetooth izinlerini vermesine yardımcı olur.
  5. Uygulamanız, fiziksel konum elde etmek için Bluetooth tarama sonuçlarını kullanıyorsa ACCESS_FINE_LOCATION iznini beyan edin. Aksi takdirde, uygulamanızın fiziksel konum bilgisi üretmediğini kesin bir şekilde iddia edebilirsiniz.

BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT ve BLUETOOTH_SCAN izinleri çalışma zamanı izinleridir. Bu nedenle, Bluetooth cihazları aramak, bir cihazı diğer cihazlar tarafından bulunabilir hale getirmek veya önceden eşlenmiş Bluetooth cihazlarla iletişim kurmak için önce uygulamanızda kullanıcı onayı 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 cihazlar'a erişmesine izin vermesini ister.

Aşağıdaki kod snippet'i, Android 12 veya sonraki bir sürümü hedefleyen uygulamanızda Bluetooth ile ilgili izinleri nasıl beyan edeceğinizi 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>

Kesinlikle uygulamanızın fiziksel konum bilgisi elde etmediğini iddia edin

Uygulamanız, fiziksel konum belirlemek için Bluetooth tarama sonuçlarını kullanmıyorsa uygulamanızın fiziksel konum 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. BLUETOOTH_SCAN izni beyanınıza android:usesPermissionFlags özelliğini ekleyip bu özelliğin değerini neverForLocation olarak ayarlayın.

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

Aşağıdaki kod snippet'inde uygulamanızın manifest dosyasını nasıl güncelleyeceğiniz 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 hedefleyin

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

  • BLUETOOTH; bağlantı isteğinde bulunma, bağlantıyı kabul etme ve veri aktarma gibi herhangi bir Bluetooth klasik veya BDE iletişimini gerçekleştirmek için gereklidir.
  • ACCESS_FINE_LOCATION gereklidir, çünkü Android 11 ve önceki sürümlerde kullanıcının konumu hakkında bilgi toplamak için Bluetooth taraması kullanılabilir.

Konum izinleri çalışma zamanı izinleri olduğundan, bunları manifest dosyanızda beyan etmenizin yanı sıra çalışma zamanında 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 izne yalnızca yerel Bluetooth cihazları keşfedebilmek için ihtiyaç duyar. 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. Uygulama manifest dosyanızda izni 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 gereksinim hakkında daha fazla bilgi için Arka planda konuma erişme konusuna bakın.

Aşağıdaki kod snippet'inde ACCESS_BACKGROUND_LOCATION izninin nasıl beyan edileceğ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ği 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 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"/>

Özelliğin uygulamanız için gerekli olduğunu söylerseniz Google Play Store, bu özelliklere sahip olmayan cihazlardaki kullanıcılardan uygulamanızı gizler. Bu nedenle, gerekli özelliği yalnızca uygulamanız bu özellik olmadan çalışamazsa true olarak ayarlamalısınız.

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

Uygulamanızı Bluetooth klasik veya BDE'yi desteklemeyen cihazlarda kullanılabilmesi için uygulamanızın manifest dosyasına <uses-feature> öğesini yine de dahil etmeniz, ancak required="false" değerini ayarlamanız gerekir. Ardından, çalışma zamanında, PackageManager.hasSystemFeature() aracılığıyla özelliklerin 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);