2010-12-10 6 views
9

Ich habe ein seltsames Problem mit Bluetooth-Buchse. Wenn ich Socket erstellen und später Anwendung schließen, frieren Android-Gerät mit sehr hoher CPU-Auslastung.Android Bluetooth Socket Freeze-Anwendung

Hier ist mein Beispielcode:

// open socket 
    public ConnectThread(final BluetoothDevice device) { 
    Log.v(ConnectThread.class.getName(), "Try to get a socket"); 

    try { 
     this.socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
    } catch (IOException e) { 
     Log.e(ConnectThread.class.getName(), e.getMessage()); 
    } 

    Log.v(ConnectThread.class.getName(), "Got a socket"); 
    } 

    // close it 
    public void cancel() { 
    try { 
     Log.v(ConnectThread.class.getName(), "cancel"); 
     this.socket.close(); 
    } catch (IOException e) { 
     Log.e(ConnectThread.class.getName(), e.getMessage()); 
    } 
    } 

dispite, die I-Buchse mit close() Methode schließen, ich verstehe nicht, warum Android-Gerät freeze nach meiner App zu schließen. Bitte beachten Sie, dass es nur Socket erstellt, aber nicht angeschlossen ...

EDIT:

OK, es Beispielcode:

package com.ss.test; 

import java.io.IOException; 
import java.util.UUID; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.os.Bundle; 
import android.util.Log; 

public class testBump extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    BluetoothDevice device = this.bluetoothAdapter.getRemoteDevice("58:B0:35:6F:8E:C7"); 

    Log.e(testBump.class.getName(), "Try to get a socket"); 

    try { 
     this.socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
    } catch (IOException e) { 
     Log.e(testBump.class.getName(), e.getMessage()); 
    } 

    Log.e(testBump.class.getName(), "Got a socket"); 

    Log.e(testBump.class.getName(), "DESTROY"); 

    try { 
     this.socket.close(); 
    } catch (IOException e) { 
     Log.e(testBump.class.getName(), e.getMessage()); 
    } 

    Log.e(testBump.class.getName(), "DESTROYED"); 

    } 

    @Override 
    public void onDestroy() { 
    super.onDestroy(); 
    } 

    private BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    private BluetoothSocket socket = null; 
} 

und log:

12-16 11:42:40.558: ERROR/com.ss.test.testBump(3161): Try to get a socket 
12-16 11:42:40.558: DEBUG/BluetoothSocket.cpp(3161): initSocketNative 
12-16 11:42:40.558: INFO/BLZ20_WRAPPER(3161): blz20_wrp_socket: fam 31, type 1, prot BTPROTO_RFCOMM 
12-16 11:42:40.558: DEBUG/BLZ20_WRAPPER(3161): blz20_init: initializing... 
12-16 11:42:40.558: DEBUG/BTL_IFC_WRP(3161): wsactive_init: init active list 
12-16 11:42:40.562: INFO/BTL_IFC(3161): main_client_thread: Client main thread starting 
12-16 11:42:40.651: DEBUG/MediaProvider(2590): mMediaScannerReceiver - intent.getAction : android.intent.action.ACTION_MEDIA_SCANNER_PROGRESS 
12-16 11:42:40.769: DEBUG/MediaScanner(2590): Normal 556 done (3600msec) 
12-16 11:42:40.769: DEBUG/MediaScanner(2590): Sync.. 
12-16 11:42:40.851: DEBUG/MediaScanner(2590): Start Nazca /mnt/sdcard/external_sd 
12-16 11:42:40.851: ERROR/MediaScanner(2590): Cannot get device path from mount info. Check SD Unmounted. 
12-16 11:42:40.851: DEBUG/MediaScanner(2590): Normal Meta & DB Insert/Update Start 
12-16 11:42:40.851: DEBUG/MediaScanner(2590): Normal 0 done (1msec) 
12-16 11:42:40.855: DEBUG/MediaScanner(2590): postscan enter: directories - /mnt/sdcard 
12-16 11:42:40.874: DEBUG/MediaScanner(2590): start checking FileCacheEntry 
12-16 11:42:40.878: DEBUG/MediaScanner(2590): end checking FileCacheEntry 
12-16 11:42:40.940: DEBUG/MediaScanner(2590): postscan return 
12-16 11:42:40.940: DEBUG/MediaScanner(2590): prescan time: 109ms 
12-16 11:42:40.940: DEBUG/MediaScanner(2590):  scan time: 8327ms 
12-16 11:42:40.940: DEBUG/MediaScanner(2590): postscan time: 86ms 
12-16 11:42:40.940: DEBUG/MediaScanner(2590): total time: 8522ms 
12-16 11:42:40.956: DEBUG/MediaProvider(2590): mMediaScannerReceiver - intent.getAction : android.intent.action.MEDIA_SCANNER_FINISHED 
12-16 11:42:40.960: ERROR/CscReceiver(2585): onReceive android.intent.action.MEDIA_SCANNER_FINISHED 
12-16 11:42:40.960: DEBUG/CscReceiver(2585): isCSCimage 
12-16 11:42:40.960: INFO/global(2585): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required. 
12-16 11:42:40.960: DEBUG/CscParser(2585): ID_path =/system/SW_Configuration.xml 
12-16 11:42:40.960: DEBUG/CscParser(2585): return ok ID path /system/SW_Configuration.xml 
12-16 11:42:40.960: DEBUG/CscReceiver(2585): Media DB Scanner finished. 
12-16 11:42:40.960: ERROR/CscReceiver(2585): check_9 
12-16 11:42:40.972: VERBOSE/MediaProvider(2590): Resuming ThumbWorker 
12-16 11:42:40.972: INFO/MediaProvider(2590): MediaScanner stopped!!! 
12-16 11:42:40.983: DEBUG/MediaScannerService(2590): done scanning volume external 
12-16 11:42:40.983: INFO/MediaScannerService(2590): [email protected] 
12-16 11:42:41.034: INFO/TEST(3050): Got intent with action Intent { act=android.intent.action.MEDIA_SCANNER_FINISHED dat=file:///mnt/sdcard cmp=com.cooliris.media/com.cooliris.cache.BootReceiver (has extras) } 
12-16 11:42:41.034: DEBUG/BootReceiver(3050): ACTION_MEDIA_SCANNER_FINISHED: path = /mnt/sdcard 
12-16 11:42:41.034: DEBUG/BootReceiver(3050): ImageManager.hasStorage()truetrue 
12-16 11:42:41.190: INFO/CacheService(3050): Refreshing cache. 
12-16 11:42:41.190: ERROR/DiskCache(3050): Delete All Cache Files!!! 
12-16 11:42:41.210: ERROR/MTPRx(3059): In MtpReceiverandroid.intent.action.MEDIA_SCANNER_FINISHED 
12-16 11:42:41.214: WARN/MTPRx(3059): Media scanning is finished 
12-16 11:42:41.214: INFO/System.out(3059): setting Media scanner status0 
12-16 11:42:41.214: INFO/System.out(3059): After setting Media scanner status0 
12-16 11:42:41.245: WARN/BackupManagerService(2496): dataChanged but no participant pkg='com.android.providers.settings' uid=10035 
12-16 11:42:41.249: DEBUG/MediaScannerReceiver(2590): onReceive : EXTERNAL scan FINISHED. 
12-16 11:42:41.261: DEBUG/MediaReceiver(3065): MEDIA SCANNER FINISHED. 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_init: success 
12-16 11:42:41.562: INFO/BTL_IFC(3161): BTL_IFC_RegisterSubSystem: Register subsystem [BTS] 
12-16 11:42:41.562: INFO/BTL_IFC(3161): btl_ifc_ctrl_connect: Connect control channel for subsystem [BTS] 
12-16 11:42:41.562: DEBUG/BTL_IFC_WRP(3161): wrp_sock_create: CTRL 
12-16 11:42:41.562: DEBUG/BTL_IFC_WRP(3161): wrp_alloc_new_sock: wrp_alloc_new_sock sub 1 
12-16 11:42:41.562: DEBUG/BTL_IFC_WRP(3161): wrp_sock_create: 32 
12-16 11:42:41.562: DEBUG/BTL_IFC_WRP(3161): wrp_sock_connect: wrp_sock_connect brcm.bt.dtun:9000 (32) 
12-16 11:42:41.562: DEBUG/BTL_IFC_WRP(3161): DTUN_MAKE_LOCAL_SERVER_NAME return name: brcm.bt.dtun.9000 
12-16 11:42:41.562: INFO/BTL-IFS(2751): main_server_thread: [CTRL] Client connected (22) 
12-16 11:42:41.562: INFO/BTL_IFC_WRP(3161): wrp_sock_connect: Connected. (32) 
12-16 11:42:41.562: INFO/BTL_IFC(3161): send_ctrl_msg: [BTL_IFC CTRL] send BTLIF_REGISTER_SUBSYS_REQ (BTS) 0 pbytes (hdl 32) 
12-16 11:42:41.562: INFO/BTL-IFS(2751): attach_client: multiclient index 1 
12-16 11:42:41.562: INFO/BTL-IFS(2751): attach_client: ######## Attached client subsystem BTS (22) ######## 
12-16 11:42:41.562: INFO/BTL-IFS(2751): btl_if_notify_local_event: Notify local event BTLIF_SUBSYSTEM_ATTACHED 
12-16 11:42:41.562: DEBUG/(2751): btlif_bts_api_ctrl_cb: btlif_bts_api_ctrl_cb : id BTLIF_SUBSYSTEM_ATTACHED (4112) on hdl 22 
12-16 11:42:41.562: INFO/(2751): btlif_rfc_ctrl_chan_attached: client attached ctrl handle 22 
12-16 11:42:41.562: DEBUG/BTL-IFS(2751): send_registration_rsp: send_registration_rsp [0] 
12-16 11:42:41.562: INFO/BTL-IFS(2751): send_ctrl_msg: [BTL_IFS CTRL] send BTLIF_REGISTER_SUBSYS_RSP (CTRL) 2 pbytes (hdl 22) 
12-16 11:42:41.562: DEBUG/BTL_IFC(3161): BTL_IFC_RegisterSubSystem: add new ctrl fd to active set 
12-16 11:42:41.562: DEBUG/BTL_IFC_WRP(3161): wrp_wsock_create: BTS 
12-16 11:42:41.562: DEBUG/BTL_IFC_WRP(3161): wrp_alloc_new_sock: wrp_alloc_new_sock sub 15 
12-16 11:42:41.562: DEBUG/BTL_IFC_WRP(3161): wrp_wsock_create: 33 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): btsk_alloc_add: success 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_socket: return 33 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_setsockopt: fd (-1:33), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_setsockopt: configure rfcomm lm mode 0x26, (master:0, auth 1, enc 1) 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_setsockopt: success 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_setsockopt: fd (-1:33), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_setsockopt: configure rfcomm sndbuf len 71680 bytes 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_setsockopt: success 
12-16 11:42:41.562: DEBUG/BluetoothSocket.cpp(3161): ...fd 33 created (RFCOMM, lm = 26) 
12-16 11:42:41.562: DEBUG/BluetoothSocket.cpp(3161): initSocketFromFdNative 
12-16 11:42:41.562: DEBUG/ASOCKWRP(3161): asocket_init 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: s 33, cmd 3 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: fd (-1:33), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: s 33, cmd 4 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: fd (-1:33), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: transparant fcntl 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: s 35, cmd 3 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: wsock not found, pass through transparantly 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: s 35, cmd 4 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_fcntl: wsock not found, pass through transparantly 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_set_asocket: success (33,34,35) 
12-16 11:42:41.562: ERROR/com.ss.test.testBump(3161): Got a socket 
12-16 11:42:41.562: ERROR/com.ss.test.testBump(3161): DESTROY 
12-16 11:42:41.562: DEBUG/BluetoothSocket.cpp(3161): abortNative 
12-16 11:42:41.562: DEBUG/ASOCKWRP(3161): asocket_abort [33,34,35] 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_shutdown: s 33, how 2 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_shutdown: fd (-1:33), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_shutdown: shutdown socket 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_write: wrote 1 bytes out of 1 on fd 35 
12-16 11:42:41.562: DEBUG/BluetoothSocket.cpp(3161): ...asocket_abort(33) complete 
12-16 11:42:41.562: DEBUG/BluetoothSocket.cpp(3161): destroyNative 
12-16 11:42:41.562: DEBUG/ASOCKWRP(3161): asocket_destroy 
12-16 11:42:41.562: DEBUG/ASOCKWRP(3161): asocket_abort [33,34,35] 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_shutdown: s 33, how 2 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_shutdown: fd (-1:33), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_shutdown: shutdown socket 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_write: wrote 1 bytes out of 1 on fd 35 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_close: s 35 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_close: std close (35) 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_close: s 34 
12-16 11:42:41.562: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_close: std close (34) 
12-16 11:42:41.562: INFO/BLZ20_WRAPPER(3161): blz20_wrp_close: s 33 
12-16 11:42:41.569: DEBUG/BLZ20_WRAPPER(3161): blz20_wrp_close: fd (-1:33), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0 
12-16 11:42:41.569: INFO/BLZ20_WRAPPER(3161): __close_prot_rfcomm: fd 33 
12-16 11:42:41.569: DEBUG/BTL_IFC(3161): BTL_IFC_CtrlSend: BTL_IFC_CtrlSend 
12-16 11:42:41.569: INFO/BTL_IFC(3161): send_ctrl_msg: [BTL_IFC CTRL] send BTLIF_BTS_RFC_CLOSE (BTS) 8 pbytes (hdl 32) 
12-16 11:42:41.569: DEBUG/(2751): btlif_bts_api_ctrl_cb: btlif_bts_api_ctrl_cb : id BTLIF_BTS_RFC_CLOSE (4468) on hdl 22 
12-16 11:42:41.569: DEBUG/(2751): btlif_rfc_close: scn 0, sock 33 
12-16 11:42:41.569: INFO/(2751): btlif_rfc_close: channel not found scn 0, sock 33 
12-16 11:42:41.569: DEBUG/BTL_IFC_WRP(3161): wrp_close_s_only: wrp_close_s_only [33] (33:-1) [] 
12-16 11:42:41.569: DEBUG/BTL_IFC_WRP(3161): wrp_close_s_only: data socket closed 
12-16 11:42:41.569: DEBUG/BTL_IFC_WRP(3161): wsactive_del: delete wsock 33 from active list [ad3f5f70] 
12-16 11:42:41.569: DEBUG/BTL_IFC_WRP(3161): wrp_close_s_only: wsock fully closed, return to pool 
12-16 11:42:41.569: DEBUG/BLZ20_WRAPPER(3161): btsk_free: success 
12-16 11:42:41.569: DEBUG/BluetoothSocket.cpp(3161): ...asocket_destroy(33) complete 
12-16 11:42:41.569: ERROR/com.ss.test.testBump(3161): DESTROYED 

Wie Sie aus dem Protokoll sehen können, wurde der Socket erfolgreich geschlossen. Jetzt beenden Sie von der App (es wird im Hintergrund ausgeführt), zum Task-Manager und kill app. In diesem Moment wird Android-Gerät mit sehr hoher CPU-Auslastung einfrieren.

EDIT 2:

Ich fand, reproduzieren, dass Problem auf Samsung GALAXY Tab einziges Gerät. Zum Beispiel kann ich es nicht mit meinem HTC Desire reproduzieren.

+0

Alex, Am 01.04 gesagt, Sie dies mit einem Firmware-Update behoben wurde. Könnten Sie bitte teilen, welche Träger Galaxy Tab, die Sie haben und die Build-Nummer, die das Problem für Sie behoben? Dies finden Sie unter Einstellungen> Über das Gerät> Build-Nummer. Am meisten geschätzt. Vielen Dank! – Amarok

Antwort

1

OK, es ist ein Samsung GALAXY Tab Fehler, so wartet Android Update ...

UPDATE: in neuen Firmware behoben haben!

+0

meine Firmware ist auf dem neuesten Stand, aber ich habe immer noch dieses Problem. Verwenden Sie auch die Registerkarte Samsung GALAXY. – moonlightcheese

+0

versuchen, cyanogenmod installieren –

+0

@AlexIvasyuv Leider ist dies kaum ein guter Rat, jemand, der eine App veröffentlicht, kann seine Kunden nicht zwingen, eine Mod auf ihrem Tablet zu installieren, für die - soweit ich weiß - müssen Sie root das Gerät! – AgentKnopf

0

Wurde der Socket erfolgreich erstellt, bevor die Methode Close() aufgerufen wurde? Ich würde versuchen, den Socket auf Null vor dem Aufruf von CreateRfcommSocketToServiceRecord (UUID) zu initialisieren Das Bluetooth Chat-Beispiel tut dies .. Hier ist ein Ausschnitt.

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); 
     } catch (IOException e) { 
      Log.e(TAG, "create() failed", e); 
     } 
     mmSocket = tmp; 
    } 

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

Ja, Socket wurde erfolgreich erstellt und auf Null initialisiert. –

0

Schauen Sie sich den Code an, der cancel() aufruft. Sehen Sie sich insbesondere die Behandlung von Laufzeitausnahmen an, die von cancel() ausgelöst wurden. Der obige Code löst eine NPE aus, wenn cancel() aufgerufen wird, nachdem ConnectThread() eine Ausnahme abfängt.

Überprüfen Sie auch alle Schleifen, in denen Sie eine Operation unter socket durchführen. Sobald der close() aufgerufen wird, werfen connect(), getInputStream() und getOutputStream() IOEs.

+0

Keine Ausnahme in LogCat. –

0

Haben Sie versucht, in traceview zu suchen? Welche Methode blockiert die CPU? Das könnte Ihnen einige Einblicke in dieses Problem geben. Auch wenn dies nur auf einem bestimmten Gerät geschieht, sollten Sie in der Lage sein, mit TraceView zu finden.

+0

Ja, es gibt nichts Ungewöhnliches. –

0

Ich habe das gleiche Problem, aber im Server-Modus, wenn ich BluetoothServerSocket verwendet. Ich benutzte system.exit (0), um die Anwendung zu beenden, die ich irgendwo las, das nicht empfohlen wird. Ich habe den system.exit (0) -Aufruf entfernt und ich habe kein Freeze-Problem. (Aber wenn ich die App dann töte, zeigt es das Einfrieren).

Hat jemand ein Problem im Server-Modus, wenn manchmal der SDP-Datensatz nicht gelöscht wird?

0

Obwohl ich nicht ermitteln kann, wie dieses Problem tatsächlich verhindert wird, habe ich das gleiche Problem. Nach einigen Nachforschungen scheint es ein Problem mit dem Broadcom Bluetooth Stack zu geben. Um die Frage zu beantworten, welcher Prozess die CPU-Geisel hält, ist es btld.

meinen anderen Beitrag sehen, was noch niemand beantwortet hat: Btld consuming resources after application stop?

4

Eine Lösung I (für ein Samsung Galaxy mini) gefunden arbeiten - das ist recht unfreundlich an den Benutzer, und nicht gut „Design“ (aber der broadcom Firmware-Bug ist nicht gut „Design“ sowieso) - aber es ist besser als das Telefon freeze des Benutzers lassen - ist das bluetooth auszuschalten, nachdem wir fertig ist:

In meinen beiden onDestroy() und onBackPressed() - Ich rufe meine cleanup() - Funktion auf, die in etwa so aussieht:

if(mBluetoothAdapter != null) 
{   
mBluetoothAdapter.disable();    
}  
mBluetoothAdapter = null; 
+2

hinweis: das gleiche telefon "einfrieren" (auf samsung galaxy mit broadcom bt stack) nach bt verwendung passiert mit der offiziellen android sdk bluetooth_chat beispielanwendung zu - das gleiche problem - so ist es offensichtlich keine programmierung "design" isse. – kasidit