ペアリングされたデバイスのリストを取得する方法は理解していますが、それらが接続されているかどうかを確認するにはどうすればよいですか?
携帯電話のBluetoothデバイスリストにそれらが表示されており、接続状態が示されているため、それが可能であるに違いありません。
AndroidManifestにBluetooth許可を追加します。
<uses-permission Android:name="Android.permission.BLUETOOTH" />
次に、インテントフィルターを使用してACTION_ACL_CONNECTED
、ACTION_ACL_DISCONNECT_REQUESTED
、およびACTION_ACL_DISCONNECTED
ブロードキャスト:
public void onCreate() {
...
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(mReceiver, filter);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
... //Device found
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
... //Device is now connected
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
... //Done searching
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
... //Device is about to disconnect
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
... //Device has disconnected
}
}
};
いくつかのメモ:
ユースケースでは、VoIPアプリ用にBluetoothヘッドセットが接続されているかどうかを確認するだけでした。次の解決策は私のために働いた:
public static boolean isBluetoothHeadsetConnected() {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
&& mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
}
もちろん、Bluetoothの許可が必要です。
<uses-permission Android:name="Android.permission.BLUETOOTH" />
スカイラーサットンの回答に感謝します。これを彼への返信として投稿していますが、コードを投稿しているため、コメントとして返信することはできません。私はすでに彼の答えを支持していたので、ポイントを探していません。それを前払いするだけです。
何らかの理由でBluetoothAdapter.ACTION_ACL_CONNECTEDをAndroid Studioで解決できませんでした。おそらく、Android 4.2.2?で非推奨になりましたか?登録コードは同じですが、受信機コードはわずかに異なるため、アプリの他の部分が参照するBluetooth接続フラグを更新するサービスでこれを使用します。
public void onCreate() {
//...
IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(mReceiver, filter1);
this.registerReceiver(mReceiver, filter2);
this.registerReceiver(mReceiver, filter3);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
//Do something if connected
Toast.makeText(getApplicationContext(), "BT Connected", Toast.LENGTH_SHORT).show();
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
//Do something if disconnected
Toast.makeText(getApplicationContext(), "BT Disconnected", Toast.LENGTH_SHORT).show();
}
//else if...
}
};
このコードはヘッドセットプロファイル用です。おそらく他のプロファイルでも機能します。まず、プロファイルリスナー(Kotlinコード)を提供する必要があります。
private val mProfileListener = object : BluetoothProfile.ServiceListener {
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
if (profile == BluetoothProfile.HEADSET)
mBluetoothHeadset = proxy as BluetoothHeadset
}
override fun onServiceDisconnected(profile: Int) {
if (profile == BluetoothProfile.HEADSET) {
mBluetoothHeadset = null
}
}
}
その後、Bluetoothをチェックしながら:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}
OnSeviceConnectedが呼び出されるまで少し時間がかかります。その後、接続されているヘッドセットデバイスのリストを以下から取得できます。
mBluetoothHeadset!!.connectedDevices
BluetoothAdapter.getDefaultAdapter().isEnabled
-> bluetoothが開いているときにtrueを返します
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.isBluetoothScoOn
->デバイスが接続されるとtrueを返します