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

 

更多相关文章

  1. 使用IntelliJ IDEA 编译Android(安卓)JNI
  2. android使用键盘钩子实现按键劫持
  3. 获取Android的Java源代码并在Eclipse中关联查看
  4. Android利器-AndroidStudio快捷键(For Mac)
  5. Android音频子系统源码分析之AudioTrack的使用
  6. Android(安卓)Native代码中的status_t定义
  7. Eclipse环境下格式化Android的代码风格
  8. Android(安卓)混淆代码问题总结
  9. 利用HTML5开发Android

随机推荐

  1. android 图形展示
  2. proguard-project.txt和project.properti
  3. Android(安卓)WebView使用深入浅出
  4. android Intent (隐式意图和显示意图)
  5. linux环境下android常用工具和技巧
  6. SlidingDrawer源码分析
  7. 64位WIN7下Android(安卓)开发环境搭建(SDK
  8. 【Android代码片段之六】Toast工具类(实现
  9. 聚焦 Android 11: Google Play 应用分发
  10. Accessibility辅助功能--一念天堂,一念地