11

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

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

bluetoothdevice クラスに関する Android 開発者サイトでこれを検索して見つけました。

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

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

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

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

4

3 に答える 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();
            }
        }
    }
};

次に、アクティビティまたはフラグメント (ペアリングを開始する場所) で、次の定義済みの 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());
    }
}
于 2016-02-20T22:15:43.377 に答える