5

私は単純ですが、おそらく構造が悪い Android アプリケーションを持っています。これは、Activity を拡張する MainActivity と、BroadcastReceiver を拡張する RemoteControlReceiver の 2 つの Java クラスで構成されます。

次の 2 つのリンクの指示に従って、 Mediabutton レシーバーをセットアップしました 。 android.com/training/managing-audio/volume-playback.html

問題は、Bluetooth リモートのメディア ボタン (再生/一時停止、次、前) を押すたびに、broadcastReceiver の onReceive() メソッドが 2 回実行されることです。より具体的には、RemoteControlReceiver 全体がオブジェクトに初期化され、オブジェクトの onReceive() メソッドが実行され、オブジェクトが破棄され、繰り返されます。

static int mult = 0; を配置して、これをテストしました。MainActivity で。onReceive を実行するたびに、mult を 1 ずつ増やしました。ボタンのクリックごとに 2 回インクリメントします。

2回実行される原因がわかりません。ハードウェアはクリックごとに 2 つの信号を送信していますか、OS は信号ごとに複数のメディア ボタン インテントを送信していますか、それともブロードキャスト レシーバーはインテントごとに 2 回実行されていますか?

私の MediaButtonReceiver コード:

public class RemoteControlReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){
            KeyEvent Xevent = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
            int keyType = Xevent.getKeyCode();



            Intent i = new Intent();
            i.setAction("com.MainActivity.Shakey.MEDIA_BUTTON");
            i.putExtra("keyType", keyType);
            context.sendBroadcast(i);
            Toast.makeText(context, String.valueOf(MainActivity.mult), Toast.LENGTH_SHORT).show();
            MainActivity.mult++;
            abortBroadcast();

        }

    }
}

このレシーバーのフィルターは、次のようにマニフェストに登録されます。

<application>
 ...
   <receiver android:name=".RemoteControlReceiver">
       <intent-filter>
           <action android:name="android.intent.action.MEDIA_BUTTON"/>
       </intent-filter>
   </receiver>
 ...
</application>

Broadcastreceiver は、MainActivity の onResume() で AudioManager オブジェクトに動的に登録されます。そして、onPause() で登録解除されます。リンクが言ったように、これは media_button インテントで最優先される確実な方法です。静的変数を使用することで、broadcastReceiver の偶数呼び出しをすべて無視できることを知っています。しかし、この問題の原因を知りたいです。

PS 再生/一時停止/前/次のボタンは、デフォルトの Android 音楽プレーヤーで正常に機能します。

4

1 に答える 1

12

私の意見では、問題は OnReceive が bluetooth ボタンを押したり離したりすることに反応することです。これが、コードが 2 回実行される理由です。次のように sth を実行してみてください。

    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
    KeyEvent Xevent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);    
    if ((KeyEvent.KEYCODE_MEDIA_PLAY == Xevent.getKeyCode()) && (Xevent.getAction() == KeyEvent.ACTION_DOWN)) {  //MainActivity.mult++; ...

または、やりたいことにもかかわらず ACTION_UP を使用できます。よくわかりませんが、これがお役に立てば幸いです。

于 2013-04-14T11:22:20.997 に答える