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

は残念ながら、マシュマロデバイスは野生でクラッシュし始めました。

のRuntimeException::getParametersは(空のパラメータを)失敗した

のRuntimeException:setParametersを私が取得する前にプレビューを開始および停止しようとした

を失敗どういうわけかcamera.getParameters()camera.setParameters()は、次のようなメッセージで失敗し始めましたパラメータで、もはやエラーをスローしません。しかし、camera.startPreview()に電話すると、プレビューは再開されません。

私はカメラを離して再オープンするのが恐れられています。これは数秒かかるため、悪い経験をするでしょう。

マシュマロで確実に懐中電灯をオン/オフする方法に関する提案はありますか?

答えて

0

実行時にアクセス許可を確認するようにアプリを更新します。 android.permission.CAMERAを付与する必要があります。あなたのアプリのマニフェストにそれを含めることは、マシュマロのあなたにそれを与えるつもりはありません。許可されているかどうかを検出して要求する必要があります。

+0

私はすでにカメラの権限を持っています。私は23をターゲットにしていないので、ランタイムのアクセス許可をまだ確認する必要はありません。 –

+0

はい、いいえ。あなたが23を目標としていない場合、その許可は既に与えられているはずです。ただし、ユーザーはインストール後にそのアクセス許可を無効にすることができます。その場合、アクセス権を持っているかどうかを確認する必要があります(API 23デバイスで実行している場合)。ユーザーがそれを拒否したためでない場合、Camera APIは空のデータまたはヌルのデータを返すことがあります。この講演では、Marshmallowの権限の変更について詳しく説明します:https://youtu.be/WGz-alwVh8A?list=PLnVy79PaFHMUqqvwbjyKJZv1N8rzHOCBi –

+0

あなたはそうです、そうです。しかし、許可された権限でもアプリケーションがクラッシュするので、Camera APIに関連する何かが変更され、LollipopやKitkatとは異なる動作をするようです。 –

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

あなたがしなければならないすべては、次のとおりです:あなたの目的がある場合
は唯一のコードがそのお手伝いをすることができます下に、オン/オフフラッシュをオンにするカメラのIDのうち、cameraidのリストを取得し、ゼロ(0)フラッシュをオン/オフにしたい主なカメラです。カメラIDをブール値でsetTochMode APIに渡すだけで、オンまたはオフにすることができます。

このコードはOS 6でのみ動作するため、デバイスOSをチェックし、それに基づいてpre-marshmallowデバイスを呼び出すAPIを選択する必要があることに注意してください。

問題を解決した場合は、これを解決策として表示してください。

1

Saurabh7474 has responded Androidのバージョンを確認してsetTorchMode APIを使用するのは非常に正しいです。

あなたもCamera.open(...)の後とmCameraを呼び出す前に

mCamera.setPreviewTexture (new SurfaceTexture (100)) 

を使用してマシュマロに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()); 
      } 

そして、あなたは私の答えはparams.setFlashMode(...)を使用し、API 23以上で動作ビジョンAPIのCameraSource例に基づいています

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

を使用することができます。 あなたが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); 
関連する問題