有时我们需要程序模拟按钮或点击,而手机本身又没有,哪么可以采取其它方式 模拟实现,最后再去实际设备去测试(前期一般都拿不到设备);

如上一首,下一首,暂停等,手机上是没有的,但有些设备上是有的,所以我们只能模拟;

模拟按钮一种可以采用adb 命令;

别一种采用程序,这里主要讲采用程序的方法:

通过Runtime实现,模拟媒体上一首代码如下:

try
{
String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_NEXT;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyCommand); }
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}



模拟上一首

try
{
String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_PREVIOUS;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyCommand);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}



如果需要模拟其它按键只需将KeyEvent.KEYCODE_MEDIA_PREVIOUS替换成其它键值即可。

下面讲一下 媒体键监听:

首先我们定义一个广播类 MediaButtonReceive 它继承广播接收器类(BroadbcastReceiver),那么它就具备了BroadbcastReceiver类的使用方式,

点击MEDIA_BUTTON发送的Intent Action 为:ACTION_MEDIA_BUTTON  ="android.intent.action.MEDIA_BUTTON"

        Intent 附加值为(Extra)点击MEDIA_BUTTON的按键码 :    



         //获得KeyEvent对象

        KeyEvent keyEvent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);

        //获得Action

        String intentAction = intent.getAction() ;

在取得音频焦点时,在AudioManager对象注册一个MediaoButtonRecevie,使它成为MEDIA_BUTTON的唯一接收器 也就是说只有它能收到,其他的都收不到这个广播了,否则的话会造成的混乱,在失去音频焦点时反注册,这样才能保证其它应用能正常使用媒体键;



    该广播必须在AndroidManifest.xml文件中进行声明,否则就监听不到该MEDIA_BUTTON广播了

在AudioManager对象注册一个MediaoButtonRecevie;

下面看一下MediaButtonReceiver类 的实现:

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 { @Override
public void onReceive(Context context, Intent intent) {
// 获得Action
String intentAction = intent.getAction(); // 获得KeyEvent对象
KeyEvent keyEvent = (KeyEvent) intent
.getParcelableExtra(Intent.EXTRA_KEY_EVENT); Log.e("MediaButtonReceiver", "Action ---->" + intentAction
+ " KeyEvent----->" + keyEvent.toString()); if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { boolean isActionUp = (keyEvent.getAction()==KeyEvent.ACTION_UP);
// 这里会收到两次,我们只判断 up
if(!isActionUp)
{
return;
} // 获得按键字节码
int keyCode = keyEvent.getKeyCode();
// 按下 / 松开 按钮
int keyAction = keyEvent.getAction();
// 获得事件的时间
long downtime = keyEvent.getEventTime(); // 获取按键码 keyCode
StringBuilder sb = new StringBuilder();
// 这些都是可能的按键码 , 打印出来用户按下的键
if (KeyEvent.KEYCODE_MEDIA_NEXT == keyCode) {
sb.append("KEYCODE_MEDIA_NEXT");
Toast.makeText(context,
"receive KEYCODE_MEDIA_NEXT",
Toast.LENGTH_SHORT).show();
} if (KeyEvent.KEYCODE_MEDIA_PREVIOUS == keyCode) {
sb.append("KEYCODE_MEDIA_PREVIOUS");
Toast.makeText(context,
"receive KEYCODE_MEDIA_PREVIOUS",
Toast.LENGTH_SHORT).show();
} // 输出点击的按键码
Log.e("MediaButtonReceiver", sb.toString());
}
} }

在AndroidManifest.xml声明我们定义的广播类,它需要通过AudioManager对象注册

<span style="font-size:18px;">         <receiver android:name="MediaButtonReceiver">
<intent-filter >
<action android:name="android.intent.action.MEDIA_BUTTON"></action>
</intent-filter>
</receiver></span>

AudioManager注册一个MediaButtonReceiver() ;

<span style="font-size:18px;">		//获得AudioManager对象
AudioManager mAudioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
//构造一个ComponentName,指向MediaoButtonReceiver类
//下面为了叙述方便,我直接使用ComponentName类来替代MediaoButtonReceiver类
ComponentName mbCN = new ComponentName(getPackageName(),MediaButtonReceiver.class.getName());
//注册一个MedioButtonReceiver广播监听
mAudioManager.registerMediaButtonEventReceiver(mbCN);</span>

下面看一下调用类的实现MainActivity .java

import com.example.ydsdkdemo.R;

import android.media.AudioManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { private Context mContext;
private AudioManager audioManager;
private ComponentName mComponentName; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
init(); } private void init() { audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mComponentName = new ComponentName(getPackageName(),
MediaButtonReceiver.class.getName()); if (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == audioManager
.requestAudioFocus(focusChangeListener,
AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN)) {
audioManager.registerMediaButtonEventReceiver(mComponentName);
} try
{
String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_NEXT;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyCommand); }
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} } public void lastOne(View v)
{
try
{
String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_PREVIOUS;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyCommand);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void nextOne(View v)
{
try
{
String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_NEXT;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyCommand); }
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void voiceSearch(View v)
{
try
{
String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_RECORD;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyCommand);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} //焦点问题
private AudioManager.OnAudioFocusChangeListener focusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) { case AudioManager.AUDIOFOCUS_LOSS:// 长时间失去 Toast.makeText(mContext,
"receive AudioManager.AUDIOFOCUS_LOSS",
Toast.LENGTH_SHORT).show();
audioManager.unregisterMediaButtonEventReceiver(mComponentName);
audioManager.abandonAudioFocus(focusChangeListener);//放弃焦点监听
break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:// 短时间失去
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:// 短时间失去,但可以共用 break; case AudioManager.AUDIOFOCUS_GAIN:// 获得音频焦点
audioManager.registerMediaButtonEventReceiver(mComponentName);
break; }
}
}; @Override
protected void onDestroy() {
// TODO Auto-generated method stub
audioManager.unregisterMediaButtonEventReceiver(mComponentName);
super.onDestroy();
} }
值得注意的一点时,当我们为一个应用程序注册了MediaoButtonReceiver时,在程序离开时,我们需要取消该



Demo地址:

http://download.csdn.net/detail/q610098308/9147909

Android 媒体键监听以及模拟媒体键盘的实现 demo的更多相关文章

  1. Android Home键监听

    Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...

  2. quick-cocos2d-x android返回键监听并实现原生退出对话框

    这两天最终闲了一下,就顺手又把quick捡起来又学了学,一直都认为quick比cocos2dx那套lua绑定要方便很多,今天试了下android返回键的监听,还是挺好弄的,所以就有了这篇. 首先说明一 ...

  3. 使用python监听、模拟鼠标键盘事件

    最近守望职业选手疑似开挂事件挺热闹的,在下小菜一枚,并不能从视频中看出端倪.看了一些关于外挂的讨论,自动点射和压枪只需在鼠标驱动上做些改动即可,自瞄或其他高级功能则需要读内存或修改游戏文件,检测也更容 ...

  4. Android Back Home键监听

    Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...

  5. Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听

    原文:Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听 简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public cla ...

  6. Android之Home键监听封装

    众所周知,我们监听返回键事件,无法是下面两个方法: @Override public void onBackPressed() { //do something //super.onBackPress ...

  7. flutter 返回键监听

    本篇为继上片监听返回键基础下优化: 以下做返回键监听两种情况: import 'package:fluttertoast/fluttertoast.dart'; //提示第三方插件 1. 单击提示双击 ...

  8. Android 手势水平监听判断

    package com.zihao.ui; import com.zihao.R; import android.os.Bundle; import android.app.Activity; imp ...

  9. Android中如何监听GPS开启和关闭

    转自 chenming 原文 Android中如何监听GPS开启和关闭   摘要: 本文简单总结了如何监听GPS开关的小技巧 有时需要监听GPS的开关(这种需求并不多见).实现的思路是监听代表 GPS ...

随机推荐

  1. C#利用Windows API 实现关机、注销、重启等操作

    using System; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; nam ...

  2. 请使用GameBench.jar 文件启动 GameBench服务

    请使用GameBench.jar 文件启动 GameBench服务 电脑上安装JAVA JRE:http://www.oracle.com/technetwork/java/javase/downlo ...

  3. Value Dispose() cannot be called while doing CreateHandle().

    在backgroundWorker run之前show出了一个窗体_frm. _frmpw = new FrmPleaseWait(); _frmpw.SetMsg("正在请求") ...

  4. bzojj1764: [Baltic2009]monument

    Description 给一个p*q*r的立方体,它由p*q*r个1*1*1的小立方体构成.每个立方体要么被虫蛀,要么不被.现在郑爽要选出一个a*a*b的立方体(方向任意),使得它没有被虫蛀过,并且4 ...

  5. VBA标准模块与类模块

    大家通过之前的介绍,已知道怎么将一个空模块插入VBA的工程中.从插入模块中可以看到,模块有有两种——标准模块与类模块.类模块是含有类定义的特殊模块,包括其属性和方法的定义.在后面会有介绍与说明. 随着 ...

  6. 7. redis优化

    一. redis使用上的优化 精简键名和键值 键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名. 键值:对于键值的数量固定的话可以使用0和1这样的数字来表示,(例如:male/femal ...

  7. python 虎扑注册检查脚本

    ulipad,看着蛮舒服的. 图里的代码就是今天晚上的成果. 突然就想看看python这个被很多人说是优雅的语言,于是晚上没事就配了配环境,做了个东西 #encoding: utf-8 import ...

  8. (VS TFS) Adding existing project to solution in TFS.

    正常的情况话,直接加入project,然后选择"Source control" -> “Add selected projects to source control.... ...

  9. Objective-C语法汇总

    1.方法前的加减号 Objective-C中是没有public与private的概念的,即可以认为全部都是public.减号表示的是一个函数.方法.消息的开始.加号则表示不需要创建一个类的实例,其他类 ...

  10. storm系统架构学习

    Storm架构如下图所示: 1.主控节点(Master Node) 运行Storm nimbus后台服务的节点(Nimbus),它是storm系统的中心,负责接收用户提交的作业(如同spark sub ...