Android监听耳机按键事件

Posted shineflowers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中定义
 <receiver android:name="com.lenovo.longexposure.MediaButtonReceiver" >
            <intent-filter android:priority="2147483647" >
                <action android:name="android.intent.action.MEDIA_BUTTON" />
            </intent-filter>
 </receiver>

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

方法二:直接监听onKeyDown方法

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










以上是关于Android监听耳机按键事件的主要内容,如果未能解决你的问题,请参考以下文章

Android怎样监听蓝牙耳机的按键事件

uniapp识别蓝牙耳机按键

Android 高性能音频Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 动态注册广播接收者监听耳机插拔事件 | 重新打开 Oboe 音频流 )

android 耳机按钮控制音乐播放

如何捕获android系统按键事件

Android基础——物理按键,长按,触摸事件及其监听器