0

私は答えを探していましたが、まだそれを行う方法を見つけていません。誰かが私を正しい方向に向けてくれることを願っています

sdk8 以降をサポートしたいのですが、SDk10 以降でのみサポートされて いるandroid.bluetooth.BluetoothDeviceライブラリのcreateInsecureRfcommSocketToServiceRecordメソッドがあります。

minSDK=10 にするのは簡単ですが、古いデバイスを使用しているユーザーを寒冷地に放置したくありません。

これを試みるかなり複雑な(または風変わりと言うべき)方法、反射を見てきましたか??? しかし、私が考えた最も簡単な方法は次のとおりです。

if( Build.VERSION.SDK_INT>=10)
{
    BluetoothDevice device;
    Class myC = ClassforName("android.bluetooth.BluetoothDevice")
    Method myM = myC.getDeclaredMethod("createInsecureRfcommSocketToServiceRecord");
    BluetoothSocket bb = (BluetoothSocket)myM.invoke(device, MYUUID);
}

しかし、それは NoSuchExceptionMethod をスローするので、おそらくライブラリには別の名前を付ける必要があるように見えます???? または、これをどのように処理しますか??

前もって感謝します

4

2 に答える 2

0

宣言されたパラメーターも渡す必要があります

Class myC = ClassforName("android.bluetooth.BluetoothDevice")
Method myM = myC.getDeclaredMethod("createInsecureRfcommSocketToServiceRecord",UUID.class);
于 2013-03-23T22:31:10.400 に答える
0

バージョンを増やしたくない場合はminSDK、呼び出しをリフレクションでラップする必要があります...

BluetoothDevice device;

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD) {
   Class myC = ClassforName("android.bluetooth.BluetoothDevice")
   Method myM = myC.getDeclaredMethod("createInsecureRfcommSocketToServiceRecord", 
                                       new Class[] { UUID.class } );
   BluetoothSocket bb = (BluetoothSocket)myM.invoke(device, MYUUID);
}

... または、android.bluetooth.BluetoothDeviceいくつかの空のメソッド スタブのみを持つ (抽象) クラスを提供します。これにより、エラーなしでソースをコンパイルできます。実行時に、仮想マシンはシステムからそのクラスをロードしようとします。

public abstract class BluetoothDevice {

    BluetoothDevice () {
    }

    public void createInsecureRfcommSocketToServiceRecord(UUID uuid) {
    }
}

クラスはroot-source /android/bluetooth に配置する必要があります。いずれにせよ、適切な OS バージョンへの呼び出しを制限することが重要です (上記の私のコードを参照)。そうしないと、例外が発生する可能性がありNoSuchExceptionMethodます。

最後に: メソッドの署名 (パラメーター) を忘れないでください ( getDeclaredMethod())。

乾杯!

于 2013-03-23T22:39:47.647 に答える