1

サウンドレコーダー Android スレッドがあり、録音中にマイク/ヘッドセットが接続されているかどうかを知る必要があるため、スレッド内で BroadcastReceiver() を使用する必要があります。どうすれば登録できますか? this.registerReceiver() はアクティビティ内でのみ機能するため、機能しません。

スレッド内でブロードケースレシーバーを使用するのが得策ではない場合、解決策は何ですか?

アクティビティ内で機能し、スレッド内では機能しないコードを次に示します。

    headsetReceiver = new BroadcastReceiver() {
        @Override
            public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.i("Broadcast Receiver", action);
            if ((action.compareTo(Intent.ACTION_HEADSET_PLUG)) == 0) // if
                                                                        // the
                                                                        // action
                                                                        // match
                                                                        // a
                                                                        // headset
                                                                        // one
            {
                int headSetState = intent.getIntExtra("state", 0); // get
                                                                    // the
                                                                    // headset
                                                                    // state
                                                                    // property
                int hasMicrophone = intent.getIntExtra("microphone", 0);// get
                                                                        // the
                                                                        // headset
                                                                        // microphone
                                                                        // property
                if ((headSetState == 0) && (hasMicrophone == 0)) // headset
                                                                    // was
                                                                    // unplugged
                                                                    // &
                                                                    // has
                                                                    // no
                                                                    // microphone
                {
                    // do whatever
                }
            }
        }
    };

    this.registerReceiver(headsetReceiver, new IntentFilter(
            Intent.ACTION_HEADSET_PLUG));
4

1 に答える 1

1

コンテキストを Thread コンストラクターに渡し、それを使用してブロードキャスト レシーバーを登録する必要があります。

//this.ctx is passed to the Thread constructor
this.ctx.registerReceiver(headsetReceiver, new IntentFilter(
            Intent.ACTION_HEADSET_PLUG));

スレッドの finally{} で受信者を登録解除することを忘れないでください。そうしないと、リークが発生する可能性があります。

finally{
       ctx.unregisterReceiver(headsetReceiver);
}

メイン スレッド (アクティビティなど) 内の UI を変更するには、ハンドラーをセットアップする必要があります。

于 2012-09-04T20:30:31.337 に答える