搭載されていないのに、搭載されていると判定される

フラッシュライトをつけようとしたら、

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