12

TimerTaskアクティビティではなく、 (内部で作成されたService)次のコマンドを使用してデフォルトのBluetoothアダプタを取得しようとしている場合。

BluetoothAdapter.getDefaultAdapter();

次の例外が発生します。

Exception while invoking java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

私のアプリケーションにはアクティビティがありません-このアダプタをアクティビティから削除する可能性はありますか?

4

5 に答える 5

14

これはAndroidのバグのようですが、Android 4.0(Ice Cream Sandwich)にも引き続き存在します。

これを回避BluetoothAdapter.getDefaultAdapter()し、ワーカースレッド(AsyncTaskなど)から呼び出すことができるようにするBluetoothAdapter.getDefaultAdapter()には、メインUIスレッド(onCreate()現在のアクティビティ内など)で1回呼び出すだけです。

RuntimeExceptionは初期化中にのみスローされBluetoothAdapter.getDefaultAdapter()、最初に呼び出したときにのみ初期化されます。その後の呼び出しは、バックグラウンドスレッドでも成功します。

于 2013-02-23T02:42:04.267 に答える
6

スレッドの呼び出しBluetoothAdapter.getDefaultAdapter()UI機能しますが、あまり実用的ではありません。私は偽のアクティビティで回避策を試しましたが、そのような回避策が嫌いなので、エラーメッセージが実際に何を言っているかを読むことにしました。それは、スレッドが呼び出さなかったことに他なりませんLooper.prepare()

したがって、呼び出すLooper.prepare()直前に呼び出すとBluetoothAdapter.getDefaultAdapter()、UIスレッドだけでなく、どこでも問題を解決できるはずです。

これまでのところ、問題なく動作します。

于 2013-04-21T15:43:49.523 に答える
3

それがどれほど正しいかはわかりませんが、私はこのラッパー関数を追加しました:

static boolean m_calledLooperAlready = false;

BluetoothAdapter getDefaultBluetoothAdapter() {
    if ( !m_calledLooperAlready ) {
        try  {
            android.os.Looper.prepare();
        } catch ( RuntimeException e ) { e.printStackTrace(); }
        m_calledLooperAlready = true;
    }
    return BluetoothAdapter.getDefaultAdapter();
}

BluetoothAdapter.getDefaultAdapter()...そしてすべての出現箇所を。に置き換えましたgetDefaultBluetoothAdapter()。これは私にとっては問題なく動作します:2.2.1、2.3.3、4.0.4、4.3

于 2013-10-30T03:12:55.930 に答える
1

2.3.xに存在するが、4.xで修正された落とし穴に注意してください。BluetoothAdapter.getDefaultAdapter()メインアプリケーションスレッド以外のスレッドを呼び出す場合は、そのスレッドを呼び出す必要がLooper.prepare()あり、その後も呼び出す必要がありますLooper.loop()

そうしないと、私が遭遇した少なくとも1つの問題が発生しaccept()ます。最初に接続しようとすると成功しますがclose()、ServerSocketで使用した後でも、連続して試行しても成功しません。

getDefaultAdapter()これは、BluetoothAdapterの古い実装では、が呼び出されたスレッドで作成されたハンドラーに投稿されたメッセージによってSDPエントリのクリーンアップが行われるために発生します。

于 2013-10-02T01:59:06.577 に答える
0

getDefault()こんにちはKocusで呼び出されるメソッドはありませんBluetoothAdapter calss。そのはずBluetoothAdapter.getDefaultAdapter();

詳細については、このリンクをたどってください。

于 2011-05-07T11:05:02.677 に答える