Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android L中拦截耳机按钮按下?_Android_Broadcastreceiver_Android Mediaplayer - Fatal编程技术网

如何在Android L中拦截耳机按钮按下?

如何在Android L中拦截耳机按钮按下?,android,broadcastreceiver,android-mediaplayer,Android,Broadcastreceiver,Android Mediaplayer,我的项目几乎完成了,只剩下一个关键要素。这就是我现在要问的 有谁能告诉我如何在Android L及以上版本中收听耳机/媒体按钮按下?我正要尝试使用AM.registerReceiver,但我意识到它已被弃用,而且在如何使用MediaSession方面我没有看到太多文档/示例。我正在尝试使用compat-one,因为我的minSDK是API 16,有什么区别吗?。以下是我目前正在做的事情,结果是什么都没有: void initReceivers() throws IllegalArgume

我的项目几乎完成了,只剩下一个关键要素。这就是我现在要问的

有谁能告诉我如何在Android L及以上版本中收听耳机/媒体按钮按下?我正要尝试使用AM.registerReceiver,但我意识到它已被弃用,而且在如何使用MediaSession方面我没有看到太多文档/示例。我正在尝试使用compat-one,因为我的minSDK是API 16,有什么区别吗?。以下是我目前正在做的事情,结果是什么都没有:

    void initReceivers() throws IllegalArgumentException {
        final int RC = 1001;

        if (!MainActivity.noisyRegistered) {
            app.registerReceiver(noisyReceiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
            MainActivity.noisyRegistered = true;

            Intent intent = new Intent(app, AudioReceiver.class);
            PendingIntent pending = PendingIntent.getBroadcast(app, RC, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            ComponentName name = new ComponentName(app.getPackageName(), AudioReceiver.class.getName());
            MediaSessionCompat mediaSession = new MediaSessionCompat(app, "sggTag", name, pending);
            mediaSession.setMediaButtonReceiver(pending);
        }
    }

static public class AudioReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (!intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON))
            return;
        KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        if (event == null || binder == null || player == null)
            return;

        switch (event.getKeyCode()) {
            case KeyEvent.KEYCODE_MEDIA_PLAY:
                binder.resume();
                break;
            case KeyEvent.KEYCODE_MEDIA_PAUSE:
                binder.resume();
                break;
            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
                if (player.isPlaying())
                    binder.pause();
                else
                    binder.resume();
                break;
            case KeyEvent.KEYCODE_MEDIA_NEXT:
                binder.next();
                break;
            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
                binder.prev();
                break;
        }
    }
}
我的舱单:

    <receiver android:name=".ListenService$AudioReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON"/>
        </intent-filter>
    </receiver>
事实上,我非常困惑,当存在setCallback方法时,为什么需要提供挂起的意图


非常感谢。

我最近开发了一个响应媒体按钮的应用程序。我在三星Galaxy S II上测试了它,它成功了

首先,在AndroidManifest.xml的区域内,放置以下内容:

 <receiver     android:name="net.work.box.controller.receivers.RemoteControlReceiver" >
<intent-filter android:priority="1000000000000000" >
    <action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
}


这可能不是最好的解决方案,特别是硬编码的android:priority Upper。然而,它尝试了其他几种技术,但似乎没有一种有效。所以我不得不求助于这个。。。我希望我能帮上忙。

使用以下链接alsoAndroid Studio找不到此部分:Intents.ACTION\u PLAYER\u PAUSEn一个媒体播放应用程序,用于在活动没有焦点时对耳机按钮按下做出反应。当它出现时,我们覆盖用户界面的Activity.onKeyDown或onkeydup方法,以捕获与耳机按钮相关的事件。然而,在我们前面提到的场景中,这是有问题的。当用户按下“播放”键时,应该开始播放什么应用程序?音乐应用程序?用户首选的播客应用程序?无法解析我的清单中10000000000000上的符号转到文件>无效缓存/重新启动和无效并重新启动。这就清除了错误。使用此链接可以得到更好的解决方案。。。。。。
@Override
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) {
        KeyEvent event = (KeyEvent) intent .getParcelableExtra(Intent.EXTRA_KEY_EVENT);

        if (event == null) {
            return;
        }

        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            context.sendBroadcast(new Intent(Intents.ACTION_PLAYER_PAUSE));
        }
    }
}