MTK 平台自带的相机是没有触摸拍照功能的,要加这个功能得先跟大量代码,去看快门按钮是如何响应的,预览界面是如何响应触摸对焦的。过程太繁琐,这里就不介绍如何定位代码、跟代码了,下面直接上解决办法。
1、在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/bridge/CameraAppUiImpl.java 中添加快门按钮单击事件的包装方法:
public class CameraAppUiImpl implements ICameraAppUi {......@Overridepublic ImageView getPhotoShutter() {return mShutterManager.getPhotoShutter();}/// START. Add "Touch to capture" feature. By ShawnXiaFei, 20170504.public void performPhotoShutter(){if(null == mShutterManager){throw new IllegalStateException("mShutterManager is null.");}mShutterManager.performPhotoShutter();}/// END. Add "Touch to capture" feature. By ShawnXiaFei, 20170504.......}
这里我加了个 null 判断,为 null 时直接抛异常,这样能方便定位问题。
因为 ShutterManager 里面已经有了perform方法,所以我这里是直接调用了 ShutterManager.performPhotoShutter(),当然也可以通过 getPhotoShutter() 拿到快门按钮对象后,再设置相应逻辑。
public class ShutterManager extends ViewManager {......public ShutterButton getPhotoShutter() {return mPhotoShutter;}......public boolean performPhotoShutter() {boolean performed = false;if (mPhotoShutter != null && mPhotoShutter.isEnabled()) {mPhotoShutter.performClick();performed = true;}Log.d(TAG, "performPhotoShutter() mPhotoShutter=" + mPhotoShutter + ", return "+ mPhotoShutter);return performed;}......}
2、在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/CameraActivity.java 文件的 onSingleTapUp 方法中添加触摸判断逻辑:
public class CameraActivity extends ActivityBase implementsPreviewFrameLayout.OnSizeChangedListener,ActivityCompat.OnRequestPermissionsResultCallback {......public void onSingleTapUp(View view, int x, int y) {......if (isCancelSingleTapUp()) {Log.i(TAG, "will cancel this singleTapUp event");return;}if (!mCameraAppUi.collapseSetting(true)) {if (mCameraActor.getonSingleTapUpListener() != null) {mCameraActor.getonSingleTapUpListener().onSingleTapUp(view,x, y);}}/// START. Add "Touch to capture" feature. By XiaFei, 20170504.if(getCameraId() == 1){mCameraAppUi.performPhotoShutter();return;}/// END. Add "Touch to capture" feature. By XiaFei, 20170504.}}......}
到这触摸拍照功能就实现了,虽然分析的时候跟了很多代码,但最后解决方法很简单,满满的收获感。
