2015-06-01 124 views
1

我在Android Studio上写了一个应用程序。 我通过Bluetooth从Android设备与arduino主板进行通信。 现在一切正常,但我开始一个新的Activity,我需要停止实际BT connection。所以我想调用一个停止方法。 问题是,当我打电话时它会崩溃。连接停止时android蓝牙崩溃

这里是代码

public class BtInterface { 

private BluetoothDevice device = null; 
private BluetoothSocket socket = null; 
private InputStream receiveStream = null; 
private OutputStream sendStream = null; 
String GlobalBuff=""; 
String Right_Buff=""; 


private ReceiverThread receiverThread; 

Handler handler; 

public BtInterface(Handler hstatus, Handler h,String Device_Name) { 
    Set<BluetoothDevice> setpairedDevices = BluetoothAdapter.getDefaultAdapter().getBondedDevices(); 
    BluetoothDevice[] pairedDevices = (BluetoothDevice[]) setpairedDevices.toArray(new BluetoothDevice[setpairedDevices.size()]); 

    for(int i=0;i<pairedDevices.length;i++) { 
     if(pairedDevices[i].getName().contains(Device_Name)) { 
      device = pairedDevices[i]; 
      try { 
       socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
       receiveStream = socket.getInputStream(); 
       sendStream = socket.getOutputStream(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      break; 
     } 
    } 

    handler = hstatus; 

    receiverThread = new ReceiverThread(h); 
} 

public void sendData(String data) { 
    sendData(data, false); 
} 

public void sendData(String data, boolean deleteScheduledData) { 
    try { 
     sendStream.write(data.getBytes()); 
     sendStream.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void connect() { 
    new Thread() { 
     @Override public void run() { 
      try { 
       socket.connect(); 

       Message msg = handler.obtainMessage(); 
       msg.arg1 = 1; 
       handler.sendMessage(msg); 

       receiverThread.start(); 

      } catch (IOException e) { 
       Log.v("N", "Connection Failed : " + e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 
    }.start(); 
} 

public void close() { 


    try { 
     socket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    socket=null; //??? 
} 

public BluetoothDevice getDevice() { 
    return device; 
} 

private class ReceiverThread extends Thread { 
    Handler handler; 

    ReceiverThread(Handler h) { 
     handler = h; 
    } 

    @Override public void run() { 
     while(true) { 
      try { 
       if(receiveStream.available() > 0) { 
        byte buffer[] = new byte[1000]; 
        int k = receiveStream.read(buffer, 0, 1000); 

        if(k > 0) { 
         byte rawdata[] = new byte[k]; 
         for(int i=0;i<k;i++) 
          rawdata[i] = buffer[i]; 

         String data = new String(rawdata); 

         GlobalBuff= GlobalBuff+data; 
         Right_Buff= GlobalBuff.substring(GlobalBuff.length()-1,GlobalBuff.length()); 
         if(Right_Buff.equals("\n")){ 
          Message msg = handler.obtainMessage(); 
          Bundle b = new Bundle(); 
          b.putString("receivedData", GlobalBuff); 
          msg.setData(b); 
          handler.sendMessage(msg); 
          GlobalBuff=""; 

         } 

        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    } 
} 

我尝试了一些额外的代码:

receiverThread.interrupt(); 
    receiverThread=null; 

    if (receiveStream != null) { 
     try {receiveStream.close();} catch (Exception e) {} 
     receiveStream = null; 
    } 
    if (sendStream != null) { 
     try {sendStream.close();} catch (Exception e) {} 
     sendStream = null; 
    } 

关闭前,但结果是一样的,它的崩溃。 奇怪的行为是,它没有立即崩溃,因为它可能发生类型错误或其他(我正在谈论的行为在调试模式...)

如果有人有一个想法。

使用谷歌搜索将我带给这个问题的人,但没有解决方案,适用于我的情况。

感谢

UPDATE

我发现的痕迹,当它崩溃的是:

06-02 07:45:27.369 9025-9133/fr.icservice.sechage A/libc? Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1), thread 9133 (Thread-1436) 

我也是索尼Z3手机上做了一个试验5.0.2下(比较我的T210三星galaxy tab3下4.4.2),它不会崩溃..! 也许这是一个ROM错误?或Android版本问题...

+1

后从崩溃 – codeMagic

+0

堆栈跟踪如何得到充分的堆栈跟踪? logcat在应用程序崩溃时被清除? –

+0

我不确定它为什么被清除,但我们需要查看错误。否则,我们只是猜测。 – codeMagic

回答

1

这是Android上已知的问题(或错误?)。如果您关闭蓝牙套接字并稍后再访问它,则某些设备会因分段故障而崩溃(与您的一样)。一种常用的解决方法是在之前检查socket.isConnected()或通过设置closeWasCalled = true等标志来同步对close(), write(), read(), ...的访问,并在调用close()之后禁止在代码中调用此套接字的方法。

0

问题出在Socket Input/Output。我在与对等蓝牙设备断开连接时遇到此问题。

原因:

从代码中,我们试图read()write()socket对象/这是关闭连接。

解决方案:以上

添加检查socket.isConnected()前操作

你可以阅读更多关于堆栈溢出的问题这个问题:Here