MTK 平台自带的相机是没有触摸拍照功能的,要加这个功能得先跟大量代码,去看快门按钮是如何响应的,预览界面是如何响应触摸对焦的。过程太繁琐,这里就不介绍如何定位代码、跟代码了,下面直接上解决办法。
1、在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/bridge/CameraAppUiImpl.java 中添加快门按钮单击事件的包装方法:
public class CameraAppUiImpl implements ICameraAppUi {
......
@Override
public 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 implements
PreviewFrameLayout.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.
}
}
......
}
到这触摸拍照功能就实现了,虽然分析的时候跟了很多代码,但最后解决方法很简单,满满的收获感。