一、前提
手机硬件上有相机按键;没有也无所谓,可以使用系统中未使用的键值,通过adb命令模拟按键去执行按键操作!我们这里就介绍有相机按键的情况下,如何实现长按相机按键10s后打开相机!
二、监听按键事件
1.frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
else if(keyCode == KeyEvent.KEYCODE_CAMERA) {
if(down && repeatCount == 10 && isCameraRunning()){
Intent longpressintent = new Intent("com.mediatek.camera.videolongpresskey");
mContext.sendBroadcast(longpressintent);
}
}
监听按键事件,发送广播。同时,这里我们还得判断当前camera的状态:isCameraRunning()
private boolean isCameraRunning() {
ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
String currentPackageName = cn.getPackageName();
String currentClassName = cn.getClassName();
String currentShortClassName = cn.getShortClassName();
Log.e("dengying", "pkg="+currentPackageName+" ClassName="+currentClassName+" ShortClassName="+currentShortClassName);
if (!currentPackageName.equals("") && !currentClassName.equals("") && currentPackageName.equals("com.mediatek.camera")
&& (currentClassName.equals("com.android.camera.CameraLauncher")
|| currentClassName.equals("com.android.camera.Camera")
|| currentClassName.equals("com.android.camera.SecureCameraActivity")
|| currentClassName.equals("com.android.camera.CameraActivity")
|| currentClassName.equals("com.android.camera.CaptureActivity"))) {
return true;
}
return false;
}
三、camera当中去接收广播,并执行录像
1.vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/CameraActivity.java
创建内部广播:
MyVideoLongPressReceiver mBroadcastReceiver ;
public class MyVideoLongPressReceiver extends BroadcastReceiver {
public String MYTEST_VIDEO = "com.mediatek.camera.videolongpresskey";
@Override
public void onReceive(Context context, Intent intent) {
if (MYTEST_VIDEO.equals(intent.getAction()) && (mCameraActor.getMode() != ModePicker.MODE_DEPTH_OFFOCUS)
&& (mCameraActor.getMode() != ModePicker.MODE_BINGCOO_FACEBEAUTY)) {
mCameraAppUi.mSettingManager.collapse(true);
if (FeatureSwitcher.isSubSettingEnabled()) {
mCameraAppUi.mSubSettingManager.collapse(true);
}
if (isFullScreen() && isCameraOpened()
&& (getCameraState() == CameraActivity.STATE_IDLE ||
getCameraState() == CameraActivity.STATE_FOCUSING)) {
ShutterButton.OnShutterButtonListener listener = getCameraActor().getVideoShutterButtonListener();
int mode = getCameraActor().getMode();
if (listener != null) {
mModuleManager.onVideoShutterButtonClick();
} else if (mModePicker.getModeIndex(mode) != ModePicker.MODE_VIDEO) {
if (Storage.getLeftSpace() > 0) {
if (mModePicker.getModeIndex(mode) == ModePicker.MODE_PHOTO_PIP) {
mModePicker.setCurrentMode(ModePicker.MODE_VIDEO_PIP);
} else if (mModePicker.getModeIndex(
getCameraActor().getMode())
== ModePicker.MODE_STEREO_CAMERA
&& com.android.camera.ParametersHelper.isVsDofSupported(
getParameters())) {
mModePicker.setCurrentMode(ModePicker.MODE_VIDEO_STEREO);
} else {
mModePicker.setCurrentMode(ModePicker.MODE_VIDEO);
}
mMainHandler.post(new Runnable() {
@Override
public void run() {
mModuleManager.onVideoShutterButtonClick();
}
});
} else {
Log.d(TAG,"CameraAtivity.java onVideoShutterButtonClick error");
}
}
}
}
}
}
2.注册和销毁广播(用动态注册)
(1).onCreate()
mBroadcastReceiver = new MyVideoLongPressReceiver();
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction("com.mediatek.camera.videolongpresskey");
registerReceiver(mBroadcastReceiver,mIntentFilter);
(2).onDestroy()
unregisterReceiver(mBroadcastReceiver);
大功告成!看了是不是感觉很简单!只要一个广播就可以完美实现了!