web-dev-qa-db-ja.com

AndroidユーザーがPINを入力せずにBluetoothのペアリングとAndroid APIを使用した確認

Androidプログラミングは3か月前に始めたばかりなので、プログラミングの初心者です。AndroidアプリをBluetoothを使用してarduinoに接続するプロジェクトを行っています。 Android app(bluetooth.adapter、sockets、.etc。)のコードをすでに持っています。接続用のコードはすでに機能しています。目標の1つはAndroidアプリは、ユーザーにPINの入力を要求せずにBluetoothデバイスとペアリングするときに自動的にパスワードを入力します。

このフォーラムの古い投稿はあまり役に立ちません。 (多くの場合、非セキュアモードを使用することをお勧めしますが、セキュアモードが必要です。私の場合も、携帯電話アプリがクライアントの場合はarduinoがサーバーであるため、createInsecureRfcommSocketToServiceRecord()サーバーメソッドは機能しません)

私が検索したところ、Android bluetoothdeviceクラスに関するデベロッパーサイト:

setPairingConfirmation(boolean confirm)PAIRING_VARIANT_PASSKEY_CONFIRMATIONペアリングのパスキーを確認します。

PAIRING_VARIANT_PIN = "ユーザーはピンの入力を求められるか、アプリはユーザーのピンを入力します"。

PAIRING_VARIANT_PASSKEY_CONFIRMATION = "画面に表示されたパスキーの確認を求めるプロンプトが表示されるか、アプリがユーザーのパスキーを確認します"

コードを使用しているようですが、アプリはパスワードを入力し、パスワードを確認して「自動接続」機能にするものですが、Androidサイトでは、これを使用してください。このプロセスまたは関連するプロセスを使用するためのサンプルコードはありますか?私はあなたの助けに感謝します!

10
ian

まず明確にするために、このソリューションは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();
            }
        }
    }
};

次に、アクティビティまたはフラグメント(ペアリングを開始する場所)で、次の定義された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());
    }
}
12
ian

私も同じ問題に直面し、すべての調査の結果、以下の解決策を見つけました。

(テスト済みで動作中!!!)

基本的に、特定のBluetoothデバイス(MACアドレスは知っています)を探しており、見つかったらそれとペアリングします。最初にすることは、boradcastレシーバーを使用してペア要求を作成し、以下のように要求を処理することです。

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...");
        }
    }
};

出来上がり!手動による介入なしでBluetoothデバイスとペアリングできるはずです。

これが役に立てば幸いです:-)それがあなたのために働くならば、それを正しい答えにしてください。

0
Varun A M