如何在Android上以编程方式配对蓝牙设备

Fir*_*Fly 17 android bluetooth

对于我的应用程序,我正在尝试以编程方式配对蓝牙设备.我能够显示我想要配对的设备的配对对话框,我可以输入密码.当我按"配对"时,对话框被删除,没有任何反应.

我只需要支持Android 2.0及更新版本的设备.

目前我正在使用以下代码来启动配对进度:


public void pairDevice(BluetoothDevice device) {
        String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST";
        Intent intent = new Intent(ACTION_PAIRING_REQUEST);
        String EXTRA_DEVICE = "android.bluetooth.device.extra.DEVICE";
        intent.putExtra(EXTRA_DEVICE, device);
        String EXTRA_PAIRING_VARIANT = "android.bluetooth.device.extra.PAIRING_VARIANT";
        int PAIRING_VARIANT_PIN = 0;
        intent.putExtra(EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
Run Code Online (Sandbox Code Playgroud)

在开始配对请求之前,我停止扫描新设备.

我的应用程序具有以下蓝牙权限:

  • android.permission.BLUETOOTH_ADMIN
  • android.permission.BLUETOOTH

小智 10

我设法通过作为服务的应用程序自动请求与键盘特色设备的配对程序,检查是否存在特定类型的设备和设置应用程序的修改版本.

我不得不说我正在开发一个运行Android 4.0.3的自定义设备,没有外部控件(没有后退/主页/确认按钮):在启动完成时将控制器配对而没有任何交互,直到PIN请求是强制性的.

首先,我创建了一个服务,在启动时启动一个活动(使用android.intent.action.BOOT_COMPLETEDandroid.permission.RECEIVE_BOOT_COMPLETED)定期检查onStceive回调上是否存在1344类设备(键盘,请求输入数据的唯一方法):

public void onReceive(Context context, Intent intent) 
...
    BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
...
if(dev.getBluetoothClass().getDeviceClass() == 1344){...}
Run Code Online (Sandbox Code Playgroud)

过滤后,我选择第一个可用的键盘,然后将BT地址传递给设置应用:

Intent btSettingsIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
btSettingsIntent.putExtra("btcontroller", dev.getAddress());
startActivityForResult(btSettingsIntent, 1);
Run Code Online (Sandbox Code Playgroud)

棘手的部分是寻找调用配对过程的最佳位置.仅使用

intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);
Run Code Online (Sandbox Code Playgroud)

让我进入一个削弱的对话框,一旦关闭,我就会将设备配对,但无法使用.

深入研究com.Android.settings.Bluetooth的类,我找到了自己的方法

createDevicePreference(CachedBluetoothDevice cachedDevice) 
Run Code Online (Sandbox Code Playgroud)

在DeviceListPreferenceFragment中.

从那里我确实将我之前选择的BT地址与可用的BT地址进行了比较,并且一旦成功匹配我就打电话

cachedDevice.startPairing();
Run Code Online (Sandbox Code Playgroud)

我知道,它很棘手,需要访问Android源代码,但在自定义环境中它可以工作.

我希望这可能会有所帮助.


kla*_*ron 5

这是我的回答:

在 onCreate() 中这样写:

    registerReceiver(incomingPairRequestReceiver, new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST));
Run Code Online (Sandbox Code Playgroud)

然后创建变量

private final BroadcastReceiver incomingPairRequestReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)) {
            BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            //pair from device: dev.getName()
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                dev.setPairingConfirmation(true);
                //successfull pairing
            } else {
                //impossible to automatically perform pairing,
                //your Android version is below KITKAT
            }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

  • `setPairingConfirmation(boolean confirm)` 需要 BLUETOOTH_PRIVILEGED 权限,但此权限不适用于第三方应用程序。请参阅[Android 开发者](https://developer.android.com/reference/android/Manifest.permission.html#BLUETOOTH_PRIVILEGED) (3认同)

Rah*_*ary 0

可能您需要 startActivityForResult 而不仅仅是 startActivity ?

其他选项是查看 BluetoothChat 应用程序示例并启动 RFComm 连接套接字,一旦启动套接字,配对请求就会自动出现,而无需发送单独的配对意图。这样您就不需要处理配对了。

http://developer.android.com/resources/samples/BluetoothChat/index.html