web-dev-qa-db-ja.com

ペアリングされたBluetoothデバイスにプログラムで接続する

Android SDKを使用して、ペアリング済みのBluetoothデバイスにプログラムで接続する方法はありますか?

つまり、[設定]-> [無線とネットワーク]-> [Bluetooth設定]に移動し、デバイス(「ペアリングされているが接続されていない」と表示)をタップします。プログラムでこれを実行できるようにしたいのですが、これを行う方法がわかりません。

RFCOMMソケットを作成するオプションがあり、SPPデバイスの場合は接続部分も行うと想定していますが、A2DPデバイスの場合は実際のデータ転送はOSではなくOSによって処理されます私のアプリ、私はそれが適用されないと思いますか?

50
rmc47

さて、これは私を夢中にさせていたので、ソースコードを掘り下げて、100%信頼できる(少なくとも私のNexus 4では、Android 4.3)に接続するソリューションを見つけましたペアリングされたA2DPデバイス(ヘッドセットやBluetoothオーディオデバイスなど)。完全に機能するサンプルプロジェクト(Android Studio)で簡単にビルドできます)を公開しました Github にあります。

基本的に、あなたがする必要があるのは:

  • BluetoothAdapterのインスタンスを取得します
  • このインスタンスを使用して、A2DPのプロファイルプロキシを取得します。

adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);

listenerは、onServiceConnected()コールバックでServiceListenerを受け取るBluetoothProfileです(_BluetoothA2dp_インスタンスにキャストできます)

  • リフレクションを使用して、プロキシでconnect(BluetoothDevice)メソッドを取得します。

Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);

  • BluetoothDeviceを見つけます:

_String deviceName = "My_Device_Name";

BluetoothDevice result = null;

Set<BluetoothDevice> devices = adapter.getBondedDevices();
if (devices != null) {
    for (BluetoothDevice device : devices) {
        if (deviceName.equals(device.getName())) {
            result = device;
            break;
        }
    }
}
_

  • そしてconnect()メソッドを呼び出します:

connect.invoke(proxy, result);

少なくとも私にとっては、デバイスの即時接続を引き起こしました。

47
kcoppock

問題を解決するために見つけた最善の方法は、Bluetooth設定画面を表示するボタンを作成できることを見つけることでした。私はあなたがこれを行うことができるとは思わなかった、または私は最初から持っていただろう。

startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
4
Belboz

デバイスがすでにペアリングされている場合、使用できます

if(device.getBondState()==device.BOND_BONDED){

        Log.d(TAG,device.getName());
        //BluetoothSocket mSocket=null;
        try {


            mSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            Log.d(TAG,"socket not created");
            e1.printStackTrace();
        }
        try{

            mSocket.connect();

        }
        catch(IOException e){
            try {

                mSocket.close();
                Log.d(TAG,"Cannot connect");
            } catch (IOException e1) {
                Log.d(TAG,"Socket not closed");
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }


        }

mY_UUID用

private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");

上記のコードスニペットは、デバイスをA2DP対応デバイスに接続するためのものです。うまくいくことを願っています。

3
nam_ph

アプリのこの機能の開始点として、ここでコードを使用しました: http://developer.Android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices

デバイスがペアリングされると、アプリは問題なく2つのデバイスをプログラムで接続します。

0
Marc Bernstein