搭載されていないのに、搭載されていると判定される
フラッシュライトをつけようとしたら、
Camera.Parameters params = camera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); camera.setParameters(params);
落ちます。まあ、ないんで当然ですが。
一般的な判定方法
フラッシュライトがあるかないかをBooleanで取得するときは、普通、PackageManager.FEATURE_CAMERA_FLASHをhasSystemFeature関数の引数に入れることでtrueなら搭載されている、falseなら搭載されてないという結果を使うかと思います。
getPackageManager().hasSystemFeature(PackageManager.PackageManager.FEATURE_CAMERA_FLASH);
ただ、Nexus7はフラッシュライトついてないのに、trueが返ってきます。
しかも、Camera.Parameters.getFLashMode()を使うとFLASH_MODE_OFFが返ってきます。
いやいや、君、OFFじゃなくてライトをそもそも持ってないんでしょうが!
じゃあ、どうやって判断しましょうか。
getSupportedFlashModes()を使いましょう。Listで取得します。
getFLashMode()はOFFが返ってきますが、リストでは「このOFF1個しか持ってないよ」という結果が返ってくるので
OFFしか持ってなければ、フラッシュライトがないことと同じということにすればOKですね。
public static boolean checkFlashLight(Context mContext){ //Nexus7 Camera camera = Camera.open(); List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes(); camera.release(); if (supportedFlashModes == null || (supportedFlashModes.size() == 1 && supportedFlashModes.get(0).equals(Camera.Parameters.FLASH_MODE_OFF))) { return false; } //他 PackageManager pm = mContext.getPackageManager(); return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); }
この件に関して、他にも困っている人がいました。調べてる手段は同じようですね。
Android Wizards:”Nexus 7 2013 torch issue”
http://ikravchenko.blogspot.jp/2013/09/nexus-7-2013-torch-issue.html