2014-01-25 109 views
4

我试图开发一个Android应用程序,将图像从一台设备传输到另一台。接收到的图像将显示在我的应用程序的ImageView中。为了完成我的任务,我想发送一个位图的字节数组。我能够在imageview上获得第一张图片。但是,只要我点击按钮发送另一个图像,应用程序就无法发送位图。它向我展示了一个例外“java.io.IOException:服务fiscovery失败。”要成功发送任何图像,我需要在接收/远程设备上重新启动我的应用程序。任何人都可以请建议解决亩问题。 logcat也包含在下面。Android蓝牙:java.io.IOException:服务发现失败

代码建立连接:

 private class StartConnectionThread extends Thread{ 
    private final BluetoothSocket bluetoothSocket; 
    private final BluetoothDevice bluetoothDevice; 
    public StartConnectionThread(BluetoothDevice device){ 
     BluetoothSocket tempBluetoothSocket=null; 
     bluetoothDevice=device; 
     try 
     { 
      System.out.println(uuid); 
      tempBluetoothSocket=device.createRfcommSocketToServiceRecord(uuid); 
     } 
     catch(IOException ioException) 
     { 

     } 
     bluetoothSocket=tempBluetoothSocket; 
    } 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     bluetoothAdapter.cancelDiscovery(); 
     try 
     { 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      bluetoothSocket.connect(); 

     } 
     catch(IOException ioException) 
     { 
      System.out.println("bluetoothSocketInThread failed"); 
      try 
      { 
       bluetoothSocket.close(); 
      } 
      catch(IOException cancelIOException) 
      { 

      } 
      return; 
     } 
     manageConnectedSocket(bluetoothSocket); 
    } 
    public void cancel() 
    { 
     try 
     { 
      bluetoothSocket.close(); 
     } 
     catch(IOException ioException) 
     { 

     } 
    } 
} 

代码接受连接:

 private class AcceptConnectionThread extends Thread 
{ 
    private final BluetoothServerSocket bluetoothServerSocket; 
    public AcceptConnectionThread() { 
     // TODO Auto-generated constructor stub 
     System.out.println("constructor"); 
     BluetoothServerSocket tempBluetoothServerSocket=null; 
     try 
     { 
      tempBluetoothServerSocket=bluetoothAdapter.listenUsingRfcommWithServiceRecord("My Souvenirs", uuid); 
     } 
     catch(IOException ioException) 
     { 
     } 
     bluetoothServerSocket=tempBluetoothServerSocket; 
    } 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     BluetoothSocket bluetoothSocket=null; 
     while(true) 
     { 
      try 
      { 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       System.out.println(bluetoothServerSocket); 
       if(bluetoothServerSocket!=null) 
       { 
        bluetoothSocket=bluetoothServerSocket.accept(); 
       } 
       System.out.println("accept"); 
      } 
      catch(IOException ioException){ 
       break; 
      } 
      if(bluetoothSocket!=null) 
      { 
       manageConnectedSocket(bluetoothSocket); 
       try { 
        bluetoothServerSocket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       break; 
      } 
     } 
    } 
    public void cancel() 
    { 
     try{ 
      bluetoothServerSocket.close(); 
     } 
     catch(IOException ioException){ 

     } 
    } 

} 

代码来管理连接:

 private class ManageConnectedDevicesThread extends Thread 
{ 
    private final BluetoothSocket connectedBluetoothSocket; 
    public ManageConnectedDevicesThread(BluetoothSocket socket) { 
     // TODO Auto-generated constructor stub 
     connectedBluetoothSocket=socket; 
     InputStream tempInputStream=null; 
     OutputStream tempOutputStream=null; 
     try 
     { 
      tempInputStream=socket.getInputStream(); 
      tempOutputStream=socket.getOutputStream(); 
     } 
     catch(IOException ioException) 
     { 

     } 
     inputStream=tempInputStream; 
     outputStream=tempOutputStream; 
    } 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
        byte[] buffer=new byte[1024*8]; 
     int bytes; 
     while(true) 
     { 
      try 
      { 
       bytes=inputStream.read(buffer); 
       handler.obtainMessage(MESSAGE_READ,bytes,-1,buffer).sendToTarget(); 
       System.out.println("handler"); 
      } 
      catch(IOException ioException) 
      { 
       System.out.println("for handler:" +ioException); 
       break; 
      } 
     } 
    } 
    public void write(byte[] bytes) 
    { 
     try 
     { 
      outputStream.write(bytes); 
     } 
     catch(IOException ioException){ 
      System.out.println("exception in wrie tatement of managing connections"); 
     } 

    } 


    public void close() 
    { 
     try { 
      connectedBluetoothSocket.close(); 
     } catch (IOException e) { 
      // TODO: handle exception 
     } 
    } 
} 

代码重置连接:

为处理程序

代码如下所示:

private final Handler handler=new Handler(){ 
public void handleMessage(Message msg) { 
    switch (msg.what) { 
    case MESSAGE_READ: 
     System.out.println("MESSAGE_READ"); 
     byte[] readBuf = (byte[]) msg.obj; 
     // construct a string from the valid bytes in the buffer 
     String readMessage = new String(readBuf, 0, msg.arg1); 
     byte[] b=readMessage.getBytes(); 
     Bitmap bitmap1=BitmapFactory.decodeByteArray(readBuf, 0, readBuf.length); 
     imageView.setImageBitmap(bitmap1); 
     break; 
    } 

};

的logcat中显示以下内容:提前

01-25 14:49:31.800: D/dalvikvm(9451): Debugger has detached; object registry had 1 entries 
    01-25 14:49:38.380: V/BluetoothSocket.cpp(9451): initSocketNative 
    01-25 14:49:38.380: V/BluetoothSocket.cpp(9451): ...fd 40 created (RFCOMM, lm = 26) 
    01-25 14:49:38.380: V/BluetoothSocket.cpp(9451): initSocketFromFdNative 
    01-25 14:49:40.420: D/BluetoothUtils(9451): isSocketAllowedBySecurityPolicy start : device null 
    01-25 14:49:41.680: I/System.out(9451): bluetoothSocketInThread failed 
    01-25 14:49:41.680: V/BluetoothSocket.cpp(9451): abortNative 
    01-25 14:49:41.680: V/BluetoothSocket.cpp(9451): ...asocket_abort(40) complete 
    01-25 14:49:41.680: V/BluetoothSocket.cpp(9451): destroyNative 
    01-25 14:49:41.680: V/BluetoothSocket.cpp(9451): ...asocket_destroy(40) complete 

感谢。

+0

你能告诉我如何解决这个问题吗?我太绝望了...... –

+1

抱歉,迟到回复。由于服务连接需要几毫秒才能执行,只需等待大约一秒左右,然后运行您的代码。然后系统将检测连接的服务。 –

+0

谢谢你的男人。我会尝试。 –

回答

6

也许你可以尝试添加thread.sleep一秒?见this discussion

“我已经能够解决这个问题的唯一方法是通过关闭连接之前添加 的Thread.Sleep一秒钟”

也看到丹的两个连续的意见对this thread

“我能够得到这个只运行调用分离到 findBT()之后; openBT();

否则,mmSocket.connect();抛出一个异常,“服务发现 失败”

但如果我把findBT()放在onCreate(),只需使用按钮为 openBT();它工作正常。或者,如果我制作第二个按钮,每个按钮一个,它就可以正常工作。

对此提出建议?“

从第二评论摘录:

Set pairedDevices = mBluetoothAdapter.getBondedDevices(); 
mmDevice = mBluetoothAdapter.getRemoteDevice(“00:06:66:46:5A:91″); 
if (pairedDevices.contains(mmDevice)) 
{ 
statusText.setText(“Bluetooth Device Found, address: ” + mmDevice.getAddress()); 
Log.d(“ArduinoBT”, “BT is paired”); 
} 

,我进入我的蓝牙设备的地址原始代码 找到设备并返回正确的地址,但 mmSocket。 connect();生成异常“java.io.IOException: 服务发现失败”

建议?

+0

谢谢,它解决了我的问题。现在我在同一个应用程序中面临另一个问题。我的下一个问题的链接如下: http://stackoverflow.com/questions/21568601/successive-transfer-of-bitmap-via-bluetooth-generate-multiple-inputstream-read 希望ypu将帮助我也解决了这个问题。 再次感谢。 –