2014年1月5日日曜日

Nexus5でカメラのフラッシュを懐中電灯として使う

Androidで、カメラ用のLEDフラッシュライトを懐中電灯として使う。

よくある機能でアプリもたくさん公開されていますが、なぜかインターネット接続のパーミッションを要求してくるものなどが多く、どれが安全なアプリかよく分からなかったため、「簡単な機能だし、悩むくらいなら作ってしまえ」と作ってみたところ、ちょっとハマってしまったので解決方法をメモしておきます。



まずは
[Android] 端末のLEDライトを制御する
http://aba.doorblog.jp/archives/6496611.html
を参考に

Manifest ;
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.flash" />

Source Code ;
Camera c = Camera.open();
Camera.Parameters cp = c.getParameters();
cp.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
c.setParameters(cp);
c.startPreview();

としたところ、Nexus4 (Android 4.3ベースAOKPカスタムロム)ではライトが点灯しましたが、肝心のメイン端末であるNexus5 (Android 4.4.2 Stock ROM / Runtime = ART)ではライトが付きませんでした。

調べてみると、カメラ・ライト周りの機能は端末ごとの差異が大きく、原因を特定しづらい問題が多いため、アプリ開発者としてはかなり困っている領域とのこと。この件についても、Nexus5とは別の端末の問題としていくつか質問や回答が見つかりました。

その中で
http://stackoverflow.com/questions/9505945/led-flashlight-does-not-work-on-samsung-galaxy-nexus
の回答者1 (Rahat Ahmedさん)の回答を元に

Camera c = Camera.open();
Camera.Parameters cp = c.getParameters();
cp.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
c.setParameters(cp);

try {
c.setPreviewTexture(new SurfaceTexture(0)); 
} catch (IOException e) {
}
c.startPreview();

としたところ、無事、上記環境のNexus5でライトが付きました。

4 件のコメント:

  1. ライちゃん2014年1月10日 18:32

    こんにちは。
    Nexus 5で同じことをしようとして嵌ってましたが、こちらの記事の通りにしたところLEDが付くようになりました。
    LEDの制御って機種ごとの違いがあるみたいで難しいんですね。
    ありがとうございました。

    返信削除
  2. >ライちゃん
    コメントありがとうございます。
    お役に立てたようでとても嬉しいです!

    返信削除
  3. わたしも広告なしの懐中電灯アプリが欲しかったのでこちらの情報でアプリ化しました。助かりました。http://blog.kassyi.com/2014/05/nexus-5.html

    返信削除
    返信
    1. > kassyiさん
      コメントありがとうございます。
      Androidはこういう機能を自作できるので楽しいですよね。

      削除