Android监听耳机按键事件

在工作中,我们有时候会处理到耳机按键的逻辑,主要分为两类,一种是短按,一种是长按。
监听耳机的按键事件的方法有两种:
方法一:注册监听Media Button的按键事件

  • import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.BroadcastReceiver;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.media.AudioManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.KeyEvent;

public class MainActivity extends Activity {

private AudioManager mAudioManager;
private ComponentName mComponentName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    // AudioManager注册一个MediaButton对象
    mComponentName = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName());
}



@Override
protected void onResume() {
     mAudioManager.registerMediaButtonEventReceiver(mComponentName);
     registerReceiver(headSetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
    super.onResume();
}

@Override
protected void onPause() {
    // 取消注册
    mAudioManager.unregisterMediaButtonEventReceiver(mComponentName);
    unregisterReceiver(headSetReceiver);
    super.onPause();
}

@Override
protected void onDestroy() {
    mAudioManager = null;
    mComponentName = null;
    super.onDestroy();
}

private final BroadcastReceiver headSetReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
            // phone headset plugged
            if (intent.getIntExtra("state", 0) == 1) {
                // do something

// Log.d(TAG, “耳机检测:插入”);
// Toast.makeText(context, “耳机检测:插入”, Toast.LENGTH_SHORT) .show();
mAudioManager.registerMediaButtonEventReceiver(mComponentName);
// phone head unplugged
} else {
// do something
// Log.d(TAG, “耳机检测:没有插入”);
// Toast.makeText(context, “耳机检测:没有插入”, Toast.LENGTH_SHORT).show();
mAudioManager.unregisterMediaButtonEventReceiver(mComponentName);
}
}
}
};
MediaButtonReceiver.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;

public class MediaButtonReceiver extends BroadcastReceiver {

private static String TAG = "MediaButtonReceiver";

@Override
public void onReceive(Context context, Intent intent) {

    // 获得Action
    String intentAction = intent.getAction();
    // 获得KeyEvent对象
    KeyEvent keyEvent = (KeyEvent) intent
            .getParcelableExtra(Intent.EXTRA_KEY_EVENT);

    Log.i(TAG, "Action ---->" + intentAction + "  KeyEvent----->"
            + keyEvent.toString());
    // 按下 / 松开 按钮
    int keyAction = keyEvent.getAction();

    if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)
            && (KeyEvent.ACTION_DOWN == keyAction)) {
        // 获得按键字节码
        int keyCode = keyEvent.getKeyCode();

        // 获得事件的时间
        // long downtime = keyEvent.getEventTime();

        // 获取按键码 keyCode

// StringBuilder sb = new StringBuilder();
// // 这些都是可能的按键码 , 打印出来用户按下的键
// if (KeyEvent.KEYCODE_MEDIA_NEXT == keyCode) {
// sb.append(“KEYCODE_MEDIA_NEXT”);
// }
// 说明:当我们按下MEDIA_BUTTON中间按钮时,实际出发的是 KEYCODE_HEADSETHOOK 而不是
// KEYCODE_MEDIA_PLAY_PAUSE
if (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE == keyCode) {
// sb.append(“KEYCODE_MEDIA_PLAY_PAUSE”);

        }
        if (KeyEvent.KEYCODE_HEADSETHOOK == keyCode) {

// sb.append(“KEYCODE_HEADSETHOOK”);
}
if (KeyEvent.KEYCODE_MEDIA_PREVIOUS == keyCode) {
// sb.append(“KEYCODE_MEDIA_PREVIOUS”);
}
if (KeyEvent.KEYCODE_MEDIA_STOP == keyCode) {
// sb.append(“KEYCODE_MEDIA_STOP”);
}
// 输出点击的按键码
// Log.i(TAG, sb.toString());
// Toast.makeText(context, sb.toString(), Toast.LENGTH_SHORT).show();
} else if (KeyEvent.ACTION_UP == keyAction) {
Log.i(“chengjie”, “aaa”);
}
}
}
注意,在AndroidManifest.xml中定义





注意这种方法只能监听耳机的短按事件,如果想监听长按事件,请用方法二。

方法二:直接监听onKeyDown方法

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (KeyEvent.KEYCODE_HEADSETHOOK == keyCode) { //按下了耳机键
if (event.getRepeatCount() == 0) { //如果长按的话,getRepeatCount值会一直变大
//短按
} else {
//长按
}
}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 12中的线控耳机双击事件可以通过注册BroadcastReceiver来实现。具体步骤如下: 1. 在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.RECORD_AUDIO"/> ``` 2. 在BroadcastReceiver中注册广播接收器: ```java public class EarphoneButtonReceiver extends BroadcastReceiver { private static final String TAG = EarphoneButtonReceiver.class.getSimpleName(); @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 keycode = event.getKeyCode(); int action = event.getAction(); if (action == KeyEvent.ACTION_DOWN && keycode == KeyEvent.KEYCODE_HEADSETHOOK) { //线控耳机双击事件触发的代码 Log.d(TAG, "Earphone double click detected."); } } } ``` 3. 在Activity或Service中注册BroadcastReceiver: ```java private EarphoneButtonReceiver mEarphoneButtonReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mEarphoneButtonReceiver = new EarphoneButtonReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); registerReceiver(mEarphoneButtonReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mEarphoneButtonReceiver); } ``` 这样就可以在双击线控耳机按钮时触发相应的事件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值