1

다음은 바코드 스캐너 작업이며 setAutoFocusEnabled (true)를 제외한 모든 항목이 정상적으로 작동합니다. 런타임시 Samsung Tab E T561이 자동 초점 지원 장치이지만 내 장치가 자동 초점을 지원하지 않는다는 메시지를 반환합니다.CameraSource .setAutoFocusEnabled (true)는 장치가 자동 초점을 지원하지만이 장치에서 카메라 자동 초점을 지원하지 않습니다.

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.util.SparseArray; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.EditText; 

import com.google.android.gms.vision.CameraSource; 
import com.google.android.gms.vision.Detector; 
import com.google.android.gms.vision.barcode.Barcode; 
import com.google.android.gms.vision.barcode.BarcodeDetector; 

import java.io.IOException; 

import static com.google.android.gms.vision.CameraSource.CAMERA_FACING_BACK; 
import static com.google.android.gms.vision.CameraSource.CAMERA_FACING_FRONT; 

public class ScanBarcodeActivity extends AppCompatActivity { 

    private String TAG = "ScanBarcodeActivity"; 
    private BarcodeDetector barcodeDetector; 
    private SurfaceView cameraView; 
    private CameraSource cameraSource; 
    private EditText cardNo; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_scan_barcode); 
    } 

    @Override 
    protected void onResume() { 
     cameraView = (SurfaceView) findViewById(R.id.surfaceViewCamera); 
     cardNo = (EditText) findViewById(R.id.editTextBarcode); 

     scanBarcodeCam(0); 
     super.onResume(); 
    } 

    @Override 
    protected void onDestroy() { 
     if(cameraSource != null) { 
      cameraSource.stop(); 
      cameraSource.release(); 
      cameraSource = null; 
     } 

     super.onDestroy(); 
    } 

    public void switchCam(View view) { 

     if(cameraSource.getCameraFacing() == CAMERA_FACING_BACK) { 
      cameraSource.stop(); 
      cameraSource.release(); 
      cameraSource = null; 
      scanBarcodeCam(0); 
      Log.i(TAG, "switchCam to front"); 
     } else { 
      cameraSource.stop(); 
      cameraSource.release(); 
      cameraSource = null; 
      scanBarcodeCam(1); 
      Log.i(TAG, "switchCam to back"); 
     } 

    } 

    public void scanBarcodeCam(int cam) { 

     if(barcodeDetector == null) { 
      barcodeDetector = new BarcodeDetector.Builder(this) 
        .setBarcodeFormats(Barcode.EAN_13) 
        .build(); 
     } 

     if(cam == 0) { 
      cameraSource = new CameraSource 
        .Builder(this, barcodeDetector) 
        .setRequestedPreviewSize(640, 480) 
        .setFacing(CAMERA_FACING_FRONT) 
        .setRequestedFps(30.0f) 
        .build(); 
     } else if(cam == 1) { 
      cameraSource = new CameraSource 
        .Builder(this, barcodeDetector) 
        .setRequestedPreviewSize(640, 480) 
        .setFacing(CAMERA_FACING_BACK) 
        .setRequestedFps(30.0f) 
        .setAutoFocusEnabled(true) 
        .build(); 
     } 

     if(!cameraView.getHolder().getSurface().isValid()) { 
      Log.i(TAG, "*** new SurfaceHolder"); 
      cameraView.getHolder().addCallback(new SurfaceHolder.Callback() { 
       @Override 
       public void surfaceCreated(SurfaceHolder holder) { 
        try { 
         cameraSource.start(cameraView.getHolder()); 
        } catch (IOException | RuntimeException e) { 
         Log.e(TAG, e.getMessage()); 
        } 
       } 

       @Override 
       public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

       } 

       @Override 
       public void surfaceDestroyed(SurfaceHolder holder) { 
        if (cameraSource != null) { 
         cameraSource.stop(); 
         cameraSource.release(); 
         cameraSource = null; 
        } 
       } 
      }); 
     } else { 
      try { 
       cameraSource.start(cameraView.getHolder()); 
      } catch(IOException e) { 
       Log.e(TAG, e.getMessage()); 
      } 
     } 

     barcodeDetector.setProcessor(new Detector.Processor<Barcode>() { 
      @Override 
      public void release() { 

      } 

      @Override 
      public void receiveDetections(Detector.Detections<Barcode> detections) { 
       final SparseArray<Barcode> barcodes = detections.getDetectedItems(); 

       if(barcodes.size() != 0) { 
        cardNo.post(new Runnable() { 
         @Override 
         public void run() { 
          cardNo.setText(barcodes.valueAt(0).displayValue); 
         } 
        }); 
       } 
      } 
     }); 
    } 
} 

도움이 되었으면 도움이 될 것입니다.

답변

3

투쟁의 2 일 후에 나는 마침내 그 문제를 "꼼꼼하게"관리했다. 하지만 안드로이드 개발팀은 setAutoFocusEnabled (true)가 자동 포커스가있는 장치에서 작동하지 않는 이유를 심각하게 고려해야합니다. 여기

내 수정, 그것은 다른 사람에게 약간의 시간을 절약 희망 :
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if(event.getAction() == MotionEvent.ACTION_UP) { 
     float x = event.getX(); 
     float y = event.getY(); 
     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)); 

     this.submitFocusAreaRect(touchRect); 
    } 
    return super.onTouchEvent(event); 
} 

private void submitFocusAreaRect(final Rect touchRect) { 
    Field[] declaredFields = CameraSource.class.getDeclaredFields(); 

    for (Field field : declaredFields) { 
     if (field.getType() == Camera.class) { 
      field.setAccessible(true); 
      try { 
       Camera camera = (Camera) field.get(cameraSource); 
       if (camera != null) { 
        Camera.Parameters cameraParameters = camera.getParameters(); 

        if(cameraParameters.getMaxNumFocusAreas() == 0) { 
         return; 
        } 

        Rect focusArea = new Rect(); 

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

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

        cameraParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
        cameraParameters.setFocusAreas(focusAreas); 
        camera.setParameters(cameraParameters); 

        camera.autoFocus(this); 
       } 
      } catch (IllegalAccessException | RuntimeException e) { 
       e.getMessage(); 
      } 

      break; 
     } 
    } 

} 

지금 나뿐만 아니라 후면 카메라로 바코드를 스캔 할 수 있습니다. 예!

+0

API는 FOCUS_MODE_CONTINUOUS_VIDEO를 사용합니다. 내 생각 엔 장치가이 모드를 지원하지 않으며 FOCUS_MODE_AUTO가 지원됩니다. – pm0733464

+0

Samsung Tab E T561은 자동 초점을 지원합니다. 모드 사용하려고하는 모드 : setAutoFocusEnabled (true). –