耳机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.java
old mode 100644
new mode 100755
index 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.java
index 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.xml
old mode 100644
new mode 100755
index 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.java
new file mode 100755
index 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 file
diff --git a/alps/packages/apps/FMRadio/src/com/android/fmradio/FmService.java b/alps/packages/apps/FMRadio/src/com/android/fmradio/FmService.java
old mode 100644
new mode 100755
index 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.java
old mode 100644
new mode 100755
index 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;