Bluetooth を利用するためのパーミッション設定
ここでは Android で Bluetooth を利用したアプリケーションを開発するときに必要となるパーミッションの設定について説明します。
念のため断っておくと、ここで利用している API は クラシック Bluetooth です。
Bluetooth 4.0 (Bluetooth LE) についても同様の権限になるようですが、今後枝分かれしていく可能性も十分あるのでご注意ください。
さて、Bluetooth を利用するときには、第一に android.permission.BLUETOOTH が必要です。
デバイスの発見 (discovery) を行うときには、BLUETOOTH のみではなく、BLUETOOTH_ADMIN 権限も必要となります。
さらに、Android 6.0 以降では発見の際に ACCESS_FINE_LOCATION または ACCESS_COARSE_LOCATION を必要とします。
以上をまとめると、次の三つを設定しておくとよいでしょう。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.keicode.iot.testapps.bttest1">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
...
</manifest>
Android Studio で AndroidManifest.xml を編集する時には、次の場所からアクセスできます。
画面左上をクリックし、Project を選択します。
Project 以下のツリーから AndroidManifest.xml にいけます。
ここでパーミッションを設定します。
Android 6.0 以降で発見を行うときに ACCESS_FINE_LOCATION または ACCESS_COARSE_LOCATION が必要になるわけですが、 インストール後既定で許可されていないので、App Info から明示的に許可します。
Permissions を選択します。
既定で許可されないのでこれを許可にします。
実行時に許可されているかどうかチェックするには次のようにします。
if (ContextCompat.checkSelfPermission(
MainActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
...
return;
}
Android 7.1.1 (NPF10C) で試したところ特にエラーも例外も発生せずに startDiscovery メソッドが何もしない、 という動作になりました。動作しない原因がちょっと分かりにくいので、Log.d などでトレースを出力しておくとよいです。