2017-10-05 6 views
1

j'utilise ces méthodes pour activer la mise au point sur Touch sur SurFaceViewAndroid: hardware.Camera méthode de mise au point ne fonctionne pas avec certains appareils

private SurfaceView surfaceiew; 
private CameraSource camSource; 
private Camera camera; 
private Camera.Parameters params; 



private void initCameraFocusListener() { 
    surfaceView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      cameraFocus(event, camSource, Camera.Parameters.FOCUS_MODE_AUTO); 

      return false; 
     } 
    }); 

} 




// camera focus method 
private boolean cameraFocus(MotionEvent event, @NonNull CameraSource cameraSource, @NonNull String focusMode) { 
    Field[] declaredFields = CameraSource.class.getDeclaredFields(); 


    int pointerId = event.getPointerId(0); 
    int pointerIndex = event.findPointerIndex(pointerId); 
    // Get the pointer's current position 
    float x = event.getX(pointerIndex); 
    float y = event.getY(pointerIndex); 

    float touchMajor = event.getTouchMajor(); 
    float touchMinor = event.getTouchMinor(); 

    Rect touchRect = new Rect((int)(x - touchMajor/2), (int)(y - touchMinor/2), (int)(x + touchMajor/2), (int)(y + touchMinor/2)); 

    Rect focusArea = new Rect(); 

    focusArea.set(touchRect.left * 2000/surfaceView.getWidth() - 1000, 
      touchRect.top * 2000/surfaceView.getHeight() - 1000, 
      touchRect.right * 2000/surfaceView.getWidth() - 1000, 
      touchRect.bottom * 2000/surfaceView.getHeight() - 1000); 

    // Submit focus area to camera 

    ArrayList<Camera.Area> focusAreas = new ArrayList<Camera.Area>(); 
    focusAreas.add(new Camera.Area(focusArea, 1000)); 

    for (Field field : declaredFields) { 
     if (field.getType() == Camera.class) { 
      field.setAccessible(true); 
      try { 
       camera = (Camera) field.get(cameraSource); 
       if (camera != null) { 
        params = camera.getParameters(); 
        params.setFocusMode(focusMode); 
        params.setFocusAreas(focusAreas); 
        camera.setParameters(params); 

        // Start the autofocus operation 

        camera.autoFocus(new Camera.AutoFocusCallback() { 
         @Override 
         public void onAutoFocus(boolean b, Camera camera) { 
          // currently set to auto-focus on single touch 
         } 
        }); 
        return true; 
       } 

       return false; 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 

      break; 
     } 
    } 



    return false; 
} 

il fonctionne parfaitement sur la plupart des appareils, mais je l'ai trouvé que cela ne fonctionne pas sur Huawei Honor 5x qui utilise la version Android 5.0. La partie bizarre est la méthode au lieu de faire son travail, cela me prend à la page précédente (activité). Comment faire la mise au point automatique avec CameraSource et SurfaceView correctement?

Répondre

1

Je suppose que le problème vient du fait que j'utilise une classe obsolète: Caméra