13

En son Marshmallow yapısında, özellikle de fenerde kamerayla ilgili bir sorunum var. herhangi bir önceden Hatmi sürümünde I/kapama flaş açmak için yapmanız gereken tek şey şu oldu:Marshmallow'da el feneri kontrolü

private void turnFlashOn(final Camera camera, int flashLightDurationMs) { 
    if (!isFlashOn()) { 
     final List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes(); 
     if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) { 
      mParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
      camera.setParameters(mParams); 
     } 
    } 
} 

ve

private void turnFlashOff(Camera camera) { 
    if (camera != null) { 
     final List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes(); 
     if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) { 
      mParams.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
      camera.setParameters(mParams); 
     } 
    } 
} 

Maalesef Hatmi cihazlar vahşi çökmesine başladı.

RuntimeException: Bir şekilde camera.getParameters() ve camera.setParameters() gibi mesajlarla bozulmaya başladı setParameters

Ben başlayan ve almadan önce önizleme durdurma çalıştı

başarısız oldu: getParameters

RuntimeException (boş parametreleri) başarısız oldu Artık hata atmayan parametreler. Ancak, camera.startPreview()'u aradığımda önizleme devam etmiyor.

Fotoğraf makinesini bıraktığımdan ve tekrar açılmasından korkarım, bu işlem birkaç saniye sürüyor ve kötü bir deneyim yaşayacaktır.

Marshmallow'da el fenerini açma/kapama konusunda güvenilir öneriler var mı?

cevap

0

Çalışma zamanında izinleri kontrol etmek için uygulamanızı güncelleyin. android.permission.CAMERA verilmeli. Uygulamanızın açıklamasına dahil olmak, bunu size Marshmallow'da vermeyecektir. Kabul edip etmediğini ve talep edip etmeyeceğinizi saptamanız gerekecek.

+0

zaten Kamera iznine sahip. 23'ü hedeflemiyorum, bu yüzden henüz çalışma zamanı izinlerini kontrol etmem gerekmiyor, değil mi? –

+0

Evet ve hayır. 23'ü hedeflemiyorsanız, izin zaten verilmiş olmalıdır. Ancak, kullanıcı kurulumdan sonra bu izni devre dışı bırakabilir. Bu durumda, izin verilip verilmediğini (API 23 cihazında çalışıyorsa) kontrol etmeniz gerekir. Kullanıcı bunu reddettiği için yapmazsanız, Kamera API'ları boş veya boş verileri döndürebilir. Bu konuşma, Marshmallow için izin değişiklikleri hakkında daha fazla ayrıntı sağlayacaktır: https://youtu.be/WGz-alwVh8A?list=PLnVy79PaFHMUqqvwbjyKJZv1N8rzHOCBi –

+0

Haklısınız, bu gerçekten böyledir. Ancak uygulama izin verilen izinlerle bile çöküyor, bu yüzden Camera API ile ilgili bir şey değişti ve Lollipop veya Kitkat'taki gibi farklı davranıyor. –

4

Google, OS 6'da (Android M) torchmode'u kullanıma sunmuştur.

private static void handleActionTurnOnFlashLight(Context context){ 
    try{ 

     CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
     String[] list = manager.getCameraIdList(); 
     manager.setTorchMode(list[0], true); 
    } 
    catch (CameraAccessException cae){ 
     Log.e(TAG, cae.getMessage()); 
     cae.printStackTrace(); 
    } 
} 

private static void handleActionTurnOffFlashLight(Context context){ 
    try{ 
     CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
     manager.setTorchMode(manager.getCameraIdList()[0], false); 
    } 
    catch (CameraAccessException cae){ 
     Log.e(TAG, cae.getMessage()); 
     cae.printStackTrace(); 
    } 
} 

yapmanız gereken tek şey: amacınız ise
sadece kod bu konuda size yardımcı olabilir aşağıda, açık/kapalı flaşı açmak için hangi kamera tanımının dışında cameraid listesinin alın sıfır (0) Flaşı açmak/kapatmak istediğiniz birincil kameranız. Kamera kimliğini, açmak veya kapatmak için boolean değerine sahip setTochMode API ayarına iletmeniz yeterlidir.

Bu kod parçasının yalnızca OS 6 ile çalışacağını unutmayın, bu nedenle, aygıt OS'yi kontrol etmeniz gerekir ve buna bağlı olarak, ön marşlanma aygıtları için hangi API'ların çağrılacağını seçmeniz gerekir.

Sorununuzu çözmesi halinde bunu bir çözüm olarak belirtin.

1

Saurabh7474 has responded olarak, Android sürümünü kontrol etmek ve setTorchMode API'sini kullanmak çok doğru.

ayrıca Camera.open (...) ve daha önce mCamera çağrıldıktan sonra

mCamera.setPreviewTexture (new SurfaceTexture (100)) 

kullanarak marshmallow ortaya params.setFlashMode (...) kullanabilirsiniz rağmen.startPreview(); İstediğiniz zaman

try { 
       Log.i(TAG, "getCamera"); 
       int requestedCameraId = getIdForRequestedCamera(mFacing); 
       if (requestedCameraId == -1) { 
        throw new RuntimeException("Could not find requested camera."); 
       } 
       mCamera = Camera.open(requestedCameraId); 
       mCamera.setPreviewTexture(new SurfaceTexture(DUMMY_TEXTURE_NAME)); 
       params = mCamera.getParameters(); 
      } catch (RuntimeException e) { 
       Log.e("Failed to Open. Error:", e.getMessage()); 
      } catch (IOException e) { 
       Log.e("Failed to Open. can't setPreviewTexture:", e.getMessage()); 
      } 

sonra, sen

 mParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(mParams); 

Cevabım params.setFlashMode (...) kullanır ve Api 23 ve üzeri çalışan Vizyon API CameraSource örneklere dayanmaktadır kullanabilirsiniz. Eğer CameraSource incelemek için karar verirseniz , aynı sorununu çözmüş anahtar yöntem nedeni burada https://stackoverflow.com/a/33333046/4114846

bulabilirsiniz

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

... Satır 312, ") (başlangıç" dir

0

Yapı Saurabh7474 cevabı kapalı, bir torchCallback kaydederek hatmi en torchMode geçiş yapabilirsiniz:

final CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() { 
    @Override 
    public void onTorchModeUnavailable(String cameraId) { 
     super.onTorchModeUnavailable(cameraId); 
    } 

    @Override 
    public void onTorchModeChanged(String cameraId, boolean enabled) { 
     super.onTorchModeChanged(cameraId, enabled); 
     boolean currentTorchState = enabled; 
     try { 
      mCameraManager.setTorchMode(cameraId, !currentTorchState); 
     } catch (CameraAccessException e){} 



    } 
}; 

mCameraManager.registerTorchCallback(torchCallback, null);//fires onTorchModeChanged upon register 
mCameraManager.unregisterTorchCallback(torchCallback);