10

createBond() を呼び出し、android.bluetooth.device.action.PAIRING_REQUEST のブロードキャスト レシーバーを登録し、PIN コードを手動で入力してペアリングすることで、Bluetooth デバイスと自動的にペアリングするコードがいくつかあります。

これは、これまでテストされた Android 4.0 までのすべてのデバイスでうまく機能しましたが、今日、Android 4.2.1 を搭載した Nexus 7 でこれを試したところ、次のエラーが発生しました。

java.lang.noSuchMethodException: android.bluetooth.IBluetooth.createBond

彼らは実際にこの関数をライブラリから削除しましたか?

アップデート

実際に起こっているのは、createBond を呼び出すために使用している IBluetooth インターフェイス オブジェクトが初期化されていないことです。次のコードでは、BTBinder という名前の IBinder を取得しようとする行が null を返します。このプロセスが失敗すると、最後に BTInterface が null に設定されます。だから、私の質問は、Android 4.2.1 を搭載した Nexus 7 でバインダーを取得する呼び出しが null を返すのに、テストした他の 5 つのデバイスで正しく動作するのはなぜですか?

public static IBluetooth getBluetoothInterface()
{
    //Gets a bluetooth interface from private Android system API
    IBluetooth BTInterface = null;

    try
    {
        Class<?> ServiceManager = Class.forName("android.os.ServiceManager");
        Method getService = ServiceManager.getDeclaredMethod("getService", String.class);
        IBinder BTBinder = (IBinder) getService.invoke(null, "bluetooth");
        Class<?> IBluetooth = Class.forName("android.bluetooth.IBluetooth");
        Class<?>[] IBluetoothClasses = IBluetooth.getDeclaredClasses();
        Class<?> IBluetoothClass0 = IBluetoothClasses[0];
        Method asInterface = IBluetoothClass0.getDeclaredMethod("asInterface",IBinder.class);
        asInterface.setAccessible(true);
        BTInterface = (IBluetooth) asInterface.invoke(null, BTBinder);
    }
    catch (Exception e)
    {
        return null;
    }

    return BTInterface;
}
4

2 に答える 2

6

Android 4.2 では、Bluetooth スタックの実装が変更されました。

「Android 4.2 には、Android デバイスでの使用に最適化された新しい Bluetooth スタックが導入されています。Google と Broadcom が共同で開発した新しい Bluetooth スタックは、BlueZ ベースのスタックに取って代わり、互換性と信頼性が向上しています。」

Nexus 7 のパブリック API を使用しても、多くの bt 関連が機能しません。

于 2012-12-19T12:15:17.720 に答える
2
 public boolean createBond(BluetoothDevice btDevice)  
        throws Exception  
        { 
            Class class1 = Class.forName("android.bluetooth.BluetoothDevice");
            Method createBondMethod = class1.getMethod("createBond");  
            Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);  
            return returnValue.booleanValue();  
    }

これは 4.2.1 Galaxy Nexus で機能しました。Nexus 7 で試したことはありませんが、IBluetooth メソッドを使用すると MethodNotFoundException という同じ問題が発生しました。したがって、Nexus 7 でも修正される可能性があります。

于 2013-01-15T21:48:49.583 に答える