web-dev-qa-db-ja.com

ユーザーがピンを入力せずにプログラムでBluetoothデバイスをペアリングする

接続しようとしているBluetoothデバイスのピンコードは常に同じです。これにより、プログラムでピンを設定してデバイスをペアリングできるようになります。

これがどのように行われるかを検索しようとした後、私は以下のコードで終わりました:

BluetoothDevice device = getDevice();

//To avoid the popup notification:
device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true);
device.getClass().getMethod("cancelPairingUserInput", boolean.class).invoke(device, true);
byte[] pin = ByteBuffer.allocate(4).putInt(1234).array();
//int pinn = 1234;

//Entering pin programmatically:  
Method ms = device.getClass().getMethod("setPin", byte[].class);
//Method ms = device.getClass().getMethod("setPasskey", int.class);
ms.invoke(device, pin);

//Bonding the device:
Method mm = device.getClass().getMethod("createBond", (Class[]) null);
mm.invoke(device, (Object[]) null);

cancelPairingUserInputNoSuchMethodExceptionを提供します。これは、メソッドがBluetoothDeviceクラスに存在するため、奇妙です。

SetpinまたはSetPasskeyは何もしないようです。デバイスはペアリングされません。手動でピンを入力した後にのみペアリングされます。

したがって、機能するコードは次のとおりです。

//Bonding the device:
Method mm = device.getClass().getMethod("createBond", (Class[]) null);
mm.invoke(device, (Object[]) null);

Logcat出力:

09-27 12:34:46.408: ERROR/App(11671): cancelPairingUserInput [boolean]
        Java.lang.NoSuchMethodException: cancelPairingUserInput [boolean]
        at Java.lang.Class.getConstructorOrMethod(Class.Java:460)
        at Java.lang.Class.getMethod(Class.Java:915)
        at test.app.bluetooth.model.BluetoothDiscoveryAndPairing.pair(BluetoothDiscoveryAndPairing.Java:97)
        at test.app.bluetooth.model.BluetoothDiscoveryAndPairing.access$000(BluetoothDiscoveryAndPairing.Java:25)
        at test.app.bluetooth.model.BluetoothDiscoveryAndPairing$1.onReceive(BluetoothDiscoveryAndPairing.Java:79)
        at Android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.Java:756)
        at Android.os.Handler.handleCallback(Handler.Java:615)
        at Android.os.Handler.dispatchMessage(Handler.Java:92)
        at Android.os.Looper.loop(Looper.Java:137)
        at Android.app.ActivityThread.main(ActivityThread.Java:4921)
        at Java.lang.reflect.Method.invokeNative(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:511)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1038)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:805)
        at dalvik.system.NativeStart.main(Native Method)

だから私は何が間違っているのですか?

20
user1816451

非表示のメソッドcancelPairingUserInputがデバイスに存在しません。使用しないでください。

  1. Android.bluetooth.device.action.PAIRING_REQUESTのBroadcastReceiverを登録する必要があります
  2. CreateBond()を呼び出す
  3. BroadcastReceiverがトリガーされるのを待つ
  4. BroadcastReceiverでは、アクションがAndroid.bluetooth.device.action.PAIRING_REQUESTの場合、このメソッドを呼び出します
public void setBluetoothPairingPin(BluetoothDevice device)
{
    byte[] pinBytes = convertPinToBytes("0000");
    try {
          Log.d(TAG, "Try to set the PIN");
          Method m = device.getClass().getMethod("setPin", byte[].class);
          m.invoke(device, pinBytes);
          Log.d(TAG, "Success to add the PIN.");
          try {
                device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true);
                Log.d(TAG, "Success to setPairingConfirmation.");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                Log.e(TAG, e.getMessage());
                e.printStackTrace();
            } 
        } catch (Exception e) {
          Log.e(TAG, e.getMessage());
          e.printStackTrace();
        }
}

AndroidのJelly Beanバージョン(4.1.2)を搭載したデバイスでも動作します。

13
KRiadh

これは私にとってはうまくいきます:

    IntentFilter filter2 = new IntentFilter(
            "Android.bluetooth.device.action.PAIRING_REQUEST");
    mActivity.registerReceiver(
            pairingRequest, filter2);

private final BroadcastReceiver pairingRequest = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("Android.bluetooth.device.action.PAIRING_REQUEST")) {
            mBluetoothDevice = needed;
                try {
                    byte[] pin = (byte[]) BluetoothDevice.class.getMethod("convertPinToBytes", String.class).invoke(BluetoothDevice.class, "1234");
                    Method m = mBluetoothDevice.getClass().getMethod("setPin", byte[].class);
                    m.invoke(mBluetoothDevice, pin);
                    mBluetoothDevice.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(mBluetoothDevice, true);
}
    catch(Exception e)
{

    e.printStackTrace();

}
2
Péter Hidvégi