我正在尝试开发一个Android应用程序,将图像从一个设备传输到另一个设备.然后,接收到的图像将显示在我的应用程序内的ImageView上.为了完成我的任务,我想发送一个位图的字节数组.我能够在imageview上获得第一张图片.但是,只要我点击按钮发送另一个图像,应用程序就无法发送位图.它向我显示了一个异常"java.io.IOException:Service fiscovery failed".要成功发送任何图像,我需要在接收/远程设备上重新启动我的应用程序.任何人都可以建议解决mu问题.logcat也包含在下面.
建立连接的代码:
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 } } }
重置连接的代码:
void resetConnection() { if(inputStream!=null) { try { inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(outputStream!=null) { try { outputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(startConnectionThread!=null) { System.out.println("start wala active tha"); startConnectionThread.cancel(); } if(acceptConnectionThread!=null) { System.out.println("accept wala active tha"); acceptConnectionThread.cancel(); } if(manageConnectedDevicesThread!=null) { System.out.println("manage wala active tha"); manageConnectedDevicesThread.close(); } } }
处理程序的代码如下所示:
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
提前致谢.