• 关于蓝牙socket 服务器端首次accept总出错!



    ====================问题描述====================
    我使用蓝牙socket通信,服务器端使用socket = mmServerSocket.accept()这个语句,可是这里总是报错! 错误如下:

    java.io.IOException: Not able to register SDP record for mango
    at android.bluetooth.BluetoothAdapter.createNewRfcommSocketAndRecord(BluetoothAdapter.java:890)
    at android.bluetooth.BluetoothAdapter.listenUsingRfcommWithServiceRecord(BluetoothAdapter.java:813)
    at com.card.test.receivecard$AcceptThread.<init>(receivecard.java:118)
    at com.card.test.receivecard.onStart(receivecard.java:96)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
    at android.app.Activity.performStart(Activity.java:3797)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1620)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
    at dalvik.system.NativeStart.main(Native Method)
    null
    threadid=9: thread exiting with uncaught exception (group=0x401f6560)
    ATAL EXCEPTION: Thread-10
    java.lang.NullPointerException
    at com.card.test.receivecard$AcceptThread.run(receivecard.java:132)


    我的接收端代码片段如下:

      private class AcceptThread extends Thread {
           private final BluetoothServerSocket mmServerSocket;
           private InputStream mmInStream;
     
           public AcceptThread() {

               final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";   
               UUID uuid = UUID.fromString(SPP_UUID); 
               BluetoothServerSocket tmp = null;
               try {
                   tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(Name,uuid);
               } catch (IOException e) { 
               e.printStackTrace();
               }
               mmServerSocket = tmp;
           }

           public void run() {
               BluetoothSocket socket = null;
            
               // Keep listening until exception occurs or a socket is returned
               while (true) {
                   try {
                  System.out.println(mmServerSocket);//由打印信息知mmServerSocket为null
                       socket = mmServerSocket.accept(); //所以这里出错了
                   } catch (IOException e) {
                   e.printStackTrace();
                   finish();
                       break;
               }
                // If a connection was accepted
                if (socket != null) {
                    try {
                    以下省略。。。
                 }


    发送端代码片段如下:

    private  class ClientThread extends Thread {
               private final BluetoothSocket msocket;
               private final BluetoothDevice mdevice;
               final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";   
               UUID uuid = UUID.fromString(SPP_UUID); 
     
            public ClientThread(BluetoothDevice device) {
            
            //建立socket连接
                   BluetoothSocket tmp = null;
                   mdevice = device;

                try {
                     tmp = mdevice.createRfcommSocketToServiceRecord(uuid);
                } catch (IOException e) { e.printStackTrace(); }
                     msocket = tmp;
                }
     
            public void run() {
                mBluetoothAdapter.cancelDiscovery();
               
              try {
            msocket.connect();

               } catch (IOException e) {
                  e.printStackTrace();
               }
                
             
               // Do work to manage the connection (in a separate thread)
                try {
                以下省略。。。



    我这两段代码是在两个不同的activity里面写的(sendcard.activity和receivecard.activity).想要的功能是用蓝牙将名片发送出去,使用时,手机A点发送按钮,跳到sendcard.activity,手机B基本上同时点接收按钮,跳到receivecard.activity。但是问题是:几乎每次刚安装好程序,首次使用时,就会accept报错(如上文错误信息),然后多尝试几次发送接收,就能成功……


    不知道我说清楚没  就是首次点接收按钮,运行到accept处,程序都会意外终止,再重新点开程序试一次就不会出错了
    这样很影响用户体验……


    求各位大神帮帮忙!!感激不尽!!!!
    虽然剩的分不多了……
    ====================解决方案1====================
    做个循环,当错误时重新执行过,直到无错误后退出循环,这个应该是UUID识别的问题。
  • 相关阅读:
    Kubernetes 部署微服务电商平台(16)
    Android开发如何去除标题栏title
    eclipse中logcat偶尔不显示log的问题解决办法
    Two Sum
    事件的解除与绑定
    使用 Canvas 绘图
    表单脚本
    事件
    DOM2 和 DOM3
    DOM扩展
  • 原文地址:https://www.cnblogs.com/lianxu61/p/4011111.html
Copyright © 2020-2023  润新知