0

我一直在寻找答案,但还没有找到解决方法,但我希望有人能指出我正确的方向

我想要支持 sdk8 及更高版本,android.bluetooth.BluetoothDevice库中 的createInsecureRfcommSocketToServiceRecord方法仅支持 SDk10 及更高版本

快速而肮脏的是使 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 中。在任何情况下,限制对正确操作系统版本的任何调用都很重要(请参阅上面的代码),否则您可能会遇到NoSuchExceptionMethod-exception。

最后:不要忘记方法的签名(参数)(in getDeclaredMethod())。

干杯!

于 2013-03-23T22:39:47.647 回答