2014-01-25 4 views
4

Я пытаюсь разработать приложение для Android, которое передает изображения с одного устройства на другое. Полученное изображение затем будет показано в ImageView внутри моего приложения. Чтобы достичь своей задачи, я решил отправить массив байтов растрового изображения. Я могу получить первое изображение на изображении. Но, как только я нажимаю кнопку, чтобы отправить другое изображение, приложение не может отправить растровое изображение. Это показывает мне исключение «java.io.IOException: Service fiscovery failed.» Чтобы отправить любое изображение, мне нужно, чтобы перезапустил приложение на принимающем/удаленном устройстве. Может кто-нибудь предложить решение проблемы с mu. Локальный код также был включен ниже.Android Bluetooth: 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 
     } 
    } 
} 

код для сброса соединения:

  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 

Спасибо заранее.

+0

Можете ли вы рассказать мне, как решить проблему? Я так отчаянно ... –

+1

Извините за поздний ответ. Поскольку для подключения к службе требуется несколько миллисекунд, просто подождите около секунды или около того, а затем запустите свой код. Затем система обнаружит подключенную услугу. –

+0

Спасибо, человек. Я попробую. –

ответ

6

Возможно, вы можете попробовать добавить thread.sleep в течение секунды? См this discussion:

«Единственный способ, которым я был в состоянии решить эту проблему является добавление Thread.sleep на секунду перед закрытием соединения»

также увидеть два последовательных комментарии DAN на 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”); 
} 

, где я вошел в адрес моего устройства Bluetooth Исходный код находит устройство и возвращает правильный адрес, но mmSocket. подключения(); генерирует исключение «java.io.IOException: открытие службы не удалось»

Предложений

? 10
+0

Спасибо, он решил мою проблему. И теперь я столкнулся с другой проблемой в том же приложении. Ссылка на мой следующий вопрос выглядит следующим образом: http://stackoverflow.com/questions/21568601/successive-transfer-of-bitmap-via-bluetooth-generate-multiple-inputstream-read Надеюсь, что ypu поможет мне решая эту проблему. Еще раз спасибо. –

Смежные вопросы