この質問に対する簡単なテスト プロジェクトを 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;
}
}