Android耳机线控详解,蓝牙耳机按钮监听(仿酷狗线控效果)

转载请注明出处:

AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);ComponentName name = newComponentName(context.getPackageName(),MediaButtonReceiver.class.getName());audioManager.registerMediaButtonEventReceiver(name);

该方法的原型为:

publicvoidregisterMediaButtonEventReceiver(PendingIntenteventReceiver)

Added inAPI level 18

Registera component to be the sole receiver of MEDIA_BUTTON intents. This is likeregisterMediaButtonEventReceiver(android.content.ComponentName), but allows the buttons to go to any PendingIntent. Note that you shouldonly use this form if you know you will continue running for the full timeuntil unregistering the PendingIntent.

Parameters

eventReceiver

target that will receive media button intents. The PendingIntent will be sent anACTION_MEDIA_BUTTONevent when a media button action occurs, withEXTRA_KEY_EVENTadded and holding the key code of the media button that was pressed.

AudioManager audioManager = (AudioManager)context .getSystemService(Context.AUDIO_SERVICE);ComponentName name = newComponentName(context.getPackageName(), MediaButtonReceiver.class.getName());audioManager.unregisterMediaButtonEventReceiver(name);KeyEvent keyEvent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); //获得KeyEvent对象if(keyEvent.getAction()== KeyEvent.ACTION_UP){//在这里处理单击事件}

下面就分别讲解一下为了实现线控效果所用到的几个类:

package com.jph.lc;import android.content.ComponentName;import android.content.Context;import android.media.AudioManager;import android.util.Log;/** * 耳机线控管理工具类 单例 * @author JPH * @date 2015-6-9 下午4:03:45 */public class HeadSetUtil {private static HeadSetUtil headSetUtil;private OnHeadSetListener headSetListener = null;public static HeadSetUtil getInstance() {if (headSetUtil == null) {headSetUtil = new HeadSetUtil();}return headSetUtil;}/** * 设置耳机单击双击监听接口 必须在open前设置此接口,否则设置无效 * @param headSetListener */public void setOnHeadSetListener(OnHeadSetListener headSetListener) {this.headSetListener = headSetListener;}/** * 为MEDIA_BUTTON 意图注册接收器(注册开启耳机线控监听, 请务必在设置接口监听之后再调用此方法,否则接口无效) * @param context */public void open(Context context) {if(headSetListener==null){throw new IllegalStateException("please set headSetListener");}AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);ComponentName name = new ComponentName(context.getPackageName(),MediaButtonReceiver.class.getName());audioManager.registerMediaButtonEventReceiver(name);Log.i("ksdinf", "open");}/** * 关闭耳机线控监听 * @param context */public void close(Context context) {AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);ComponentName name = new ComponentName(context.getPackageName(),MediaButtonReceiver.class.getName());audioManager.unregisterMediaButtonEventReceiver(name);}/** * 删除耳机单机双击监听接口 */public void delHeadSetListener() {this.headSetListener = null;}/** * 获取耳机单击双击接口 * * @return */protected OnHeadSetListener getOnHeadSetListener() {return headSetListener;}/** * 耳机按钮单双击监听 */public interface OnHeadSetListener {/** * 单击触发,主线程。 此接口真正触发是在单击操作1秒后 因为需要判断1秒内是否仍监听到点击,有的话那就是双击了 */public void onClick();/** * 双击触发,此接口在主线程,,可以放心使用 */public void onDoubleClick();/** * 三连击 */public void onThreeClick();}}package com.jph.lc;import java.util.Timer;import java.util.TimerTask;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.KeyEvent;import com.jph.lc.HeadSetUtil.OnHeadSetListener;/** * MEDIA_BUTTON耳机媒体按键广播接收器 * @author JPH * @Date2015-6-9 下午8:35:40 */public class MediaButtonReceiver extends BroadcastReceiver{private Timer timer = null;private OnHeadSetListener headSetListener = null;private static MTask myTimer = null;/**单击次数**/private static int clickCount;public MediaButtonReceiver(){timer = new Timer(true);this.headSetListener = HeadSetUtil.getInstance().getOnHeadSetListener();}@Overridepublic void onReceive(Context context, Intent intent) {Log.i("ksdinf", "onReceive"); String intentAction = intent.getAction() ;if(Intent.ACTION_MEDIA_BUTTON.equals(intentAction)){KeyEvent keyEvent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); //获得KeyEvent对象if(headSetListener != null){try {if(keyEvent.getAction() == KeyEvent.ACTION_UP){if (clickCount==0) {//单击clickCount++;myTimer = new MTask();timer.schedule(myTimer,1000);}else if (clickCount==1) {//双击clickCount++;}else if (clickCount==2) {//三连击clickCount=0;myTimer.cancel();headSetListener.onThreeClick();}}} catch (Exception e) {}}}abortBroadcast();//终止广播(不让别的程序收到此广播,免受干扰) }/** * 定时器,用于延迟1秒,判断是否会发生双击和三连击 */class MTask extends TimerTask{@Overridepublic void run() {try {if (clickCount==1) {mhHandler.sendEmptyMessage(1);}else if (clickCount==2) {mhHandler.sendEmptyMessage(2);}clickCount=0;} catch (Exception e) {// TODO: handle exception}}};/** * 此handle的目的主要是为了将接口在主线程中触发 * ,为了安全起见把接口放到主线程触发 */Handler mhHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if(msg.what==1){//单击headSetListener.onClick();}else if (msg.what==2) {//双击headSetListener.onDoubleClick();}else if (msg.what==3) {//三连击headSetListener.onThreeClick();}}};}package com.jph.lc;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;import com.jph.lc.HeadSetUtil.OnHeadSetListener;/** * 耳机线控实例,蓝牙耳机按钮监听(仿酷狗线控效果) * @author JPH * @Date2015-6-10 上午9:49:02 */public class MainActivity extends Activity {TextView txt = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txt = (TextView) findViewById(R.id.text);HeadSetUtil.getInstance().setOnHeadSetListener(headSetListener);HeadSetUtil.getInstance().open(this);}@Overrideprotected void onDestroy() {super.onDestroy();HeadSetUtil.getInstance().close(this);}OnHeadSetListener headSetListener = new OnHeadSetListener() {@Overridepublic void onDoubleClick() {txt.setText("双击");Log.i("ksdinf", "双击");}@Overridepublic void onClick() {txt.setText("单击");Log.i("ksdinf", "单击");}@Overridepublic void onThreeClick() {txt.setText("三连击");Log.i("ksdinf", "三连击");}};}

该类中举要介绍了媒体按键监听的使用。

源码下载:

GitHub:https://github.com/crazycodeboy/HeadSetControl

与其用泪水悔恨今天,不如用汗水拼搏今天。

Android耳机线控详解,蓝牙耳机按钮监听(仿酷狗线控效果)

相关文章:

你感兴趣的文章:

标签云: