Android支持该方法不可用的较旧SDK

时间:2013-03-23 22:15:42

标签: android

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

我想支持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,所以看起来这个库可能还有其他的名字????或者你会如何处理?

提前致谢

2 个答案:

答案 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()中)。

干杯!