13

我有一個關於在最近的棉花糖構建,更具體的手電筒相機的問題。 在任何預棉花糖版本的所有我需要做的開啓/關閉閃光燈進行以下操作:棉花糖手電筒控制

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

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

不幸的是,棉花糖設備開始在野外崩潰。不知怎的,camera.getParameters()camera.setParameters()開始失敗的消息,如:

的RuntimeException:getParameters失敗(空參數)

的RuntimeException:setParameters失敗

我試着開始和獲取之前停止預覽參數,不再拋出錯誤。但是,當我撥打camera.startPreview()時,預覽不會恢復。

我擔心釋放相機並重新打開它是不可能的,因爲這需要幾秒鐘的時間,並且會產生不好的體驗。

關於如何可靠地打開/關閉棉花糖手電筒的任何建議?

回答

0

更新您的應用程序以在運行時檢查權限。您必須授予android.permission.CAMERA。將它包含在應用程序的清單中是不會將它授予給你的棉花糖的。你需要檢測它是否被授予並請求它。

+0

我有相機的權限了。我的目標不是23,所以我不需要檢查運行時權限,對嗎? –

+0

是和不是。如果你不是以23爲目標的,那麼權限應該已經被授予。但是,安裝後用戶可能會禁用該權限。在這種情況下,您需要檢查(如果在API 23設備上運行)是否有權限。如果你不是因爲用戶拒絕它,那麼相機API可能會返回空數據或空數據。本次演講將提供更多有關棉花糖權限更改的詳細信息:https://youtu.be/WGz-alwVh8A?list=PLnVy79PaFHMUqqvwbjyKJZv1N8rzHOCBi –

+0

你說得對,的確如此。然而,即使使用授予的權限,應用程序也會崩潰,所以看起來和Camera API相關的東西發生了變化,而且行爲與在棒棒堂或奇巧中的行爲不同。 –

4

Google在OS 6(Android M)中引入了torchmode。
如果你的目的只是爲了開啓/關閉閃光燈,下面的代碼可以幫你:

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

所有你需要做的是:獲取cameraid的名單哪個攝像機ID的零(0)是您想要打開/關閉閃光燈的主要相機。只需將cameraID傳遞給setTochMode API,並使用布爾值打開或關閉它。

請注意,這段代碼只能與OS 6一起工作,因此您需要檢查設備操作系統,並根據該操作系統選擇要調用哪些API來調用棉花糖前設備。

如果它解決了您的問題,請將其標記爲解決方案。

1

作爲Saurabh7474 has responded,檢查Android的版本並使用setTorchMode API它是非常正確的。

雖然你也可以使用

mCamera.setPreviewTexture (new SurfaceTexture (100)) 

Camera.open(...)和前調用mCamera後使用棉花糖params.setFlashMode(...)。startPreview();

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

那麼當你願意,你可以使用

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

我的回答是基於使用params.setFlashMode(...),並在阿比23及以上的作品視覺API的CameraSource例子。 如果你決定要檢查CameraSource,已經解決了同一問題的關鍵方法是「開始()」,在該行312 ...

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

的原因,你可以在這裏找到 https://stackoverflow.com/a/33333046/4114846

0

大廈關閉Saurabh7474的回答,您可以通過註冊一個torchCallback切換棉花糖的torchMode:

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