1

とにかく、サポート プロファイル (HDD、Spp、およびオーディオ) から接続されているデバイスのリストを取得する方法はありますか。要件は、デバイスが HDD、SPP、およびオーディオをサポートするようなものであるため、これらすべてのプロファイルをサポートするデバイスをフィルタリングする必要があります。とにかくデバイスをフィルタリングする方法はありますか?

4

1 に答える 1

5

はい、可能ですが、Android アプリケーションは SDK 11 以降 ( Android 3.0.X ) をターゲットにする必要があります。

あなたの質問に対する解決策は、Android デバイスで認識されているすべての BluetoothDevices を照会する必要があるということです。既知とは、ペアリングされた接続済みまたは未接続のデバイス、およびペアリングされていない接続済みデバイスのすべてを意味します。

現在接続されているデバイスのみが必要なため、後で接続されていないデバイスを除外します。


  • まず、以下を取得する必要がありますBluetoothAdapter

最終的な BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();

  • 次に、Bluetooth が利用可能でオンになっていることを確認する必要があります。

if (btAdapter != null && btAdapter.isEnabled()) // null は Bluetooth がないことを意味します!

Bluetooth が有効になっていない場合はbtAdapter.enable()、ドキュメントで推奨されていない方法を使用するか、ユーザーにそれを行うように依頼することができます: Android で Bluetooth をプログラムで有効にする

  • 3 番目に、状態の配列を定義する必要があります (接続されていないデバイスを除外するため)。

final int[] states = new int[] {BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING};

  • BluetoothProfile.ServiceListener4 番目に、サービスの接続時と切断時にトリガーされる 2 つのコールバックを含むを作成します。

    final BluetoothProfile.ServiceListener listener = new BluetoothProfile.ServiceListener() {
        @Override
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
        }
    
        @Override
        public void onServiceDisconnected(int profile) {
        }
    };
    

Android SDK で利用可能なすべての Bluetooth プロファイル ( A2Dp、GATT、GATT_SERVER、Handset、Health、SAP ) に対してクエリ プロセスを繰り返す必要があるため、次のように進める必要があります。

onServiceConnected、現在のプロファイルを確認する条件を配置して、見つかったデバイスを正しいコレクションに追加し、 : を使用proxy.getDevicesMatchingConnectionStates(states)して接続されていないデバイスを除外します。

switch (profile) {
    case BluetoothProfile.A2DP:
        ad2dpDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
        break;
    case BluetoothProfile.GATT: // NOTE ! Requires SDK 18 !
        gattDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
        break;
    case BluetoothProfile.GATT_SERVER: // NOTE ! Requires SDK 18 !
        gattServerDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
        break;
    case BluetoothProfile.HEADSET: 
        headsetDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
        break;
    case BluetoothProfile.HEALTH: // NOTE ! Requires SDK 14 !
        healthDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
        break;
    case BluetoothProfile.SAP: // NOTE ! Requires SDK 23 !
        sapDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
        break;
}

最後に、クエリ プロセスを開始します。

btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.A2DP);
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.GATT); // NOTE ! Requires SDK 18 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.GATT_SERVER); // NOTE ! Requires SDK 18 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.HEADSET);
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.HEALTH); // NOTE ! Requires SDK 14 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.SAP); // NOTE ! Requires SDK 23 !
于 2016-01-14T13:06:30.293 に答える