web-dev-qa-db-ja.com

Bluetoothデバイスが接続されているかどうかをプログラムで確認する方法は?

ペアリングされたデバイスのリストを取得する方法は理解していますが、それらが接続されているかどうかを確認するにはどうすればよいですか?

携帯電話のBluetoothデバイスリストにそれらが表示されており、接続状態が示されているため、それが可能であるに違いありません。

75
dchappelle

AndroidManifestにBluetooth許可を追加します。

<uses-permission Android:name="Android.permission.BLUETOOTH" />

次に、インテントフィルターを使用してACTION_ACL_CONNECTEDACTION_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
        }           
    }
};

いくつかのメモ:

  • アプリケーションの起動時に接続デバイスのリストを取得する方法はありません。 Bluetooth APIでは、クエリを行うことはできませんが、変更を聞くことができます。
  • 上記の問題を回避するには、既知のデバイスとペアリングされたすべてのデバイスのリストを取得し、それぞれに接続しようとします(接続されているかどうかを判断します)。
  • または、バックグラウンドサービスにBluetooth APIを監視させ、デバイスの状態をディスクに書き込んで、アプリケーションが後日使用できるようにすることもできます。
135
Skylar Sutton

ユースケースでは、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" />

22
jobbert

スカイラーサットンの回答に感謝します。これを彼への返信として投稿していますが、コードを投稿しているため、コメントとして返信することはできません。私はすでに彼の答えを支持していたので、ポイントを探していません。それを前払いするだけです。

何らかの理由で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...
    }
};
10
pmont

このコードはヘッドセットプロファイル用です。おそらく他のプロファイルでも機能します。まず、プロファイルリスナー(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
1
user5902306

BluetoothAdapter.getDefaultAdapter().isEnabled-> bluetoothが開いているときにtrueを返します

val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager

audioManager.isBluetoothScoOn->デバイスが接続されるとtrueを返します

0
ravid rinek