2013-03-13 16 views
8

Zajmuję się tworzeniem aplikacji dla systemu Android. Ta aplikacja powinna komunikować się z urządzeniem Bluetooth (BT) (wysyłając kilka bajtów). Mam problem z debugowaniem/uruchomieniem tej aplikacji na moim urządzeniu (Samsung Galaxy mini). Kiedy utworzę gniazdo BT i przestanę debugować, telefon się zawiesi i muszę go zrestartować, wyciągając baterię. W przypadku uruchomienia tej aplikacji (z Eclipse) wszystko jest w porządku, ale kiedy próbuję uruchomić to ponownie, telefon się zawiesi i aplikacja nie jest zainstalowana. Jeśli spróbuję odinstalować tę aplikację ręcznie przed drugim uruchomieniem, telefon ponownie zamrozi. Oto problematyczny kod:Zamrożenie gniazda Bluetooth telefonu

private final BluetoothDevice mmDevice; 
private UUID uuid; 

public ConnectionThread(BluetoothDevice device) { 
    Log.d(TAG, "create ConnectionThread"); 

    uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    BluetoothSocket tmp = null; 
    mmDevice = device; 

    try { 
     tmp = mmDevice.createRfcommSocketToServiceRecord(uuid); 
    } catch (IOException e) { } 
    mmSocket = tmp; 
    socketConnected = true; 
} 

To jest konstruktor nici. Po dodaniu komentarza do linii telefon nie jest zamrożony, więc problem z tworzeniem gniazda (brak połączenia). Ponowne uruchamianie telefonu po każdym debugowaniu lub uruchomieniu jest dość denerwujące i muszę jeszcze wykonać wiele pracy.

Jeśli uruchomię tę aplikację z telefonu (odłączono od Eclipse), działa ona bez żadnych problemów. Wszelkie pomysły, gdzie może być problem lub jak to naprawić? Dziękuję Ci.

+3

Brzmi jak błąd oprogramowania, prawda? –

+0

@CodePainters: oprogramowanie układowe lub błąd IDE. Znalazłem ten sam temat: http://stackoverflow.com/questions/4408287/android-bluetooth-socket-freeze-application. Więc jeśli wyłączyłem BT w wywołaniu zwrotnym onDestroy, wszystko jest w porządku. – DanielH

+1

IDE? Mało prawdopodobne. A Android jest pełen błędów i tak ... –

Odpowiedz

0

Używam również mini SGSIII do rozwoju. Poniższy kod działa dobrze dla mnie:

private class ConnectThread extends Thread { 
    private final BluetoothSocket mmSocket; 
    private final BluetoothDevice mmDevice; 

    public ConnectThread(BluetoothDevice device) { 
     mmDevice = device; 

     BluetoothSocket tmp = null; 

     // Get a BluetoothSocket for a connection with the 
     // given BluetoothDevice 
     try { 
      //tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
      tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "create() failed", e); 
     } 
     mmSocket = tmp; 

     Main.myBluetoothSocket = mmSocket; 
     Main.myBluetoothDevice = mmDevice; 
    } 

    @Override 
    public void run() { 
     Log.i(LOG_TAG, "BEGIN mConnectThread"); 
     setName("ConnectThread"); 

     // Always cancel discovery because it will slow down a connection 
     mAdapter.cancelDiscovery(); 

     // Send a failure message back to the Activity 
     Message msg = mHandler.obtainMessage(MESSAGE_TOAST); 
     Log.e(LOG_TAG, "Attempting connection to " + mmSocket.getRemoteDevice().getName()); 
     String ss = "Attempting connection to " + mmSocket.getRemoteDevice().getName(); 
     Bundle bundle = new Bundle(); 
     bundle.putString(TOAST, ss); 
     msg.setData(bundle); 
     mHandler.sendMessage(msg); 

     // Make a connection to the BluetoothSocket 
     try { 
      // This is a blocking call and will only return on a 
      // successful connection or an exception 
      mmSocket.connect(); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "*+*+*+* Connection Failed"); 
      connectionFailed(); 
      // Close the socket 
      try { 
       mmSocket.close(); 
      } catch (IOException e2) { 
       Log.e(LOG_TAG, "unable to close() socket during connection failure", e2); 
      } 
      // Start the service over to restart listening mode 
      BluetoothCommandService.this.start(); 
      return; 
     } 

     // Reset the ConnectThread because we're done 
     synchronized (BluetoothCommandService.this) { 
      mConnectThread = null; 
     } 

     // Start the connected thread 
     connected(mmSocket, mmDevice); 
    } 

    public void cancel() { 
     try { 
      mmSocket.close(); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "close() of connect socket failed", e); 
     } 
    } 
} 
0

Jestem również stoi sam problem, można zastosować metodę analityczną będzie działać

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
BluetoothSocket socket = socket = (BluetoothSocket) m.invoke(device, 1); 
Powiązane problemy