听耳机按钮输入不起作用

时间:2017-03-21 23:38:02

标签: android android-studio headset

根据我在线阅读的其他多个问题,在听取耳机按钮输入时,你应该有一个接收器用于MEDIA_BUTTON动作,并在你的清单中注册该接收器。
我的代码如下:
(清单)

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

(接收人)

public class HeadphoneButtonBroadcastReceiver extends BroadcastReceiver {
    static short clickAmount = 0;

    public HeadphoneButtonBroadcastReceiver() {
        super();
    }

    @Override
    public void onReceive(final Context context, Intent intent) {
        Log.d("@@DEBUG", "HeadphoneButtonBroadcastReceiver::onReceive");
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) return;

        KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        if (keyEvent == null) return;

        if (keyEvent.getAction() != KeyEvent.ACTION_DOWN) return;

        // Doing things here
    }
}

接收器位于名为listeners的包中。

但是,我无法通过执行此操作或执行我在网上找到的一些修复工作来获取日志(将过滤器的优先级设置得非常高,尝试在代码中设置接收器依赖性而不是在清单中。

我知道按钮输入本身有效,因为我尝试覆盖我的Activity中的onKeyDown函数,它确实在那里完成。但是,即使活动不是当前窗口,我也希望能够听到咔嗒声 如果重要的话,我的目标SDK版本是API 25(7.1.1)。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用支持库提供的广播接收器,而不是创建自己的广播接收器。

<receiver android:name="android.support.v4.media.session.MediaButtonReceiver">
    <intent-filter>
       <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

与文档说法一样,MediaButtonReceiver会看到Service具有android.intent.action.MEDIA_BUTTON意图过滤器,并处理服务中的关键事件

<service android:name=".MediaPlaybackService">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</service>

服务的实施

public class MediaPlaybackService extends Service {

    private MediaSessionCompat mediaSessionCompat;
    private static final String TAG = "MediaPlaybackService";

    @Override
    public void onCreate() {
        super.onCreate();
        mediaSessionCompat = new MediaSessionCompat(this, "myMediaSession");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: media button intent");
        MediaButtonReceiver.handleIntent(mediaSessionCompat, intent);
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}