3

デバイスへの接続に SPP プロファイルを使用しています。

    Set<BluetoothDevice> devices = ba.getBondedDevices();
    for(BluetoothDevice bd : devices)
    {
        String name = bd.getName();
        if(name.equals("CELLMETER"))
        {
            try
            {
                BluetoothSocket bs = bd.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
                bs.connect();
            } catch (IOException e)
            {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }

すべて問題ないようです。入出力バッファを閉じてソケットを閉じる関数を作成しました。しかし、アプリケーションがクラッシュしたり、ブレークポイントが到着したときにアプリケーションを停止したりすると、プロセスを手動で強制終了した後でもソケットが閉じず、アプリの新しいインスタンスからの新しい接続には使用できません。

私が間違っているのは何ですか?クラッシュ/デバッグ操作ごとに、電話を再起動する必要があります:(

Android 2.3.5 (Samsung 5830i) および Android 4.0.4 (Freelander P10) でのみ発生します。Android 4.2.1 (Galaxy Nexus) では、アプリがクラッシュした後、接続が自動的に閉じられます。(新しい Bluetooth スタックがあるためと思われます)

4

2 に答える 2

2

それを解決するための 2 つのオプションを確認できます。

        mUEHandler = new Thread.UncaughtExceptionHandler()
        {
            @Override
            public void uncaughtException(Thread t, Throwable e)
            {
                // Close any opened sockets here

                defaultUEH.uncaughtException(t, e);
            }
        };

        Thread.setDefaultUncaughtExceptionHandler(mUEHandler);

しかし、それはアプリのクラッシュを処理するだけです. ユーザーがアプリを強制終了すると、そこにはまったくアクセスできなくなります。

2-アプリの再起動時にソケットを閉じることができるソケットIDを保存します。

完璧ではありませんが、問題を回避できます。

于 2013-01-21T09:25:25.710 に答える
2

独自のプロセスで実行されている Service によって BluetoothSockets を管理できるようにすることで、この問題を解決しました。サービスとの間でメッセージをやり取りすることで、ソケットを開き、閉じ、読み取り、書き込みます。アプリがクラッシュした場合、サービスは正常にシャットダウンされ、ソケットが閉じられます。(アプリと同じプロセスで実行していると、きれいにシャットダウンしません。)

于 2013-07-17T00:24:23.047 に答える