web-dev-qa-db-ja.com

Androidでプログラム的にフロントフラッシュライトを点灯させる方法は?

私はAndroidでプログラム的に(カメラのプレビューではなく)正面のフラッシュライトをつけたいです。私はそれのためにグーグルしましたが、私が見つけた助けは私を この ページに紹介しました

リンクやサンプルコードはありますか。

218
saiket

この問題のためにあなたはすべきです:

  1. 懐中電灯が利用可能かどうかを確認しますか?

  2. もしそうならそれから電源を切って下さい/入れなさい

  3. そうでない場合は、アプリのニーズに応じて何でもできます。

機器内のフラッシュの有無を確認する場合

次のものを使用できます。

 context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

フラッシュが利用できる場合はtrueを返し、利用できない場合はfalseを返します。

見る:
http://developer.Android.com/reference/Android/content/pm/PackageManager.html 詳細については。

懐中電灯の点灯/消灯の場合:

私はグーグルアウトし、Android.permission.FLASHLIGHTについてこれを得ました。 Androidマニフェストの許可は見込みがあります。

 <!-- Allows access to the flashlight -->
 <permission Android:name="Android.permission.FLASHLIGHT"
             Android:permissionGroup="Android.permission-group.HARDWARE_CONTROLS"
             Android:protectionLevel="normal"
             Android:label="@string/permlab_flashlight"
             Android:description="@string/permdesc_flashlight" />

それから Camera を使い、 Camera.Parameters を設定します。ここで使われる主なパラメータは FLASH_MODE_TORCH です。

例えば。

カメラの懐中電灯をオンにするコードスニペット。

Camera cam = Camera.open();     
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();

カメラをオフにするコードスニペットは、ライトを導きました。

  cam.stopPreview();
  cam.release();

この許可を使用するプロジェクトを見つけました。クイック設定のsrcコードを確認してください。ここ http://code.google.com/p/quick-settings/ (注:このリンクは壊れています)

懐中電灯の場合直接 http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (注:このリンクは現在壊れています)

Update6この答えで説明されているようにSurfaceViewを追加することもできます Galaxy NexusのLED懐中電灯はどのAPIで制御できますか? これはうまくいく解決策のようです多くの電話で。

アップデート5メジャーアップデート

私は(上記の壊れたリンクのための)代替リンクを見つけました: http://www.Java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm あなたは今このリンクを使うことができます。 [更新日:2012年9月14日このリンクは壊れています]

アップデート1

他のオープンソースコード: http://code.google.com/p/torch/source/browse/

アップデート2

モトローラドロイドのLEDを有効にする方法を示す例: http://code.google.com/p/droidled/

他のオープンソースコード:

http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/

アップデート3(カメラをオン/オフにするためのウィジェットが主導)

あなたが導いたあなたのカメラをオン/オフにするウィジェットを開発したいなら、あなたは私の答え Androidのカメラ懐中電灯をオン/オフにするためのウィジェット ..を参照しなければなりません。

アップデート4

カメラのLEDから出てくる光の強度を設定したい場合は、 AndroidデバイスのLEDの強度を変更できますか? full postを参照できます。根ざしたHTCデバイスだけがこの機能をサポートしていることに注意してください。

**問題点:**

オン/オフ懐中電灯をオンにしながらいくつかの問題もあります。例えば。 FLASH_MODE_TORCHを持っていない、あるいは持っていても、懐中電灯は点灯しません。

一般的にSamsungは多くの問題を引き起こします。

下記のリストで問題を参照することができます。

Androidではカメラの懐中電灯を使用

Samsung Galaxy Ace 2.2.1およびGalaxy TabでカメラのLED /フラッシュライトをオン/オフにする

382
Kartik Domadiya

私の経験からすると、アプリケーションが縦向きと横向きの両方で動作するように設計されている場合は、変数camをstaticとして宣言する必要があります。さもなければ、方向を切り替えるときに呼び出されるonDestroy()はそれを破壊しますが、Cameraを解放しないので、再びそれを開くことは不可能です。

package com.example.flashlight;

import Android.hardware.Camera;
import Android.hardware.Camera.Parameters;
import Android.os.Bundle;
import Android.app.Activity;
import Android.content.pm.PackageManager;
import Android.view.Menu;
import Android.view.View;
import Android.widget.Toast;

public class MainActivity extends Activity {

public static Camera cam = null;// has to be static, otherwise onDestroy() destroys it

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

public void flashLightOn(View view) {

    try {
        if (getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA_FLASH)) {
            cam = Camera.open();
            Parameters p = cam.getParameters();
            p.setFlashMode(Parameters.FLASH_MODE_TORCH);
            cam.setParameters(p);
            cam.startPreview();
        }
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(getBaseContext(), "Exception flashLightOn()",
                Toast.LENGTH_SHORT).show();
    }
}

public void flashLightOff(View view) {
    try {
        if (getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA_FLASH)) {
            cam.stopPreview();
            cam.release();
            cam = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(getBaseContext(), "Exception flashLightOff",
                Toast.LENGTH_SHORT).show();
    }
}
}

明らかにするために私はこの行を置かなければならなかった

    <uses-permission Android:name="Android.permission.CAMERA" />

http://developer.Android.com/reference/Android/hardware/Camera.htmlから

上記の提案された行は私のために働いていなかった。

35
Ján Lazár

API 23以降(Android M、6.0)

コードを有効にする

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    String cameraId = null; // Usually back camera is at 0 position.
    try {
        cameraId = camManager.getCameraIdList()[0];
        camManager.setTorchMode(cameraId, true);   //Turn ON
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

コードをOFFにする

camManager.setTorchMode(cameraId, false);

そして許可

<uses-permission Android:name="Android.permission.CAMERA"/>
<uses-permission Android:name="Android.permission.FLASHLIGHT"/>

追加の編集

人々はまだ私の答えを支持しているので私は追加のコードを投稿することにしましたこれが当時の問題に対する私の解決策でした:

public class FlashlightProvider {

private static final String TAG = FlashlightProvider.class.getSimpleName();
private Camera mCamera;
private Camera.Parameters parameters;
private CameraManager camManager;
private Context context;

public FlashlightProvider(Context context) {
    this.context = context;
}

private void turnFlashlightOn() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        try {
            camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
            String cameraId = null; // Usually front camera is at 0 position.
            if (camManager != null) {
                cameraId = camManager.getCameraIdList()[0];
                camManager.setTorchMode(cameraId, true);
            }
        } catch (CameraAccessException e) {
            Log.e(TAG, e.toString());
        }
    } else {
        mCamera = Camera.open();
        parameters = mCamera.getParameters();
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }
}

private void turnFlashlightOff() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        try {
            String cameraId;
            camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
            if (camManager != null) {
                cameraId = camManager.getCameraIdList()[0]; // Usually front camera is at 0 position.
                camManager.setTorchMode(cameraId, false);
            }
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    } else {
        mCamera = Camera.open();
        parameters = mCamera.getParameters();
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        mCamera.setParameters(parameters);
        mCamera.stopPreview();
    }
}
}
17
Jack the Ripper

以下の簡単な3つのステップでオートフラッシュライトを得ました。

  • Manifest.xmlファイルにカメラとフラッシュのアクセス許可を追加しました
<uses-permission Android:name="Android.permission.CAMERA" />
<uses-feature Android:name="Android.hardware.camera" />

<uses-permission Android:name="Android.permission.FLASHLIGHT"/>
<uses-feature Android:name="Android.hardware.camera.flash" Android:required="false" />
  • あなたのカメラコードでこのようにしてください。

    //Open Camera
    Camera  mCamera = Camera.open(); 
    
    //Get Camera Params for customisation
    Camera.Parameters parameters = mCamera.getParameters();
    
    //Check Whether device supports AutoFlash, If you YES then set AutoFlash
    List<String> flashModes = parameters.getSupportedFlashModes();
    if (flashModes.contains(Android.hardware.Camera.Parameters.FLASH_MODE_AUTO))
    {
         parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
    }
    mCamera.setParameters(parameters);
    mCamera.startPreview();
    
  • Build + Run - >今度は薄暗い光の領域に移動して写真をスナップします。デバイスがサポートしていれば自動フラッシュライトが点灯します。

13
swiftBoy

Android Lollipopは camera2 APIを導入し、以前のカメラAPIを廃止しました。ただし、フラッシュをオンにするために廃止予定のAPIを使用してもまだ機能し、新しいAPIを使用するよりもはるかに簡単です。

新しいAPIは専用のフル機能のカメラアプリでの使用を目的としており、そのアーキテクトは懐中電灯の点灯などのより単純なユースケースを実際には考慮していないようです。これを行うには、CameraManagerを取得し、ダミーのSurfaceを使ってCaptureSessionを作成し、最後にCaptureRequestを作成して起動する必要があります。例外処理、リソースのクリーンアップ、および長いコールバックが含まれています。

Lollipop以降で懐中電灯をつける方法を見るためには、 FlashlightController を見てください。 AOSPプロジェクト(変更された最新の古い使用API​​を見つけるようにしてください)。必要な権限を設定することを忘れないでください。


Androidマシュマロはついに setTorchMode でフラッシュをオンにする簡単な方法を導入しました。

9
LukaCiko

さまざまなAndroidバージョンでCamera Flashにアクセスするにはさまざまな方法があります。 Lollipopで動作を停止したAPIはほとんどなく、その後マシュマロでも変更されました。これを克服するために、私は自分のいくつかのプロジェクトで使用している単純なライブラリを作成しましたが、それは良い結果をもたらしています。まだ不完全ですが、コードをチェックして足りない部分を見つけることができます。これがリンクです - NoobCameraFlash

コードに統合したいだけの場合は、gradleを使用できます。ここに指示があります(Readmeから直接取得) -

手順1. JitPackリポジトリをビルドファイルに追加します。リポジトリの最後のあなたのルートbuild.gradleにそれを追加してください:

allprojects {
        repositories {
            ...
            maven { url "https://jitpack.io" }
        }
}

ステップ2.依存関係を追加する

dependencies {
        compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
  }

使用法

NoobCameraManagerシングルトンを初期化します。

NoobCameraManager.getInstance().init(this);

デバッグログのログレベルをオプションで設定できます。ロギングは LumberJack ライブラリを使用します。デフォルトのLogLevelはLogLevel.Noneです。

NoobCameraManager.getInstance().init(this, LogLevel.Verbose);

その後は、カメラのフラッシュをオンまたはオフにするためにシングルトンを呼び出す必要があります。

NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();

NoobCameraManagerを初期化する前に、自分自身でCameraにアクセスするためのランタイム権限を管理する必要があります。バージョン0.1.2以前では、ライブラリから直接パーミッションのサポートを提供していましたが、Activityオブジェクトへの依存のため、それを削除しなければなりません。

Flashも簡単に切り替えられます

if(NoobCameraManager.getInstance().isFlashOn()){
    NoobCameraManager.getInstance().turnOffFlash();
}else{
    NoobCameraManager.getInstance().turnOnFlash();
}
6
noob

Androidの懐中電灯アプリのための完全なコード

マニフェスト

  <?xml version="1.0" encoding="utf-8"?>
  <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
      package="com.user.flashlight"
      Android:versionCode="1"
      Android:versionName="1.0">

      <uses-sdk
          Android:minSdkVersion="8"
          Android:targetSdkVersion="17"/>

      <uses-permission Android:name="Android.permission.CAMERA" />
      <uses-feature Android:name="Android.hardware.camera"/>

      <application
          Android:allowBackup="true"
          Android:icon="@mipmap/ic_launcher"
          Android:label="@string/app_name"
          Android:theme="@style/AppTheme" >
          <activity
              Android:name=".MainActivity"
              Android:label="@string/app_name" >
              <intent-filter>
                  <action Android:name="Android.intent.action.MAIN" />

                  <category Android:name="Android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
      </application>

  </manifest>

XML

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools" Android:layout_width="match_parent"
    Android:layout_height="match_parent" Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    Android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="OFF"
        Android:id="@+id/button"
        Android:layout_centerVertical="true"
        Android:layout_centerHorizontal="true"
        Android:onClick="turnFlashOnOrOff" />
</RelativeLayout>

MainActivity.Java

  import Android.app.AlertDialog;
  import Android.content.DialogInterface;
  import Android.content.pm.PackageManager;
  import Android.hardware.Camera;
  import Android.hardware.Camera.Parameters;
  import Android.support.v7.app.AppCompatActivity;
  import Android.os.Bundle;
  import Android.view.View;
  import Android.widget.Button;

  import Java.security.Policy;

  public class MainActivity extends AppCompatActivity {

      Button button;
      private Camera camera;
      private boolean isFlashOn;
      private boolean hasFlash;
      Parameters params;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          button = (Button) findViewById(R.id.button);

          hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

          if(!hasFlash) {

              AlertDialog alert = new AlertDialog.Builder(MainActivity.this).create();
              alert.setTitle("Error");
              alert.setMessage("Sorry, your device doesn't support flash light!");
              alert.setButton("OK", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                      finish();
                  }
              });
              alert.show();
              return;
          }

          getCamera();

          button.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {

                  if (isFlashOn) {
                      turnOffFlash();
                      button.setText("ON");
                  } else {
                      turnOnFlash();
                      button.setText("OFF");
                  }

              }
          });
      }

      private void getCamera() {

          if (camera == null) {
              try {
                  camera = Camera.open();
                  params = camera.getParameters();
              }catch (Exception e) {

              }
          }

      }

      private void turnOnFlash() {

          if(!isFlashOn) {
              if(camera == null || params == null) {
                  return;
              }

              params = camera.getParameters();
              params.setFlashMode(Parameters.FLASH_MODE_TORCH);
              camera.setParameters(params);
              camera.startPreview();
              isFlashOn = true;
          }

      }

      private void turnOffFlash() {

              if (isFlashOn) {
                  if (camera == null || params == null) {
                      return;
                  }

                  params = camera.getParameters();
                  params.setFlashMode(Parameters.FLASH_MODE_OFF);
                  camera.setParameters(params);
                  camera.stopPreview();
                  isFlashOn = false;
              }
      }

      @Override
      protected void onDestroy() {
          super.onDestroy();
      }

      @Override
      protected void onPause() {
          super.onPause();

          // on pause turn off the flash
          turnOffFlash();
      }

      @Override
      protected void onRestart() {
          super.onRestart();
      }

      @Override
      protected void onResume() {
          super.onResume();

          // on resume turn on the flash
          if(hasFlash)
              turnOnFlash();
      }

      @Override
      protected void onStart() {
          super.onStart();

          // on starting the app get the camera params
          getCamera();
      }

      @Override
      protected void onStop() {
          super.onStop();

          // on stop release the camera
          if (camera != null) {
              camera.release();
              camera = null;
          }
      }

  }
6
RAP

私はSurfaceViewを使用してフラグメントを通して私のアプリケーションにこの機能を実装しました。このstackoverflowの質問とその答えへのリンクはここで見つけることができます

お役に立てれば :)

0

マシュマロ以上では、CameraManagerの `setTorchMode() 'が答えのようです。これは私のために働く:

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