2016-03-05 13 views
6

gram z oryginalnym przykładzie skanera kodów kreskowych tutaj:Dostęp AutoFocus/Flash z Google Vision Czytnik kodów kreskowych

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

są w stanie uruchomić autofokus/Flash w fabryce kamery tak:

// 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(); 

Jednak ta metoda na kreatorze cameraSource zniknęła w aktualnej wersji, więc nie można uzyskać dostępu do tego ustawienia. Również muszę zmienić FlashMode podczas użytkowania, więc nie jest to również sposób na to. Uważam, że ten brzydki rozwiązanie do dostępu do kamery:

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; 
} 

Chociaż to działa, to nie pomaga: Dzwoniąc getParameters().setFocusMode() otrzymuję ten wyjątek:

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

Oczywiście to, co robię, nie jest Właściwy sposób to zrobić, ale wydaje się, że nie ma na ten temat dokumentacji.

Dzięki za wskazówki.

Odpowiedz

4

Po prostu zoptymalizuj swój kod w następujący sposób i musisz wywołać tę metodę po zbudowaniu klasy Źródło kamery.

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; 
} 

To pomoże Ci włączyć lampę błyskową w Google Vision Api użyciu obiektu camerasource.

+1

To zadziałało dla mnie świetnie. Dzięki! Chociaż api Camera1 jest przestarzałe. Czy masz szansę na aktualizację Camera2? –

+0

'getCamera' zwraca' null' –

+0

Wydaje się bardzo dziwne, że nie jest to oficjalnie obsługiwane, ale to działało dla mnie! – SleepingLlama

Powiązane problemy