1

Android 3.0 以降でブロードキャストレシーバーを使用して ACTION_MEDIA_BUTTON インテントをキャプチャしようとしています。

私のレシーバーは、MainActivity クラスの静的内部クラスです。AndroidManifest.xml に登録されており、クラスを見つける必要があるため、静的です。ただし、これは、再生/一時停止ボタンが押されたときに、BroadcastReceiver がアクティビティに戻る方法がないことを意味します。onReceive メソッドが呼び出されますが、クラスが静的であるため、アクティビティを通知できません。

Android システムによって呼び出されている BroadcastReceiver オブジェクトを取得できないため、アクティビティまたは Handler オブジェクトへの参照を使用しても機能しません。

レシーバーを動的に宣言することも機能するはずですが、奇妙な理由により、これは Android 3.0 以降では機能しません。それは何か関係があります:

AudioManager.registerMediaButtonEventReceiver(ComponentName)

これは呼び出す必要があります。

私のクラスのいくつかの図:

   public class MainActivity extends Activity {

        public static class MicReceiver extends BroadcastReceiver {
            // onReceive is called
                // How do I inform MainActivity of the press?
        }
    }

修正のためのアイデアはありますか?

ありがとう!

[編集] 受信者を動的に登録するには、以下のコードを参照してください: (これは現在機能していません)

mReceiver = new RemoteControlReceiver();

IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
filter.setPriority(2147483647);
registerReceiver(mReceiver, filter);

AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
am.registerMediaButtonEventReceiver(new ComponentName(getPackageName(), RemoteControlReceiver.class.getName()));
4

3 に答える 3

2

AFAIKregisterMediaButtonEventReceiver()は、バックグラウンドでメディアボタンイベントを受け取りたい場合です。フォアグラウンド アクティビティは、標準のonKeyDown()callbackを使用してメディア ボタン イベントを検出できます。

于 2013-06-09T17:53:36.653 に答える
0

マニフェストでレシーバーを宣言するとonRecieve()、アクティビティーがない場合でも、レシーバーのインスタンス化と呼び出しが試行されます。

アクティビティにバインドされたレシーバーにするには、非静的クラスにして、.xml でインスタンス化しonCreate()ます。次に、それぞれに登録および登録解除しonResume() ますonPause()。クラスは非静的であり、アクティビティがアクティブな場合にのみ登録されるため、内部レシーバー クラスから親アクティビティ メソッドを安全に呼び出すことができます。

于 2013-06-09T16:50:58.367 に答える
0

BroadcastReceiver で何かを処理する場合、コードは次のようになります。

public class MainActivity extends Activity {

        public static class MicReceiver extends BroadcastReceiver {

    public MicReceiver() {
        // TODO Auto-generated constructor stub
        super();
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        String intentAction = intent.getAction();
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
            return;
        }
        KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        if (event == null) {
            return;
        }
        int action = event.getAction();
        if (action == KeyEvent.ACTION_DOWN) {

          Toast.makeText(context, "BUTTON PRESSED! ", Toast.LENGTH_SHORT).show(); 
        }
        abortBroadcast();
    }



        }
    }
于 2014-10-13T05:06:55.727 に答える