Android 蓝牙配对,无需用户输入 PIN 码并使用 Android API 进行确认

问题描述 投票:0回答:3

我是 Android 编程的初学者,因为我三个月前才开始。

我正在做一个项目,使用蓝牙将 Android 应用程序连接到 Arduino。我已经有 Android 应用程序的代码(bluetooth.adapter、套接字等)。连接代码已经可以工作了。目标之一是 Android 应用程序在与蓝牙设备配对时自动输入密码,而不要求用户输入 PIN。

这个网站上的旧帖子没有多大帮助(许多人建议使用不安全模式,但我确实需要安全模式。同样在我的例子中,Arduino是服务器,而手机应用程序是客户端,所以 createInsecureRfcommSocketToServiceRecord() 服务器方法确实不适合我)。

我在 Android 开发者网站中搜索并找到了有关 bluetoothdevice 类的信息:

setPairingConfirmation(布尔确认) 确认 PAIRING_VARIANT_PASSKEY_CONFIRMATION 配对的密钥。

PAIRING_VARIANT_PIN =“系统将提示用户输入 PIN 码,或者应用程序将为用户输入 PIN 码”。

PAIRING_VARIANT_PASSKEY_CONFIRMATION =“系统将提示用户确认屏幕上显示的密钥,或者应用程序将为用户确认密钥”

似乎使用代码,应用程序将是输入密码并确认密码的应用程序,使其成为“自动连接”功能,但Android网站没有提供如何使用此功能的示例代码。有使用此或相关过程的示例代码吗?

android bluetooth android-bluetooth pairing
3个回答
14
投票

首先要澄清的是,该解决方案是为较新版本的 API(15 或更高版本?)设计的

我在另一篇文章中找到了答案(请参阅这里中Roldofo的答案)。这是我重新组织的答案,包含详细代码。

简而言之,您需要设置一个广播接收器来捕获 ACTION_PAIRING_REQUEST,然后以编程方式传递 PIN 并确认。

注册广播接收器:

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
    getActivity().registerReceiver(mPairingRequestReceiver, filter);

接收者的定义:

private final BroadcastReceiver mPairingRequestReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
            try {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    int pin=intent.getIntExtra("android.bluetooth.device.extra.PAIRING_KEY", 1234);
                    //the pin in case you need to accept for an specific pin
                    Log.d(TAG, "Start Auto Pairing. PIN = " + intent.getIntExtra("android.bluetooth.device.extra.PAIRING_KEY",1234));
                    byte[] pinBytes;
                    pinBytes = (""+pin).getBytes("UTF-8");
                    device.setPin(pinBytes);
                    //setPairing confirmation if neeeded
                    device.setPairingConfirmation(true);
            } catch (Exception e) {
                Log.e(TAG, "Error occurs when trying to auto pair");
                e.printStackTrace();
            }
        }
    }
};

然后在您的 Activity 或片段(无论您想要在何处启动配对),您都可以调用以下定义的pairDevice() 方法来调用配对尝试(这将生成 ACTION_PAIRING_REQUEST)

private void pairDevice(BluetoothDevice device) {
    try {
        Log.d(TAG, "Start Pairing... with: " + device.getName());
        device.createBond();
        Log.d(TAG, "Pairing finished.");
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
}

3
投票

我也面临同样的问题,经过所有研究,我找到了以下解决方案。

(已测试并工作!!!)

我基本上是在寻找特定的蓝牙设备(我知道 MAC 地址)并在找到后与其配对。首先要做的是使用广播接收器创建配对请求并按如下方式处理该请求。

IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
                intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
                registerReceiver(broadCastReceiver,intentFilter);

您需要编写broadcastReceiver并按如下方式处理它。

String BLE_PIN = "1234"
private BroadcastReceiver broadCastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action))
        {
            BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            bluetoothDevice.setPin(BLE_PIN.getBytes());
            Log.e(TAG,"Auto-entering pin: " + BLE_PIN);
            bluetoothDevice.createBond();
            Log.e(TAG,"pin entered and request sent...");
        }
    }
};

瞧!您应该能够与蓝牙设备配对,无需任何手动干预。

希望这有帮助:-) 如果它对您有用,请做出正确的答案。


1
投票

是的,这可以通过代码来完成

在您的主要活动中添加以下代码

BluetoothReceiver myreceiver = new BluetoothReceiver();
var intentfilterparingrequest = new IntentFilter(BluetoothDevice.ActionPairingRequest);
RegisterReceiver(myreceiver, intentfilterparingrequest);

在你的广播接收器中编写以下代码,如果没有创建一个新的广播接收器

public class BluetoothReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        string BLE_PIN = "0000";
        var action = intent.Action;
        switch (action)
        {
            case BluetoothDevice.ActionPairingRequest:
                BluetoothDevice bluetoothDevice = 
              (BluetoothDevice)intent.GetParcelableExtra(BluetoothDevice.ExtraDevice);
                bluetoothDevice.SetPin(Encoding.ASCII.GetBytes(BLE_PIN));
                bluetoothDevice.CreateBond();
                break;
        }
    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.