O版本,用耳机按键控制FM的修改方法

收音机播放时,按下耳机hook键,收音机暂停;若再次按hook键,收音机又会播放,之前的FAQ13878 由于架构改变,在O版本上会无效,现提供新的修改方法。

一、 修改FmService.java (/vendor/mediatek/proprietary/packages/apps/FMRadio/src/com/android/fmradio/FmService.java)

1.在文件头部添加:

import android.content.ComponentName;
import android.media.RemoteControlClient;
import android.media.RemoteControlClient.MetadataEditor;

2.在FmService类的开始处添加如下:

private static final String TAG = "FmService";
//MTK add start
public static final String CMDTOGGLEPAUSE = "togglepause";
public static final String CMD= "command";
public static final String CMDNEXT = "cmdnext";
private RemoteControlClient mRemoteControlClient;
private ComponentName mFMMediaButtonIntentReceiver = null;
//MTK add end

3. 增加定义:

private AudioTrack mAudioTrack = null;
private AudioTrack mButtonAudioTrack = null; // MTK add

4.  powerUp()里增加如下:

mPowerStatus = DURING_POWER_UP;
// MTK add start
mButtonAudioTrack.play();
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING);
//MTK add end

5. powerDown() 里增加如下:

// activity used for update powerdown menu
mPowerStatus = POWER_DOWN;
// MTK add start
mButtonAudioTrack.stop();
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);
//MTK add end

6.  onCreate()里增加如下:

if (!FmUtils.isFmSuspendSupport()) {
mWakeLock.setReferenceCounted(false);
}
sRecordingSdcard = FmUtils.getDefaultStoragePath();
//MTK add start
Log.d(TAG, "registerMediaButtonEventReceiver.mFMMediaButtonIntentReceiver" );
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mFMMediaButtonIntentReceiver = new ComponentName(getPackageName(),
FMMediaButtonIntentReceiver.class.getName());
am.registerMediaButtonEventReceiver(mFMMediaButtonIntentReceiver);

Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
i.setComponent(mFMMediaButtonIntentReceiver);
PendingIntent pi = PendingIntent.getBroadcast(this /*context*/,
0 /*requestCode, ignored*/, i /*intent*/, 0 /*flags*/);
mRemoteControlClient = new RemoteControlClient(pi);
mAudioManager.registerRemoteControlClient(mRemoteControlClient);

int flags = RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS
| RemoteControlClient.FLAG_KEY_MEDIA_NEXT
| RemoteControlClient.FLAG_KEY_MEDIA_PLAY
| RemoteControlClient.FLAG_KEY_MEDIA_PAUSE
| RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE
| RemoteControlClient.FLAG_KEY_MEDIA_STOP;
mRemoteControlClient.setTransportControlFlags(flags);

mButtonAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, RECORD_BUF_SIZE, AudioTrack.MODE_STREAM);
Log.d(TAG, "onCreate, mButtonAudioTrack = " + mButtonAudioTrack);

//MTK add end

7. onDestroy() 里增加如下:

Log.d(TAG, "onDestroy");
if (mIsParametersSet) {
mIsParametersSet = false;
Log.w(TAG, "AudioFmPreStop=0");
mAudioManager.setParameters("AudioFmPreStop=0");
}
setMute(true);
//MTK add start
Log.d(TAG, "unregisterMediaButtonEventReceiver.mFMMediaButtonIntentReceiver" );
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.unregisterMediaButtonEventReceiver(mFMMediaButtonIntentReceiver);
mAudioManager.unregisterRemoteControlClient(mRemoteControlClient);

try {
// mButtonAudioTrack.stop();
mButtonAudioTrack.release();
mButtonAudioTrack = null;
} catch (IllegalStateException e) {
Log.d(TAG, "stop mButtonAudioTrack, IllegalStateException");
} catch (NullPointerException e) {
Log.d(TAG, "stop mButtonAudioTrack, NullPointerException");
}
// MTK add end

8. onStartCommand() 增加如下:

int ret = super.onStartCommand(intent, flags, startId);
Log.d(TAG, ">>> FmRadioService.onStartCommand intent: " + intent + " startId: " + startId);
//MTK add start
String cmd = intent.getStringExtra("command");
Log.d(TAG, ">>> FmRadioService.onStartCommand command: " + cmd);
if( CMDTOGGLEPAUSE.equals(cmd) ){
Log.d(TAG, "onStartCommand:CMDTOGGLEPAUSE" );
if(mPowerStatus != POWER_UP){
powerUpAsync(FmUtils.computeFrequency(getFrequency()));}
else{
forceToHeadsetMode();
powerDownAsync();}
}

//MTK add end

二, 在

/vendor/mediatek/proprietary/packages/apps/FMRadio/src/com/android/fmradio/ 下增加一只文件,文件名: FMMediaButtonIntentReceiver.java

内容如下:

 package com.android.fmradio;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.util.Log;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import java.util.List;public class FMMediaButtonIntentReceiver extends BroadcastReceiver {public static final String TAG = "FmRx/Receiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG, " mFMMediaButtonIntentReceiver onReceive");String Iaction = intent.getAction();if (Intent.ACTION_MEDIA_BUTTON.equals(Iaction)) {Log.d(TAG, " mFMMediaButtonIntentReceiver onReceive ACTION_MEDIA_BUTTON");KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);if (event == null) {return; }int keycode = event.getKeyCode();int action = event.getAction();long eventtime = event.getEventTime();Log.d(TAG, "onReceive keycode="+keycode+",action="+action);String command = null;switch (keycode) {case KeyEvent.KEYCODE_MEDIA_STOP:break;case KeyEvent.KEYCODE_HEADSETHOOK:case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:command = FmService.CMDTOGGLEPAUSE;break;case KeyEvent.KEYCODE_MEDIA_NEXT:break;case KeyEvent.KEYCODE_MEDIA_PREVIOUS:break;case KeyEvent.KEYCODE_MEDIA_PAUSE:break;case KeyEvent.KEYCODE_MEDIA_PLAY:break;/// M: AVRCP and Android Music AP supports the FF/REWIND @{case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:break;case KeyEvent.KEYCODE_MEDIA_REWIND:break;default:break;}if (command != null) {if ((action == KeyEvent.ACTION_DOWN) && (event.getRepeatCount() == 0)) {sendToStartService(context, command);}if (isOrderedBroadcast()) {abortBroadcast();}}} }public void sendToStartService(Context context, String command) {Intent i = new Intent(context, FmService.class);i.putExtra(FmService.CMD, command);context.startService(i); }
}

三. 修改 /vendor/mediatek/proprietary/packages/apps/FMRadio/AndroidMainfest.xml  ,添加如下:

<receiver android:name="com.android.fmradio.FMMediaButtonIntentReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>

结束。

Android 系统(253)---O版本,用耳机按键控制FM的修改方法相关推荐

  1. android rom 默认音量,Android 系统音量最大值的定义位置以及默认值的修改方法

    修改文件: /frameworks/base/media/java/android/media/AudioManager.java /frameworks/base/media/java/androi ...

  2. android流程点击开机键熄屏,一种基于android系统的灭屏状态下指纹解锁加速亮屏方法与流程...

    本发明涉及android系统解锁显示方法,尤其涉及一种基于android系统的灭屏状态下指纹解锁加速亮屏方法. 背景技术: 目前,随着指纹技术越来越普及,很多android系统设备都带有指纹外设,特别 ...

  3. 重温1 Android系统架构及版本

    1.Linux内核层(Linux Kernel) 为Android设备的各种硬件提供了底层驱动,Display Driver/Camera Driver/Bluetooth Driver/Flash ...

  4. Android系统开启导航栏NavigationBar(虚拟按键)

    导航栏NavigationBar 源码部分: frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManag ...

  5. android系统定制开发动态显示隐藏虚拟按键虚拟导航Navigationbar

    新需求:删除Android 原生自带的虚拟导航按键(暂定) 如想直接删除不显示Navigationbar,可以用如下两个方法 1)在资源xml文件中把导航按键的高度和宽度设置为0 frameworks ...

  6. 安卓接收耳机按键控制音频播放

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 如今连接移动设备的耳机上基本都有按键,来控制音频的播放,暂停,下一首,上一首,或电话的拨打,视频的播放等功能.而外置媒体按键的按下,安卓系统接收到这个 ...

  7. 安卓linux环境 查看进程,查看基于Android 系统单个进程内存、CPU使用情况的几种方法...

    一.利用Android API函数查看 1.1 ActivityManager查看可用内存. ActivityManager.MemoryInfo outInfo = new ActivityMana ...

  8. Android 系统(87)---常见的内存泄漏原因及解决方法

    常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...

  9. Android系统的JNI原理分析(二)- 数据类型转换和方法签名

    声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结. 本文参考了一些书籍的若干章节,比如<Android进阶解密-第9章-JNI原理>.<深入理解Andr ...

最新文章

  1. 中国7位学者当选!又一院士名单公布
  2. React Component vs React Element
  3. 【STM32H7教程】第4章 STM32H7工程模板建立(MDK5)
  4. matlab中的containers.Map()
  5. Debug下正常,而Release失败的真正原因
  6. 十二、爬了CSDN,我发现了这些
  7. 详解javascript中的call, apply
  8. Android 自定义阴影,自定义颜色样式
  9. 双向(端)链表、栈、队列
  10. Linux环境下创建运行.java文件
  11. HTML5 API详解(5):Page Visibility API帮您省流量,提高体验
  12. 【Vue2.0】— 全局事件总线GlobalEventBus(十九)
  13. c++ 全局变量_专业解码 | 带你了解Python全局变量与局部变量!
  14. UVA 1252 十五 Twenty Questions
  15. python查看矩阵大小
  16. Foxmail的创建
  17. 计算机蓝屏无法启动不了系统怎么办,电脑开机蓝屏死机,无法进入系统怎么办?...
  18. Android 定时获取上下行流量数据
  19. php swa,科学网—DBSCAN-SWA:一行命令找到溶源噬菌体 - 刘永鑫的博文
  20. Windows——重装系统时Windows 启动管理器进入系统和高级选项都数字签名错误解决方案

热门文章

  1. c语言函数实际参数,C语言:函数声明与定义的参数不一致问题,后果可能很严重哦!!!!!...
  2. 集群的可扩展性及其分布式体系结构(3)--上
  3. linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
  4. 【设计模式】第三章 单例模式
  5. Kafka三款监控工具比较
  6. 源码分析Dubbo服务提供者启动流程-下篇
  7. shell脚本语之运算符
  8. 关于Action模型驱动无法获取属性的问题
  9. 【ES】学习5-全文搜索
  10. Android注解支持(Support Annotations)