4

この質問に対する簡単なテスト プロジェクトを GitHub で用意しました。

コンピューター画面から QR コードをスキャンし、データ (MAC アドレスと PIN またはハッシュ) を使用して Bluetooth デバイスと簡単にペアリング (ボンディング) する Android アプリを作成しようとしています。

人気のInstaWifi アプリに似ていますが、Classic Bluetooth 用です。

テスト目的で、バーコード スキャンはまだ行っていませんが、デバイスのリストを表示するだけです。

デバイスのリスト

ユーザーがいずれかのデバイスに触れた後、MainActivity.javaでペアリングが試行されます。

private void startBluetoothPairing(BluetoothDevice device) {
    Intent pairingIntent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
                BluetoothDevice.PAIRING_VARIANT_PIN);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, 1234);
    //device.setPin(new byte[]{1,2,3,4});  <- DOES NOT CHANGE ANYTHING
    //device.setPairingConfirmation(false);
    startActivityForResult(pairingIntent, REQUEST_BT_SETTINGS);
}

残念ながら、ポップアップは引き続き PIN を要求します。

ピンダイアログ

ソース コードで実際に PIN を指定したので、実際には別のより単純なシステム ダイアログが表示されることを期待していました (これは NFC OOB ペアリングを行うときに表示されます)。

ペアダイアログ

ソリューションの検索から、setPin()メソッドがあることはわかっていますが、ここでは適用できません (またはそうですか?) - アプリだけでなく、スマートフォン全体を Bluetooth デバイスにペアリングしようとしているためです...

私の質問: Android OS で簡単な [キャンセル/ペアリング] ダイアログを表示するにはどうすればよいですか?

GitHub でBluetooth ペアリング要求文字列を検索しても、ヒントは示されませんでした...

更新: unrealsoul007 の提案 (感謝) で、MainActivity.javaのソース コードを更新したところ、単純な [キャンセル/ペアリング] ダイアログが表示されます。

private void startBluetoothPairing(BluetoothDevice device) {
    Intent pairingIntent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
        BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION);
    pairingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivityForResult(pairingIntent, REQUEST_BT_PAIRING);
}

ただし、ペアリング プロセスを完了する方法がわかりません。ダイアログが閉じられる前でもonActivityResult呼び出されるためです。resultCode=0

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    // this is called before user clicks Cancel or Pair in the dialog
    if (requestCode == REQUEST_BT_PAIRING) { 
        if (resultCode == Activity.RESULT_OK) {  // 0 != -1
            Log.d("XXX", "Let#s pair!!!!"); // NOT CALLED
        }

        return;
    }
}
4

1 に答える 1

5

PIN を入力するように求められます。これは、 pairingIntent.

使用する代わりに

pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
                BluetoothDevice.PAIRING_VARIANT_PIN);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, 1234);

使用する

pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PASSKEY_CONFIRMATION);

ここで述べたように、

ユーザーは、画面に表示されたパスキーを確認するように求められるか、アプリがユーザーのパスキーを確認します。

于 2015-06-23T10:43:32.713 に答える