studio how dispositivos detectar connectedthread buscar java android bluetooth

java - how - Programar sistemáticamente el dispositivo Bluetooth sin que el usuario ingrese el pin



detectar dispositivos bluetooth android studio (2)

El dispositivo Bluetooth que estoy intentando conectar siempre tiene el mismo código. Esto debería permitir emparejar el dispositivo configurando el pin mediante programación.

Después de intentar buscar cómo podría hacerse esto, terminé con el siguiente código:

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);

cancelPairingUserInput me da una NoSuchMethodException , lo cual es extraño porque el método no existe en BluetoothDevice clase BluetoothDevice .

Parece que Setpin o SetPasskey no hacen nada. El dispositivo simplemente no se empareja. Solo se empareja después de introducir manualmente el pin.

Así que la única línea de código que funciona es:

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

Salida 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)

Entonces, ¿qué estoy haciendo mal?


El método oculto cancelPairingUserInput no existe en su dispositivo. No lo uses

  1. Debe registrar BroadcastReceiver para android.bluetooth.device.action.PAIRING_REQUEST
  2. Llamar a createBond ()
  3. Espera a que BroadcastReceiver se active
  4. En BroadcastReceiver si la acción es android.bluetooth.device.action.PAIRING_REQUEST, llame a este método

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(); } }

También funciona en un dispositivo con la versión Jelly Bean (4.1.2) de Android.


esto es trabajo para mi

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(); }