在 LG G4 上接收媒体按钮 Intent

Receiving Media Button Intent on an LG G4

此问题仅出现在 LG G4(Android 5.1 版)上。

我的应用程序使用耳机的 play/pause 按钮触发操作。我将 BroadcastReceiver 实现为:

public class MediaButtonIntentReceiver extends BroadcastReceiver {

    public MediaButtonIntentReceiver() { super(); }

    @Override
    public void onReceive(Context context, Intent intent) {
        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) {
            Log.v("MediaButton: ", "Action_Down");        
            // Some action
        }
   }
}

我正在注册接收器:

IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
filter.setPriority(10000);
registerReceiver(new MediaButtonIntentReceiver(), filter);

此代码适用于各种智能phone,但 LG G4 除外。 Lg phone 几乎总是启动 Music Widget 而我的 logcat 说:

01-08 11:49:30.230 22031-22031/com.example.test I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_HEADSETHOOK, scanCode=226, metaState=0, flags=0x8, repeatCount=0, eventTime=285960, downTime=285960, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{10cba8ca V.E..... R....... 0,0-1440,2560}

在对 SO 进行一些搜索后,我使用以下代码实现了一个 MediaSession,使我的应用程序成为 ACTION_MEDIA_BUTTON 意图的唯一接收者:

MediaSession mediaSession = new MediaSession(this, "MediaSessionTAG");
   mediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
     //Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); // this doesn't work either
   Intent mediaButtonIntent = new Intent(getApplicationContext(), MediaButtonIntentReceiver.class);
   PendingIntent pIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0);
   mediaSession.setMediaButtonReceiver(pIntent);
mediaSession.setActive(true);

如何让我的应用程序成为媒体按钮意图的唯一接收者,并在每个按钮操作时调用 MediaButtonIntentReceiver (BroadcastReceiver)?

我遇到了同样的问题,我使用 KeyEvent.Callback 解决了它,参见示例:

public class MediaButtonIntentReceiver extends Activity{

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event){
       Log.e("buttons","yes master, button pressed is= "+KeyEvent.keyCodeToString(keyCode));
       return false;
    }

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
       return false;
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
       return false;
    }

    @Override
    public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
       return false;
   }

}