Android 系统(253)---O版本,用耳机按键控制FM的修改方法
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的修改方法相关推荐
- android rom 默认音量,Android 系统音量最大值的定义位置以及默认值的修改方法
修改文件: /frameworks/base/media/java/android/media/AudioManager.java /frameworks/base/media/java/androi ...
- android流程点击开机键熄屏,一种基于android系统的灭屏状态下指纹解锁加速亮屏方法与流程...
本发明涉及android系统解锁显示方法,尤其涉及一种基于android系统的灭屏状态下指纹解锁加速亮屏方法. 背景技术: 目前,随着指纹技术越来越普及,很多android系统设备都带有指纹外设,特别 ...
- 重温1 Android系统架构及版本
1.Linux内核层(Linux Kernel) 为Android设备的各种硬件提供了底层驱动,Display Driver/Camera Driver/Bluetooth Driver/Flash ...
- Android系统开启导航栏NavigationBar(虚拟按键)
导航栏NavigationBar 源码部分: frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManag ...
- android系统定制开发动态显示隐藏虚拟按键虚拟导航Navigationbar
新需求:删除Android 原生自带的虚拟导航按键(暂定) 如想直接删除不显示Navigationbar,可以用如下两个方法 1)在资源xml文件中把导航按键的高度和宽度设置为0 frameworks ...
- 安卓接收耳机按键控制音频播放
全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 如今连接移动设备的耳机上基本都有按键,来控制音频的播放,暂停,下一首,上一首,或电话的拨打,视频的播放等功能.而外置媒体按键的按下,安卓系统接收到这个 ...
- 安卓linux环境 查看进程,查看基于Android 系统单个进程内存、CPU使用情况的几种方法...
一.利用Android API函数查看 1.1 ActivityManager查看可用内存. ActivityManager.MemoryInfo outInfo = new ActivityMana ...
- Android 系统(87)---常见的内存泄漏原因及解决方法
常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...
- Android系统的JNI原理分析(二)- 数据类型转换和方法签名
声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结. 本文参考了一些书籍的若干章节,比如<Android进阶解密-第9章-JNI原理>.<深入理解Andr ...
最新文章
- 中国7位学者当选!又一院士名单公布
- React Component vs React Element
- 【STM32H7教程】第4章 STM32H7工程模板建立(MDK5)
- matlab中的containers.Map()
- Debug下正常,而Release失败的真正原因
- 十二、爬了CSDN,我发现了这些
- 详解javascript中的call, apply
- Android 自定义阴影,自定义颜色样式
- 双向(端)链表、栈、队列
- Linux环境下创建运行.java文件
- HTML5 API详解(5):Page Visibility API帮您省流量,提高体验
- 【Vue2.0】— 全局事件总线GlobalEventBus(十九)
- c++ 全局变量_专业解码 | 带你了解Python全局变量与局部变量!
- UVA 1252	 十五 Twenty Questions
- python查看矩阵大小
- Foxmail的创建
- 计算机蓝屏无法启动不了系统怎么办,电脑开机蓝屏死机,无法进入系统怎么办?...
- Android 定时获取上下行流量数据
- php swa,科学网—DBSCAN-SWA:一行命令找到溶源噬菌体 - 刘永鑫的博文
- Windows——重装系统时Windows 启动管理器进入系统和高级选项都数字签名错误解决方案