2016-03-05 20 views
6

Burada barkod tarayıcı orijinal örnekle oynuyorum ile/Flaş:Erişim Otofokus tarihinde Vizyon 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

Onlar böyle kamera fabrika içinde Otofokus/Flaş başlatmak edebiliyoruz:

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

Bununla birlikte, cameraSource oluşturucudaki bu yöntem geçerli sürümde gider ve bu nedenle bu ayarlara erişilemez. Ayrıca, kullanım sırasında FlashMode'u değiştirmem gerekiyor, bu da bunu yapmanın yolu değil. Çalışır rağmen

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

, bu yardım etmez: Ben kamerayı erişen bu çirkin çözüm buldu getParameters().setFocusMode() çağrılırken bu özel durum alıyorum: Açıkçası

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

ne yapıyorum bir değil Bunu yapmanın doğru yolu, ancak bununla ilgili bir doküman yok gibi görünüyor.

İpuçları için teşekkürler.

cevap

4

Sadece kodunuzu aşağıdaki gibi optimize edin ve Camera Source sınıfını oluşturduktan sonra bu yöntemi çağırmalısınız.

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

Bu camerasource nesnesini kullanarak Google Vizyon Api flaş etkinleştirmek için size yardımcı olacaktır.

+1

Bu benim için harika çalıştı. Teşekkürler! Camera1 API'si kullanımdan kaldırılmış olsa da. Camera2 güncellemesinde herhangi bir şans var mı? –

+0

'getCamera' return' null' –

+0

Bunun resmi olarak desteklenmemesi çok garip görünüyor, ama bu benim için çalıştı! – SleepingLlama

İlgili konular