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

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

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

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

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

  1. try
  2. {
  3. String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_NEXT;
  4. Runtime runtime = Runtime.getRuntime();
  5. Process proc = runtime.exec(keyCommand);
  6.  
  7. }
  8. catch (IOException e)
  9. {
  10. // TODO Auto-generated catch block
  11. e.printStackTrace();
  12. }

  1.  

模拟上一首

  1. try
  2. {
  3. String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_PREVIOUS;
  4. Runtime runtime = Runtime.getRuntime();
  5. Process proc = runtime.exec(keyCommand);
  6. }
  7. catch (IOException e)
  8. {
  9. // TODO Auto-generated catch block
  10. e.printStackTrace();
  11. }

  1.  

如果需要模拟其它按键只需将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类 的实现:

  1. import android.content.Context;
  2. import android.content.Intent;
  3. import android.util.Log;
  4. import android.view.KeyEvent;
  5. import android.widget.Toast;
  6.  
  7. public class MediaButtonReceiver extends BroadcastReceiver {
  8.  
  9. @Override
  10. public void onReceive(Context context, Intent intent) {
  11. // 获得Action
  12. String intentAction = intent.getAction();
  13.  
  14. // 获得KeyEvent对象
  15. KeyEvent keyEvent = (KeyEvent) intent
  16. .getParcelableExtra(Intent.EXTRA_KEY_EVENT);
  17.  
  18. Log.e("MediaButtonReceiver", "Action ---->" + intentAction
  19. + " KeyEvent----->" + keyEvent.toString());
  20.  
  21. if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
  22.  
  23. boolean isActionUp = (keyEvent.getAction()==KeyEvent.ACTION_UP);
  24. // 这里会收到两次,我们只判断 up
  25. if(!isActionUp)
  26. {
  27. return;
  28. }
  29.  
  30. // 获得按键字节码
  31. int keyCode = keyEvent.getKeyCode();
  32. // 按下 / 松开 按钮
  33. int keyAction = keyEvent.getAction();
  34. // 获得事件的时间
  35. long downtime = keyEvent.getEventTime();
  36.  
  37. // 获取按键码 keyCode
  38. StringBuilder sb = new StringBuilder();
  39. // 这些都是可能的按键码 , 打印出来用户按下的键
  40. if (KeyEvent.KEYCODE_MEDIA_NEXT == keyCode) {
  41. sb.append("KEYCODE_MEDIA_NEXT");
  42. Toast.makeText(context,
  43. "receive KEYCODE_MEDIA_NEXT",
  44. Toast.LENGTH_SHORT).show();
  45. }
  46.  
  47. if (KeyEvent.KEYCODE_MEDIA_PREVIOUS == keyCode) {
  48. sb.append("KEYCODE_MEDIA_PREVIOUS");
  49. Toast.makeText(context,
  50. "receive KEYCODE_MEDIA_PREVIOUS",
  51. Toast.LENGTH_SHORT).show();
  52. }
  53.  
  54. // 输出点击的按键码
  55. Log.e("MediaButtonReceiver", sb.toString());
  56. }
  57. }
  58.  
  59. }

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

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

AudioManager注册一个MediaButtonReceiver() ;

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

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

  1. import com.example.ydsdkdemo.R;
  2.  
  3. import android.media.AudioManager;
  4. import android.os.Bundle;
  5. import android.app.Activity;
  6. import android.content.BroadcastReceiver;
  7. import android.content.ComponentName;
  8. import android.content.Context;
  9. import android.content.Intent;
  10. import android.content.IntentFilter;
  11. import android.util.Log;
  12. import android.view.KeyEvent;
  13. import android.view.Menu;
  14. import android.view.View;
  15. import android.widget.Toast;
  16.  
  17. public class MainActivity extends Activity {
  18.  
  19. private Context mContext;
  20. private AudioManager audioManager;
  21. private ComponentName mComponentName;
  22.  
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27. mContext = this;
  28. init();
  29.  
  30. }
  31.  
  32. private void init() {
  33.  
  34. audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
  35. mComponentName = new ComponentName(getPackageName(),
  36. MediaButtonReceiver.class.getName());
  37.  
  38. if (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == audioManager
  39. .requestAudioFocus(focusChangeListener,
  40. AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN)) {
  41. audioManager.registerMediaButtonEventReceiver(mComponentName);
  42. }
  43.  
  44. try
  45. {
  46. String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_NEXT;
  47. Runtime runtime = Runtime.getRuntime();
  48. Process proc = runtime.exec(keyCommand);
  49.  
  50. }
  51. catch (IOException e)
  52. {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. }
  56.  
  57. }
  58.  
  59. public void lastOne(View v)
  60. {
  61. try
  62. {
  63. String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_PREVIOUS;
  64. Runtime runtime = Runtime.getRuntime();
  65. Process proc = runtime.exec(keyCommand);
  66. }
  67. catch (IOException e)
  68. {
  69. // TODO Auto-generated catch block
  70. e.printStackTrace();
  71. }
  72. }
  73.  
  74. public void nextOne(View v)
  75. {
  76. try
  77. {
  78. String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_NEXT;
  79. Runtime runtime = Runtime.getRuntime();
  80. Process proc = runtime.exec(keyCommand);
  81.  
  82. }
  83. catch (IOException e)
  84. {
  85. // TODO Auto-generated catch block
  86. e.printStackTrace();
  87. }
  88. }
  89.  
  90. public void voiceSearch(View v)
  91. {
  92. try
  93. {
  94. String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MEDIA_RECORD;
  95. Runtime runtime = Runtime.getRuntime();
  96. Process proc = runtime.exec(keyCommand);
  97. }
  98. catch (IOException e)
  99. {
  100. // TODO Auto-generated catch block
  101. e.printStackTrace();
  102. }
  103. }
  104.  
  105. //焦点问题
  106. private AudioManager.OnAudioFocusChangeListener focusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
  107. @Override
  108. public void onAudioFocusChange(int focusChange) {
  109. switch (focusChange) {
  110.  
  111. case AudioManager.AUDIOFOCUS_LOSS:// 长时间失去
  112.  
  113. Toast.makeText(mContext,
  114. "receive AudioManager.AUDIOFOCUS_LOSS",
  115. Toast.LENGTH_SHORT).show();
  116. audioManager.unregisterMediaButtonEventReceiver(mComponentName);
  117. audioManager.abandonAudioFocus(focusChangeListener);//放弃焦点监听
  118. break;
  119.  
  120. case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:// 短时间失去
  121. case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:// 短时间失去,但可以共用
  122.  
  123. break;
  124.  
  125. case AudioManager.AUDIOFOCUS_GAIN:// 获得音频焦点
  126. audioManager.registerMediaButtonEventReceiver(mComponentName);
  127. break;
  128.  
  129. }
  130. }
  131. };
  132.  
  133. @Override
  134. protected void onDestroy() {
  135. // TODO Auto-generated method stub
  136. audioManager.unregisterMediaButtonEventReceiver(mComponentName);
  137. super.onDestroy();
  138. }
  139.  
  140. }
  1. 值得注意的一点时,当我们为一个应用程序注册了MediaoButtonReceiver时,在程序离开时,我们需要取消该

  1.  
  1.  

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. SQL 查看数据库表的容量大小

    --==============查看数据库表的容量大小========start================================?============ Create Table # ...

  2. 十个 MongoDB 使用要点

    转自: 十个 MongoDB 使用要点    从 mongodb 阶段性技术总结 中抽取并整理了对大家有帮助的十个要点:   1.mongodb 表名和字段名统一用小写字母 mongodb 是默认区分 ...

  3. jQuery实现表单验证

    表单是网页的一个重要组成部分.本节做一个简单的表单提交网页然后利用jQuery实现表单的验证.后续的表单完善以及功能的完善会在以后的博客中给出. 效果图: 代码: <!DOCTYPE html ...

  4. bzoj4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  5. Source insight 3572版本安装及An invalid source insight serial number was detected解决方法

    Source insight有最新版3572.3.50.0076 下载连接:http://www.sourceinsight.com/down35.html,   http://www.sourcei ...

  6. 调试压缩后的Javascript文件:在 Chrome 和 Safari ,选择“脚本”标签,找到相应的文件,然后点击“{}”图标(pretty print,在面板底部)

  7. PLSQL_闪回操作2_Fashback Version Query

    2014-12-09 Created By BaoXinjian

  8. win764上vs2010+opencv2.4.11安装配置

    1:准备工作 1)opencv的官网下载你所要版本的opencv库文件,运行安装解压到自定义的一个文件夹里(D:\Program Files). 2)安装vs2010. 二:配置 1.计算机环境变量: ...

  9. jQuery实现的鼠标滑过切换图片代码实例

    jQuery实现的鼠标滑过切换图片代码实例:有时候网页需要这样的简单效果,那就是当鼠标滑过默认图片的时候,能够实现图片的切换,可能在实际应用中,往往没有这么简单,不过大家可以自行扩展一下,下面简单介绍 ...

  10. web.xml配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...