やりたいこと
- Android端末でBluetoothをON/OFFしたときの切り替えを常に検知する
- 初回起動時等ではなく、常に検知したい
- BluetoothがONになったときhogeメソッドを呼び出す
- BluetoothがOFFになったときfooメソッドを呼び出す
サンプルプロジェクト
https://github.com/ry0takaha4/android-bluetooth-on-off-sample-app
環境
- Android 5.0
前提
- AndroidManifest.xmlで以下のBluetoothに関するPermissionを設定している
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
どうやるか
リスナーを定義する
// MainActivity.java
/**
* Bluetooth接続検知リスナー
* 本体のBluetooth機能をオン・オフするたびに呼ばれる
*/
private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
System.out.println("BluetoothがONになりました。");
hoge();
if (profile == BluetoothProfile.HEADSET) {
mBluetoothHeadset = proxy;
}
}
public void onServiceDisconnected(int profile) {
System.out.println("BluetoothがOFFになりました。");
foo();
if (profile == BluetoothProfile.HEADSET) {
mBluetoothHeadset = null;
}
}
};
proxyの登録、解除処理を行う
// MainActivity.java
private BluetoothAdapter mBluetoothAdapter;
private BluetoothProfile mBluetoothHeadset;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Bluetooth 有効チェック
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter != null) {
// 今回はBluetoothProfile.HEADSETだが、検知するだけであればなんでも良い
mBluetoothAdapter.getProfileProxy(this, mProfileListener, BluetoothProfile.HEADSET);
} else {
System.out.println("この端末ではBluetoothはサポートされていないか、無効になっています。");
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// サービスへのプロファイルプロキシの接続を閉じる
if (mBluetoothAdapter != null && mBluetoothHeadset != null) {
mBluetoothAdapter.closeProfileProxy(BluetoothProfile.HEADSET, mBluetoothHeadset);
}
}
知識
ユーザーの同意無しにBluetoothを有効にしてはいけない
Bluetooth should never be enabled without direct user consent. If you want to turn on Bluetooth in order to create a wireless connection, you should use the ACTION_REQUEST_ENABLE Intent, which will raise a dialog that requests user permission to turn on Bluetooth. The enable() method is provided only for applications that include a user interface for changing system settings, such as a "power manager" app.
引用元:https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#enable()
Bluetoothを有効にさせたいときユーザの同意なしにBluetoothを有効にしてはいけない。
有効にさせたい場合は ACTION_REQUEST_ENABLE
Intentを使用し、ユーザの許可を求めるダイアログを表示するべき
※BluetoothAdapter.enable()メソッドを使うとユーザの同意無しにBluetoothをONにすることができるけど、
それは「パワーマネージャー」アプリなど、システム設定を変更するためのユーザインターフェイスを含むアプリケーションとか用の処理らしい