我使用[a-z]+
和createInsecureRfcommSocketToServiceRecord
创建了一个非常简单的应用程序,以了解如何使用Android蓝牙API。
我用两个设备测试了应用程序,A和B,设备A是Lollipop和LG,设备B是KitKat和LG。
当设备B在调用listenUsingInsecureRfcommWithServiceRecord
时找不到指定的UUID时,服务发现失败'被扔了。然而,在一次“服务发现失败”之后,'被抛出,connect()
稍后调用将抛出无法启动服务发现'的立即即可。 (使用调试器检查)
通过终止并重新启动应用程序无法修复此问题,并且需要重新启动才能修复。然而,似乎其他使用不安全RFCOMM的蓝牙应用程序也可以工作。 (使用'蓝牙终端' Play商店应用程序进行测试)
注意:设备A没有此类行为。实际上,它甚至没有抛出“服务发现失败”。异常和抛出“套接字未打开”#39;或类似的东西。
这是我的源代码:
connect()
这里是服务发现失败的日志'例外:
package com.example.bluetoothtest;
// Imports here
//Device A MAC: XX:XX:XX:XX:XX:XX
//Device B MAC: YY:YY:YY:YY:YY:YY
public class MainActivity extends AppCompatActivity {
UUID myUUID = UUID.fromString("ceceb700-28a8-11e7-9598-0800200c9a66"); //Random generated using a website
BluetoothAdapter bl;
BluetoothDevice remote;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bl = BluetoothAdapter.getDefaultAdapter();
remote = bl.getRemoteDevice("XX:XX:XX:XX:XX:XX");
}
public void onConnectAsServerClick(View v) {
System.out.println("server");
try {
BluetoothServerSocket server_sock = bl.listenUsingInsecureRfcommWithServiceRecord("bluetoothtest", myUUID);
System.out.println("accepting");
BluetoothSocket sock = server_sock.accept();
System.out.println("accepted");
System.out.println(Integer.toString(sock.getInputStream().read()));
server_sock.close();
sock.close();
} catch(IOException e) {
e.printStackTrace();
}
}
public void onConnectAsClientClick(View v) {
System.out.println("client");
try {
BluetoothSocket sock = remote.createInsecureRfcommSocketToServiceRecord(myUUID);
System.out.println("connecting");
sock.connect(); // Exceptions thrown here
System.out.println("connected");
sock.getOutputStream().write(20);
sock.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
此处无法启动服务发现':
I/System.out: client
I/BluetoothSocket.cpp: Setting Master socket option
I/System.out: connecting
W/System.err: java.io.IOException: Service discovery failed
W/System.err: at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:504)
W/System.err: at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:252)
W/System.err: at ml.minary.example.MainActivity.onConnectAsClientClick(MainActivity.java:61)
W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
W/System.err: at android.view.View.performClick(View.java:4336)
W/System.err: at android.view.View$PerformClick.run(View.java:17587)
W/System.err: at android.os.Handler.handleCallback(Handler.java:725)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err: at android.os.Looper.loop(Looper.java:137)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5230)
W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:564)
W/System.err: at dalvik.system.NativeStart.main(Native Method)