MTK 平台自带的相机是没有触摸拍照功能的,要加这个功能得先跟大量代码,去看快门按钮是如何响应的,预览界面是如何响应触摸对焦的。过程太繁琐,这里就不介绍如何定位代码、跟代码了,下面直接上解决办法。

    1、在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/bridge/CameraAppUiImpl.java 中添加快门按钮单击事件的包装方法:

    1. public class CameraAppUiImpl implements ICameraAppUi {
    2. ......
    3. @Override
    4. public ImageView getPhotoShutter() {
    5. return mShutterManager.getPhotoShutter();
    6. }
    7. /// START. Add "Touch to capture" feature. By ShawnXiaFei, 20170504.
    8. public void performPhotoShutter(){
    9. if(null == mShutterManager){
    10. throw new IllegalStateException("mShutterManager is null.");
    11. }
    12. mShutterManager.performPhotoShutter();
    13. }
    14. /// END. Add "Touch to capture" feature. By ShawnXiaFei, 20170504.
    15. ......
    16. }

    这里我加了个 null 判断,为 null 时直接抛异常,这样能方便定位问题。
    因为 ShutterManager 里面已经有了perform方法,所以我这里是直接调用了 ShutterManager.performPhotoShutter(),当然也可以通过 getPhotoShutter() 拿到快门按钮对象后,再设置相应逻辑。

    1. public class ShutterManager extends ViewManager {
    2. ......
    3. public ShutterButton getPhotoShutter() {
    4. return mPhotoShutter;
    5. }
    6. ......
    7. public boolean performPhotoShutter() {
    8. boolean performed = false;
    9. if (mPhotoShutter != null && mPhotoShutter.isEnabled()) {
    10. mPhotoShutter.performClick();
    11. performed = true;
    12. }
    13. Log.d(TAG, "performPhotoShutter() mPhotoShutter=" + mPhotoShutter + ", return "
    14. + mPhotoShutter);
    15. return performed;
    16. }
    17. ......
    18. }

    2、在vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/CameraActivity.java 文件的 onSingleTapUp 方法中添加触摸判断逻辑:

    1. public class CameraActivity extends ActivityBase implements
    2. PreviewFrameLayout.OnSizeChangedListener,
    3. ActivityCompat.OnRequestPermissionsResultCallback {
    4. ......
    5. public void onSingleTapUp(View view, int x, int y) {
    6. ......
    7. if (isCancelSingleTapUp()) {
    8. Log.i(TAG, "will cancel this singleTapUp event");
    9. return;
    10. }
    11. if (!mCameraAppUi.collapseSetting(true)) {
    12. if (mCameraActor.getonSingleTapUpListener() != null) {
    13. mCameraActor.getonSingleTapUpListener().onSingleTapUp(view,
    14. x, y);
    15. }
    16. }
    17. /// START. Add "Touch to capture" feature. By XiaFei, 20170504.
    18. if(getCameraId() == 1){
    19. mCameraAppUi.performPhotoShutter();
    20. return;
    21. }
    22. /// END. Add "Touch to capture" feature. By XiaFei, 20170504.
    23. }
    24. }
    25. ......
    26. }

    到这触摸拍照功能就实现了,虽然分析的时候跟了很多代码,但最后解决方法很简单,满满的收获感。