长按相机键超过10s实现打开相机录像功能

一、前提

手机硬件上有相机按键;没有也无所谓,可以使用系统中未使用的键值,通过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);

大功告成!看了是不是感觉很简单!只要一个广播就可以完美实现了!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值