12

こんにちは私は、ヘッドフォンが携帯電話から取り外されたときにイベントを生成するアプリケーションに取り組んでいます。私は受信方法で放送受信機を作成しました

public void onReceive(Context context, Intent intent) {

        // TODO Auto-generated method stub
        String action = intent.getAction();
        Log.i("Broadcast Receiver", "Hello");
        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
            }
        }           

    }

このメソッドを次のように呼び出す

 IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
        HeadSetBroadCastReceiver receiver = new HeadSetBroadCastReceiver();
        registerReceiver( receiver, receiverFilter );

また、私はこれをマニフェストに次のように登録しました

   <receiver android:name=".HeadsetBroadCastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_HEADSET_PLUG"/>
    </intent-filter>
</receiver>

と許可

しかし、これは機能しません誰もがこれを通して私を導くことができますか?

4

5 に答える 5

24

トリッキーな点ですが、BroadCastを次のように使用できます。アクティビティで私とうまく連携します。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myReceiver = new HeadSetReceiver();
} 

onResume()メソッドでブロードキャストを登録します

public void onResume() {
    IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    registerReceiver(myReceiver, filter);
    super.onResume();
}

次に、アクティビティでBroadCastを宣言します

private class HeadSetReceiver extends BroadcastReceiver {
    @Override public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            int state = intent.getIntExtra("state", -1);
            switch (state) {
            case 0:
                Log.d(TAG, "Headset unplugged");
                break;
            case 1:
                Log.d(TAG, "Headset plugged");
                break;
            }
        }
    }
}

それが助けになることを願っています、、、

于 2013-06-28T10:04:37.430 に答える
3

ここでの問題は、このブロードキャストにフラグIntent.FLAG_RECEIVER_REGISTERED_ONLYが設定されていることです。これは、マニフェスト受信者がそれをキャッチしないことを意味します。ここに完全な説明があります。

于 2012-07-30T08:28:16.697 に答える
2

私の質問への答えはこれでした..一人一人に返信してくれてありがとう

class NoisyAudioStreamReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) {
        if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
           // pause();
            Log.d("Mesage","Unplug");
            Toast.makeText(context, "Heello",Toast.LENGTH_LONG).show();
        }
    }
}
 IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
        NoisyAudioStreamReceiver receiver = new NoisyAudioStreamReceiver();
        registerReceiver( receiver, intentFilter );

于 2012-07-30T08:18:59.120 に答える
0

onReceive内でブレークポイントを切り替え、ハンドセットデバイスをプラグインするときに受信するイベントの種類をデバッグモードで確認することをお勧めします。そして、Intent.ACTION_HEADSET_PLUGの代わりにこのイベントを挿入してください。ありがとうございます。

于 2012-07-30T06:58:26.940 に答える
0

それぞれの意図で放送受信機を登録することに問題があると思います。この投稿を参照して、うまくいくかどうかを確認してください。

logcatの例外

07-30 12:41:01.448: E/ActivityThread(321): Activity com.example.test.MainActivity has leaked IntentReceiver com.example.test.BroadcastsHandler@44ee81d8 that was originally registered here. Are you missing a call to unregisterReceiver()?
07-30 12:41:01.448: E/ActivityThread(321): android.app.IntentReceiverLeaked: Activity com.example.test.MainActivity has leaked IntentReceiver com.example.test.BroadcastsHandler@44ee81d8 that was originally registered here. Are you missing a call to unregisterReceiver()?
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:939)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:734)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:791)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ContextImpl.registerReceiver(ContextImpl.java:778)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ContextImpl.registerReceiver(ContextImpl.java:772)
07-30 12:41:01.448: E/ActivityThread(321):  at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
07-30 12:41:01.448: E/ActivityThread(321):  at com.example.test.MainActivity.onCreate(MainActivity.java:19)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-30 12:41:01.448: E/ActivityThread(321):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 12:41:01.448: E/ActivityThread(321):  at android.os.Looper.loop(Looper.java:123)
07-30 12:41:01.448: E/ActivityThread(321):  at android.app.ActivityThread.main(ActivityThread.java:4627)
07-30 12:41:01.448: E/ActivityThread(321):  at java.lang.reflect.Method.invokeNative(Native Method)
07-30 12:41:01.448: E/ActivityThread(321):  at java.lang.reflect.Method.invoke(Method.java:521)
07-30 12:41:01.448: E/ActivityThread(321):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-30 12:41:01.448: E/ActivityThread(321):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-30 12:41:01.448: E/ActivityThread(321):  at dalvik.system.NativeStart.main(Native Method)

これは私が私のプロジェクトの1つに放送受信機を登録した方法です:

onCreate:

$////////////////broadcast reciever/////////////
    IntentFilter iFilter = new IntentFilter();
    iFilter.addAction(handler.ACTION);
    iFilter.addCategory(Intent.CATEGORY_DEFAULT);
    handler = new HandleTime();
    registerReceiver(handler, iFilter);

Manifest.xml:

<activity android:name=".MainActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>
于 2012-07-30T07:01:32.187 に答える