android bluetoothLEの通信に必要なpermissionの種類01

 


android のアプリ作成のうちbluetootheの権限についてお尋ねします。


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {


    val permissions = arrayOf(

        Manifest.permission.BLUETOOTH_SCAN,

        Manifest.permission.BLUETOOTH_CONNECT,

        Manifest.permission.ACCESS_FINE_LOCATION

    )

    ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE)


} else {


    val permissions = arrayOf(

        Manifest.permission.ACCESS_FINE_LOCATION

    )


    ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE)


}



api levelが30のデバイスでは上記のコードを実行して

bluetoothの権限を取得する必要があるのでしょうか?



そして、上記のコードだと、Booleanのような値を保持していないと思うのですが、


アプリのユーザーが権限を付与しなかった場合は

どのようになるのでしょうか?





Android アプリで Bluetooth の権限を取得する際に、

API レベルに応じて必要な権限が異なります。


以下にそれぞれの疑問について詳しく説明します。


---


### **1. API レベル30 (Android 11) での権限**


API レベル30(Android 11)では、

Bluetooth のスキャンや接続に関して `ACCESS_FINE_LOCATION` 権限が必要です。

この権限は、Bluetooth デバイスをスキャンする際に

位置情報が漏洩する可能性があるために求められています。


しかし、API レベル31 (Android 12) 以降では、

Bluetooth 関連の新しい権限が導入されています:


- `BLUETOOTH_SCAN`


- `BLUETOOTH_CONNECT`


API レベル30のデバイスでは、`BLUETOOTH_SCAN` や 

`BLUETOOTH_CONNECT` は存在しないため、

指定しても無効です。


そのため、API レベル30では `ACCESS_FINE_LOCATION` のみが必要です。



**結論:**


上記コードで API レベル30 のデバイスに対して正しく対応しています。

`Manifest.permission.BLUETOOTH_SCAN` などをリクエストしても

問題ありませんが、


付与されるのは `ACCESS_FINE_LOCATION` のみです。



---


### **2. ユーザーが権限を付与しなかった場合**


`ActivityCompat.requestPermissions()` を呼び出すと、

ユーザーの選択に応じて以下のコールバックが呼ばれます。



#### **コールバックの実装**


```kotlin


override fun onRequestPermissionsResult(


    requestCode: Int,

    permissions: Array<String>,

    grantResults: IntArray

) {


    if (requestCode == REQUEST_CODE) {

        for (i in permissions.indices) {

            when (grantResults[i]) {

                PackageManager.PERMISSION_GRANTED -> {

                    Log.d("Permissions", "${permissions[i]} was granted.")

                }

                PackageManager.PERMISSION_DENIED -> {

                    Log.d("Permissions", "${permissions[i]} was denied.")

                }

            }

        }

    }

}


```



このコールバックを利用することで、

ユーザーが権限を付与したかどうかを確認できます。



#### **権限が付与されなかった場合の動作**


1. ユーザーが権限を拒否すると、

`PackageManager.PERMISSION_DENIED` が返されます。



2. 権限がない状態で Bluetooth を利用しようとすると、

アプリが正しく動作しない可能性があります(例: デバイススキャンが失敗する)。

++


3. 必要であれば、拒否された場合に

再リクエストや説明を表示するダイアログを実装できます。


---


### **3. 追加の例: 権限が付与されたか確認する**


権限が現在許可されているかを確認するには、

`ContextCompat.checkSelfPermission()` を使用します。



```kotlin



val isFineLocationGranted =


    ContextCompat.checkSelfPermission(this, 

Manifest.permission.ACCESS_FINE_LOCATION) ==

    PackageManager.PERMISSION_GRANTED


val isBluetoothScanGranted =


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {

        ContextCompat.checkSelfPermission(this,

Manifest.permission.BLUETOOTH_SCAN) ==

        PackageManager.PERMISSION_GRANTED

    } else {

        true // API レベル30以下では常に true

    }


if (isFineLocationGranted && isBluetoothScanGranted) {

    // 権限がすべて付与されている場合の処理

} else {

    // 権限をリクエストする

    ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE)

}



```


---


### **補足: 最善の実装**


1. ユーザーに説明を加える:


   - 権限が必要な理由を説明する画面を追加する(例えば `AlertDialog`)。

   

   

2. 必要最低限の権限だけをリクエストする:

   - Bluetooth スキャンや接続をしない場合、余分な権限をリクエストしない。

   

   

3. 許可されていない場合の代替案を提示:


   - 「権限が付与されないと Bluetooth を利用できません」といったメッセージを表示。

   


これにより、ユーザーエクスペリエンスが向上します。


コメント