Android 6.0耳机hook按键接听和挂断电话;音乐中短按下一首,长按暂停播放;FM收音机中短按调频,长按暂停开始

耳机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;

 

你可能感兴趣的:(Android)