首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android上编程地配对蓝牙设备

如何在Android上编程地配对蓝牙设备
EN

Stack Overflow用户
提问于 2011-02-14 07:54:42
回答 10查看 84K关注 0票数 18

对于我的应用程序,我试图以编程方式配对蓝牙设备。我能够显示我想对的设备的配对对话框,并且我可以输入一个弹码。当我按下“对”时,对话框就会被删除,什么也不会发生。

我只需要支持带有Android2.0和更新版本的设备。

目前,我正在使用以下代码启动配对过程:

代码语言:javascript
复制
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);
    }

在启动配对请求之前,我停止扫描新设备。

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

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

回答 10

Stack Overflow用户

发布于 2012-10-08 14:46:28

我设法通过一个应用程序自动请求一个与键盘功能齐全的设备配对的过程,作为一个服务,检查特定类型设备的存在以及Settings应用程序的修改版本。

我不得不说,我在一个运行Android4.0.3的定制设备上工作,没有外部控件(没有back/Home/确认按钮):在启动完成时对控制器进行配对,不需要任何交互,直到PIN请求是强制性的。

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

代码语言:javascript
复制
public void onReceive(Context context, Intent intent) 
...
    BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
...
if(dev.getBluetoothClass().getDeviceClass() == 1344){...}

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

代码语言:javascript
复制
Intent btSettingsIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
btSettingsIntent.putExtra("btcontroller", dev.getAddress());
startActivityForResult(btSettingsIntent, 1);

棘手的部分是寻找最佳的位置来调用配对过程。只使用

代码语言:javascript
复制
intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);

带我到了一个曾经关闭的paring对话框,使我与设备成对,但无法使用。

深入研究com.Android.settings.Bluetooth的类,我找到了通过

代码语言:javascript
复制
createDevicePreference(CachedBluetoothDevice cachedDevice) 

在DeviceListPreferenceFragment里。

在那里,我确实比较了我以前选择的BT地址和即将出现的可用地址,一旦成功匹配,我就打电话了。

代码语言:javascript
复制
cachedDevice.startPairing();

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

我希望这能帮上忙。

票数 9
EN

Stack Overflow用户

发布于 2016-04-04 09:37:40

我的回答是:

在onCreate()中编写如下:

代码语言:javascript
复制
    registerReceiver(incomingPairRequestReceiver, new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST));

然后创建变量

代码语言:javascript
复制
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
            }
        }
    }
};
票数 5
EN

Stack Overflow用户

发布于 2012-01-14 01:09:31

不幸的是,我认为最好的方法是为用户打开设置/无线和网络/蓝牙设置,如下所示:

代码语言:javascript
复制
    Intent intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
    startActivityForResult(intent, REQUEST_PAIR_DEVICE);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4989902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档