2016-03-05 25 views
6

sto giocando con l'originale esempio di barcode scanner qui:Accesso AutoFocus/Flash con Google Vision Barcode Reader

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/BarcodeCaptureActivity.java

sono in grado di avviare l'autofocus/Flash all'interno della fabbrica macchina fotografica come questo:

// Creates and starts the camera. Note that this uses a higher resolution in comparison 
    // to other detection examples to enable the barcode detector to detect small barcodes 
    // at long distances. 
    CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector) 
      .setFacing(CameraSource.CAMERA_FACING_BACK) 
      .setRequestedPreviewSize(1600, 1024) 
      .setRequestedFps(15.0f); 

    // make sure that auto focus is an available option 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     builder = builder.setFocusMode(
       autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null); 
    } 

    mCameraSource = builder 
      .setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null) 
      .build(); 

Tuttavia questo metodo su CameraSource Builder è andato nella versione attuale e quindi questa impostazione non è possibile accedere. Inoltre ho bisogno di cambiare la FlashMode durante l'uso, quindi non è il modo di farlo neanche. Ho trovato questa brutta soluzione per l'accesso alla fotocamera:

public static Camera getCamera(@NonNull CameraSource cameraSource) { 
    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) { 
        return camera; 
       } 

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

      break; 
     } 
    } 

    return null; 
} 

Anche se funziona, non aiuta: quando si chiama getParameters().setFocusMode() sto ottenendo questa eccezione:

Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference 

Ovviamente quello che sto facendo non è un modo giusto per farlo, ma sembra che non ci sia documentazione a riguardo.

Grazie per i suggerimenti.

risposta

4

Basta ottimizzare il codice come segue e devi chiamare questo metodo dopo aver creato la classe Camera Source.

private Camera camera = null; 
boolean flashmode=false; 
private void flashOnButton() { 
    camera=getCamera(mCameraSource); 
    if (camera != null) { 
     try { 
      Camera.Parameters param = camera.getParameters(); 
     param.setFlashMode(!flashmode?Camera.Parameters.FLASH_MODE_TORCH :Camera.Parameters.FLASH_MODE_OFF); 
      camera.setParameters(param); 
      flashmode = !flashmode; 
      if(flashmode){ 
       showToast("Flash Switched ON"); 
      } 
      else { 
       showToast("Flash Switched Off"); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 
private static Camera getCamera(@NonNull CameraSource cameraSource) { 
    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) { 
        return camera; 
       } 
       return null; 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      break; 
     } 
    } 
    return null; 
} 

Questo vi aiuterà a abilitare il flash in Google Vision Api utilizzando oggetto camerasource.

+1

Questo ha funzionato alla grande per me. Grazie! Anche se Camera1 api è deprecato. Qualche possibilità su un aggiornamento Camera2? –

+0

'getCamera' return' null' –

+0

Sembra molto strano che questo non sia supportato ufficialmente, ma questo ha funzionato per me! – SleepingLlama

Problemi correlati