我一直在寻找答案,但还没有找到办法,但我希望有人能指出我正确的方向
我想支持sdk8及以上,有这种方法 createInsecureRfcommSocketToServiceRecord 来自SDK10仅支持的 android.bluetooth.BluetoothDevice 库
快速和肮脏是使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,所以看起来这个库可能还有其他的名字????或者你会如何处理?
提前致谢
答案 0 :(得分:0)
您还必须传递声明的参数
Class myC = ClassforName("android.bluetooth.BluetoothDevice")
Method myM = myC.getDeclaredMethod("createInsecureRfcommSocketToServiceRecord",UUID.class);
答案 1 :(得分: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
- 例外。
最后:不要忘记方法的签名(参数)(在getDeclaredMethod()
中)。
干杯!