BluetoothSocket isConnected()函数在运行时导致java.lang.NoSuchMethodError

时间:2014-12-30 03:25:43

标签: java android sockets bluetooth

这是有问题的代码部分:

    btSocketForCSRComm.connect(); 
    Log.d("MYLOG", "CALLED btSocketForCSRComm.connect()" );

    do{

    }while(btSocketForCSRComm.isConnected()!=true);
    Log.d("MYLOG", "btSocketForCSRComm CONNECTION VERIFIED" );  

IDE(Android SDK)没有显示任何错误(Logcat可以正常工作到第一个Log.d)但在while循环期间它显示错误

12-30 12:18:12.661: E/AndroidRuntime(17795): FATAL EXCEPTION: main
12-30 12:18:12.661: E/AndroidRuntime(17795): java.lang.NoSuchMethodError: android.bluetooth.BluetoothSocket.isConnected
12-30 12:18:12.661: E/AndroidRuntime(17795):    at com.example.bluetoothbasic1.MainActivity$1.onReceive(MainActivity.java:138)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at android.os.Handler.handleCallback(Handler.java:587)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at android.os.Looper.loop(Looper.java:130)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at android.app.ActivityThread.main(ActivityThread.java:3691)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at java.lang.reflect.Method.invokeNative(Native Method)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at java.lang.reflect.Method.invoke(Method.java:507)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
12-30 12:18:12.661: E/AndroidRuntime(17795):    at dalvik.system.NativeStart.main(Native Method)  

为什么会这样?如果isConnect()函数不存在,那么为什么IDE没有显示任何错误?有没有其他方法可以检测BluetoothSocket是否已连接?

2 个答案:

答案 0 :(得分:2)

the official API docs中所述,isConnected()方法添加在冰淇淋三明治(SDK 14)中。如果您使用SDK 14或更新版本来编译代码但尝试在较旧的设备中运行代码,那么代码将失败并使用java.lang.NoSuchMethodError,就像它为您做的那样。

至少有两种方法可以解决它:

  1. 在Android清单中将最低SDK版本设置为14(请参阅uses-sdk)。
  2. 在运行时检查Android的版本,除非设备是ICS或更新版本,否则不要调用此方法(请参阅Build.VERSION)。

答案 1 :(得分:-1)

根本原因是您很可能已经针对缺少方法的类的不同版本编译了一个类,而不是运行它时使用的类。

如果在由您创建的类实例化的对象上调用方法时出现异常,那么您的构建过程似乎有问题。确保在编译时更新实际运行的类文件。