android pin码 经典蓝牙,Android的蓝牙PIN码配对不会对Android用户界面4.2+

There are similar questions to this here already, but the answers and suggestions relate to older versions of Android. I understand that the bluetooth stack has been completely revised from 4.2 onwards and older solutions do not work anymore.

I have tried all the older solutions to no avail. the use of the private APIs no longer works because they have changed. I dont mind using private APIs but it must work on the newest versions and later (ie API 17+)

I am trying to do the following:

set up a bluetooth pairing between an Android device and an embedded device using legacy PIN pairing without the embedded device being discoverable nor the user having to manually enter the PIN. In fact I want no PIN entry dialog box at all.

The plan is that the two devices have a predefined shared secret PIN, so that I can perform the pairing programmatically and then open an RFCOMM connection between them. All of this without UI. The hardware address of the embedded device is known to the Android program.

There is no security issue here. the project involves just talking to a nearyby, small embedded device through BT as simple as possible.

Ideas that might work on Android 4.2 (Jelly Bean) most welcome, thanks.

解决方案

turns out some of the problem was inside the embedded device. on the Android side, the following works:

BluetoothSocket s = null;

try

{

s = device.createInsecureRfcommSocketToServiceRecord(SerialPortServiceClass_UUID);

}

catch (IOException e)

{

Log.e(TAG, "BT connect failed", e);

return false;

}

where

private static final UUID SerialPortServiceClass_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,使用 Bluetooth API 进行蓝牙配对的流程如下: 1. 打开蓝牙 首先需要检查设备是否支持蓝牙,如果支持则需要打开蓝牙。 ``` BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { // 设备不支持蓝牙 } else { if (!bluetoothAdapter.isEnabled()) { // 请求打开蓝牙 Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } } ``` 2. 搜索蓝牙设备 使用 `BluetoothAdapter.startDiscovery()` 方法搜索附近的蓝牙设备,并在搜索到设备时进行处理。在搜索到设备时,可以通过 `BluetoothDevice.createBond()` 发起配对请求。 ``` BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); bluetoothAdapter.startDiscovery(); private final BroadcastReceiver deviceFoundReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getBondState() != BluetoothDevice.BOND_BONDED) { // 设备未配对,发起配对请求 device.createBond(); } } } }; // 注册设备搜索广播接收器 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(deviceFoundReceiver, filter); ``` 3. 输入配对配对请求发起后,蓝牙设备会弹出配对输入框,需要在输入框中输入配对。可以使用 `BluetoothDevice.setPin(byte[] pin)` 方法设置配对,也可以使用反射机制获取配对输入框并模拟输入。 ``` private void inputPin(BluetoothDevice device, String pin) { try { Method m = device.getClass().getMethod("setPin", byte[].class); m.invoke(device, pin.getBytes()); } catch (Exception e) { e.printStackTrace(); } } private void simulateInputPin() { try { BluetoothDevice device = ...; // 获取需要输入配对的设备 Method m = device.getClass().getMethod("setPairingConfirmation", boolean.class); m.invoke(device, true); m = device.getClass().getMethod("cancelPairingUserInput"); m.invoke(device); } catch (Exception e) { e.printStackTrace(); } } ``` 注意:使用反射机制可能会因为厂商定制的不同而不适用于某些设备。 4. 处理配对结果 在输入配对后,需要等待配对结果。可以注册广播接收器监听配对结果,例如: ``` private final BroadcastReceiver bondStateChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); if (bondState == BluetoothDevice.BOND_BONDED) { // 配对成功 } else if (bondState == BluetoothDevice.BOND_NONE) { // 配对失败 } } } }; // 注册配对状态改变广播接收器 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); registerReceiver(bondStateChangedReceiver, filter); ``` 完整代示例: ``` private final BroadcastReceiver deviceFoundReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getBondState() != BluetoothDevice.BOND_BONDED) { // 设备未配对,发起配对请求 device.createBond(); } } } }; private final BroadcastReceiver bondStateChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); if (bondState == BluetoothDevice.BOND_BONDED) { // 配对成功 } else if (bondState == BluetoothDevice.BOND_NONE) { // 配对失败 } } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { // 设备不支持蓝牙 } else { if (!bluetoothAdapter.isEnabled()) { // 请求打开蓝牙 Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } // 搜索蓝牙设备 bluetoothAdapter.startDiscovery(); IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(deviceFoundReceiver, filter); // 注册配对状态改变广播接收器 filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); registerReceiver(bondStateChangedReceiver, filter); } } private void inputPin(BluetoothDevice device, String pin) { try { Method m = device.getClass().getMethod("setPin", byte[].class); m.invoke(device, pin.getBytes()); } catch (Exception e) { e.printStackTrace(); } } private void simulateInputPin() { try { BluetoothDevice device = ...; // 获取需要输入配对的设备 Method m = device.getClass().getMethod("setPairingConfirmation", boolean.class); m.invoke(device, true); m = device.getClass().getMethod("cancelPairingUserInput"); m.invoke(device); } catch (Exception e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(deviceFoundReceiver); unregisterReceiver(bondStateChangedReceiver); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值