Android(安卓)6.0耳机hook按键接听和挂断电话;音乐中短按下一首,长按暂停播放;FM收音机中短按调频,长按暂停开始
16lz
2021-12-04
耳机hook按键复用,如题,直接贴代码:
diff --git a/alps/frameworks/base/services/core/java/com/android/server/media/MediaSessionService.java b/alps/frameworks/base/services/core/java/com/android/server/media/MediaSessionService.javaold mode 100644new mode 100755index 889d8a5..a66d9f1--- a/alps/frameworks/base/services/core/java/com/android/server/media/MediaSessionService.java+++ b/alps/frameworks/base/services/core/java/com/android/server/media/MediaSessionService.java@@ -936,8 +936,10 @@ public class MediaSessionService extends SystemService implements Monitor { mVoiceButtonDown = true; mVoiceButtonHandled = false; } else if (mVoiceButtonDown && !mVoiceButtonHandled && isLongPress) {- mVoiceButtonHandled = true;- startVoiceInput(needWakeLock);+mVoiceButtonHandled=false;+//del by frankchen+ /* mVoiceButtonHandled = true;+ startVoiceInput(needWakeLock);*/ } } else if (action == KeyEvent.ACTION_UP) { if (mVoiceButtonDown) {diff --git a/alps/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/alps/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.javaindex 39a27fd..75afd3d 100755--- a/alps/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java+++ b/alps/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java@@ -148,6 +148,9 @@ import com.mediatek.multiwindow.MultiWindowProxy; import android.net.Uri; import android.telephony.TelephonyManager; +//add by frankchen+import android.app.Instrumentation;+ /** * WindowManagerPolicy implementation for the Android phone UI. This * introduces a new method suffix, Lp, for an internal lock of the@@ -4974,8 +4977,59 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } }+//add by frankchen start+boolean VirtualKeyVibrate = false;+volatile boolean mShortcutsKeyHandled; -boolean VirtualKeyVibrate = false;//add by frankchen for key_vibrate+private void sendKeyCode(final int keyCode){ + new Thread () { + public void run() { + try { + Instrumentation inst = new Instrumentation(); + inst.sendKeyDownUpSync(keyCode); + } catch (Exception e) { + } + } + }.start(); + }++ private void interceptShortcutsKeyDown(boolean handled) {+ mShortcutsKeyHandled = handled;+ if (!handled) {+ mHandler.postDelayed(mShortcutsLongPress, ViewConfiguration.getGlobalActionKeyTimeout());+ }+ }++ private boolean interceptShortcutsKeyUp(boolean canceled) {+ if (!mShortcutsKeyHandled) {+ mHandler.removeCallbacks(mShortcutsLongPress);+ return !canceled;+ }+ return false;+ }++ private final Runnable mShortcutsLongPress = new Runnable() {+ @Override+ public void run() {+ System.out.println("mShortcutsLongPress down");+ //if(!mKeyTestRunning==true){ + mShortcutsKeyHandled = true; + //startShortcutsActivity(true);+sendKeyCode(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);+ // }+ }+ };++private void startShortcutsActivity(boolean isLongClick){+ Log.d(TAG,"startShortcutsActivity " + isLongClick);+if(!isLongClick){+sendKeyCode(KeyEvent.KEYCODE_MEDIA_NEXT);+}+ } +//add by frankchen for end /** {@inheritDoc} */ @Override@@ -5001,7 +5055,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0; final boolean down = event.getAction() == KeyEvent.ACTION_DOWN; final boolean canceled = event.isCanceled();- final int keyCode = event.getKeyCode();+//modify by frankchen+ /*final*/ int keyCode = event.getKeyCode(); final boolean isInjected = (policyFlags & WindowManagerPolicy.FLAG_INJECTED) != 0; @@ -5022,6 +5077,35 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Basic policy based on interactive state. int result;+//add by frankchen start+if(keyCode == KeyEvent.KEYCODE_HEADSETHOOK){ //KeyEvent.KEYCODE_VOLUME_DOWN+if(down){+//this is headsethook down + interceptShortcutsKeyDown(false);+TelecomManager telecomManager = getTelecommService();+System.out.println("KEYCODE_HEADSETHOOK down telecomManager=="+telecomManager);+if(telecomManager!=null)+{+if (telecomManager.isRinging())+{+ telecomManager.acceptRingingCall();+ return 1;+}else if(telecomManager.isInCall())+{+telecomManager.endCall();+mEndCallKeyHandled = true;+return 1;+}+}+}else+{+interceptShortcutsKeyUp(canceled);+if(!mShortcutsKeyHandled){+startShortcutsActivity(false);+}+}+}+//add by frankchen end boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0 || event.isWakeKey(); if (interactive || (isInjected && !isWakeKey)) {diff --git a/alps/packages/apps/FMRadio/AndroidManifest.xml b/alps/packages/apps/FMRadio/AndroidManifest.xmlold mode 100644new mode 100755index 7bc6a6e..459f070--- a/alps/packages/apps/FMRadio/AndroidManifest.xml+++ b/alps/packages/apps/FMRadio/AndroidManifest.xml@@ -100,6 +100,13 @@ +++ + + + + diff --git a/alps/packages/apps/FMRadio/src/com/android/fmradio/FMMediaButtonIntentReceiver.java b/alps/packages/apps/FMRadio/src/com/android/fmradio/FMMediaButtonIntentReceiver.javanew file mode 100755index 0000000..d26c877--- /dev/null+++ b/alps/packages/apps/FMRadio/src/com/android/fmradio/FMMediaButtonIntentReceiver.java@@ -0,0 +1,76 @@+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";++@Override+public 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_HEADSETHOOK:+case KeyEvent.KEYCODE_MEDIA_NEXT:+ command = FmService.FM_SEEK_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);+}+}\ No newline at end of filediff --git a/alps/packages/apps/FMRadio/src/com/android/fmradio/FmService.java b/alps/packages/apps/FMRadio/src/com/android/fmradio/FmService.javaold mode 100644new mode 100755index 7226b0a..0960d93--- a/alps/packages/apps/FMRadio/src/com/android/fmradio/FmService.java+++ b/alps/packages/apps/FMRadio/src/com/android/fmradio/FmService.java@@ -66,6 +66,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator;+//add by frankchen start+import android.content.ComponentName;+import android.media.RemoteControlClient;+import android.media.RemoteControlClient.MetadataEditor;+//add by frankchen end /** * Background service to control FM or do background tasks.@@ -73,11 +78,19 @@ import java.util.Iterator; public class FmService extends Service implements FmRecorder.OnRecorderStateChangedListener { // Logging private static final String TAG = "FmService";++//add by frankchen 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;+ //add by frankchen end // Broadcast messages from other sounder APP to FM service private static final String SOUND_POWER_DOWN_MSG = "com.android.music.musicservicecommand"; private static final String FM_SEEK_PREVIOUS = "fmradio.seek.previous";- private static final String FM_SEEK_NEXT = "fmradio.seek.next";+ public static final String FM_SEEK_NEXT = "fmradio.seek.next"; private static final String FM_TURN_OFF = "fmradio.turnoff"; private static final String CMDPAUSE = "pause"; @@ -479,6 +492,7 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan private Thread mRenderThread = null; private AudioRecord mAudioRecord = null; private AudioTrack mAudioTrack = null;+private AudioTrack mButtonAudioTrack = null; // add by frankchen start private static final int SAMPLE_RATE = 44100; private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_CONFIGURATION_STEREO; private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;@@ -716,6 +730,10 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan } mPowerStatus = DURING_POWER_UP;+// add by frankchen start+mButtonAudioTrack.play();+mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING);+// add by frankchen end // if device open fail when chip reset, it need open device again before // power up@@ -824,6 +842,10 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan } // activity used for update powerdown menu mPowerStatus = POWER_DOWN;+//add by frankchen start+mButtonAudioTrack.stop();+mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);+//add by frankchen end if (isRdsSupported()) { stopRdsThread();@@ -1417,6 +1439,29 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan mWakeLock.setReferenceCounted(false); } sRecordingSdcard = FmUtils.getDefaultStoragePath();+//add by frankchen 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);+//add by frankchen end registerFmBroadcastReceiver(); registerSdcardReceiver();@@ -1860,6 +1905,21 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan mAudioManager.setParameters("AudioFmPreStop=0"); } setMute(true);+//add by chenxidua 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");+}+//add by chenxidua end // stop rds first, avoid blocking other native method if (isRdsSupported()) { stopRdsThread();@@ -1918,6 +1978,23 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan @Override public int onStartCommand(Intent intent, int flags, int startId) { int ret = super.onStartCommand(intent, flags, startId);+//add by frankchen start+Log.d(TAG, ">>> FmRadioService.onStartCommand intent.getAction(): " + intent.getAction() + " startId: " + startId);+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();+}+}else if(FM_SEEK_NEXT.equals(cmd))+{+seekStationAsync(FmUtils.computeFrequency(getFrequency()), true);+}+//add by frankchen end if (intent != null) { String action = intent.getAction();diff --git a/alps/packages/apps/Music/src/com/android/music/MediaButtonIntentReceiver.java b/alps/packages/apps/Music/src/com/android/music/MediaButtonIntentReceiver.javaold mode 100644new mode 100755index 40abdeb..a9a6a79--- a/alps/packages/apps/Music/src/com/android/music/MediaButtonIntentReceiver.java+++ b/alps/packages/apps/Music/src/com/android/music/MediaButtonIntentReceiver.java@@ -122,10 +122,11 @@ public class MediaButtonIntentReceiver extends BroadcastReceiver { case KeyEvent.KEYCODE_MEDIA_STOP: command = MediaPlaybackService.CMDSTOP; break;- case KeyEvent.KEYCODE_HEADSETHOOK:+ //case KeyEvent.KEYCODE_HEADSETHOOK: //del by frankchen case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: command = MediaPlaybackService.CMDTOGGLEPAUSE; break;+//case KeyEvent.KEYCODE_HEADSETHOOK: //add by frankchen case KeyEvent.KEYCODE_MEDIA_NEXT: command = MediaPlaybackService.CMDNEXT; break;
更多相关文章
- 使用IntelliJ IDEA 编译Android(安卓)JNI
- android使用键盘钩子实现按键劫持
- 获取Android的Java源代码并在Eclipse中关联查看
- Android利器-AndroidStudio快捷键(For Mac)
- Android音频子系统源码分析之AudioTrack的使用
- Android(安卓)Native代码中的status_t定义
- Eclipse环境下格式化Android的代码风格
- Android(安卓)混淆代码问题总结
- 利用HTML5开发Android