Androidでプログラム的にフロントフラッシュライトをオンにする方法は?


233

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

誰かがリンクやサンプルコードを持っていますか?

回答:


401

この問題では、次のことを行う必要があります。

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

カメラのLEDライトをオフにするコードスニペット。

  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 どのAPIで制御できるGalaxy Nexusの この回答LED懐中電灯で説明されているように、SurfaceViewを追加することもできますか? これは、多くの電話で機能するソリューションのようです。

アップデート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

Motorola DroidでLEDを有効にする方法を示す例:http : //code.google.com/p/droidled/

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

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

Update 3(カメラのオン/オフを切り替えるためのウィジェットが主導)

カメラ主導のオン/オフを切り替えるウィジェットを開発する場合は、Androidでカメラの懐中電灯をオン/オフにするための私の回答ウィジェットを参照する必要があり ます。

アップデート4

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

**問題:**

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

通常、Samsungは多くの問題を引き起こします。

以下のリストにある問題を参照できます。

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

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


2
あなたの助けをありがとう、それは私のために働きます!-インターフェイスFlashlightとクラスHtcLedFlashlightをコピーした後、setOnメソッドをtrue / falseのHtcLedFlashlightで呼び出し、それを実行しました。---インターフェイス-懐中電灯code.google.com/p/quick-settings/source/browse/trunk/... -クラスHtcLedFlashlight code.google.com/p/quick-settings/source/browse/trunk/...
saiket

1
@saiket:ようこそ..問題が解決した場合は、この回答を解決済みとしてマークしてください。他の人に役立つように..
Kartik Domadiya '20

1
@PolamReddyRajaReddy:Samsungデバイスでテストしていると思います。私は正しいですか?
Kartik Domadiya

7
権限の場合、マニフェストファイルの正しいコードは次のとおりです。 `<uses-permission android:name =" android.permission.CAMERA "/> <uses-permission android:name =" android.permission.FLASHLIGHT "/>`
ixeft

1
また、:-camera.release();を使用します
Chetan 2015

35

私の経験から、アプリケーションが縦向きと横向きの両方で機能するように設計されている場合、変数camを静的として宣言する必要があります。それ以外の場合、onDestroy()方向の切り替え時に呼び出されるはカメラを破壊しますが、カメラを解放しないため、再び開くことはできません。

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から

上記の提案された行が機能しませんでした。


カメラがオフの場合、システム機能を確認する必要はありません。cam!= nullの場合、オンになりました
グレッグエニス2014

1
私にとって最も役立った部分はyou need to declare the variable cam as static
Alex Jolig

ときインポートCameraクラスでAndroidStudio あることに注意してandroid.hardwareクラス...
AN

32

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; 
    try {
        cameraId = camManager.getCameraIdList()[0];
        camManager.setTorchMode(cameraId, true);   //Turn ON
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

コードをオフにする

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

2
「通常、フロントカメラが0位置にある」とはどういう意味ですか?どちらが前にあり、どちらが前でないかを確認するにはどうすればよいですか?ところで、フロントカメラは現在のユーザーに向けられたカメラです。背面カメラはおそらく常にフラッシュを備えているカメラです。フラッシュのオン/オフを確認するにはどうすればよいですか?
android開発者

13

以下の簡単な3つのステップでAutoFlashライトを手に入れました。

  • 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();
    
  • ビルド+実行—>薄暗いライトエリアに移動して写真をスナップします。デバイスがサポートしている場合は、自動フラッシュライトが表示されます。


9

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

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

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


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


1
古いandroid.hardware.Camera APIは以前とまったく同じように機能し続けるので、懐中電灯にandroid.hardware.camera2を使用する必要がある根本的な理由はありません。懐中電灯を有効にするためにアクティブなプレビューを維持する必要がないため、camera2を使用して消費電力とCPU負荷を削減できる可能性があります。
Eddy Talvala、2015年

2つのLollipopデバイスでより簡単な実装の1つを試してみましたが、試してみたいくつかのLollipop以前のデバイスではすべて機能しましたが、フラッシュはオンになりませんでした。おそらく、これはLollipopのバグにすぎません。古いメソッドがまだ機能し、Java純粋主義者でない場合は、はるかに簡単なので、古いAPIを引き続き使用します:)
LukaCiko

私は現在、Lollipopを搭載したNexus 5を使用していますが、完全に動作します。私も自分で作成したアプリケーションを所有しており、これらのメソッドで実装されています。誰かが試してみたい場合に備えて。Playストアへのリンクを挿入します:play.google.com/store/apps/details?id=com.fadad.linterna 重要なことは、フラッシュと権限を実行する前に、カメラがアクティブまたは無効になっていることを確認することです。
ferdiado

すみません、私の間違いです。古いAPIでフラッシュをオンにしようとしたときに、別のアプリがカメラを使用していた可能性があります。答えを更新しました。
LukaCiko、2015

7

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

  }

例を開始する前にフラッシュがすでにオンになっている場合、フラッシュをオフにしようとしても機能しません...その問題の解決策はありますか?
Taifun 2017

7

AndroidのバージョンによってCamera Flashにアクセスする方法はいくつかあります。Lollipopで動作しなくなったAPIはほとんどなく、Marshmallowで再び変更されました。これを克服するために、いくつかのプロジェクトで使用しているシンプルなライブラリを作成しました。これにより、良い結果が得られます。まだ不完全ですが、コードをチェックして欠けている部分を見つけることができます。こちらがリンクです-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();
}

アクティビティの代わりにコンテキストを使用するためのサポートを追加してください。ありがとう!
Vajira Lasantha 2017年

@VajiraLasantha権限を取得するには、Activityオブジェクトが必要です。どういうわけか許可を分離することによって、要件を完全に削除することを計画していました。ここで追跡されています-github.com/Abhi347/NoobCameraFlash/issues/3当面 は、必要に応じてコードを変更して要件を削除できます。作業に時間がかかる場合があります。
noob 2017

うん、見たよ。私はすでにパーミッションを削除することにより、コンテキストで動作するようにlibを変更しました。私のアプリはすでに権限の検証を行っているためです。コンテキストをサポートする適切な実装をリリースしたときにお知らせください。ありがとう!
Vajira Lasantha 2017

You have to take care of the runtime permissions to access Camera yourself, before initializing the NoobCameraManager. In version 0.1.2 or earlier we used to provide support for permissions directly from the library, but due to dependency on the Activity object, we have to remove it.
Pratik Butani

デバイスに複数のフラッシュがある場合はどうなりますか?一部は前面カメラにあります...
Android開発者


0

Marshmallow以降では、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

これを試して。

CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    String cameraId = null; // Usually front camera is at 0 position.
    try {
        cameraId = camManager.getCameraIdList()[0];
        camManager.setTorchMode(cameraId, true);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }

-3

次のコードを使用して、フラッシュをオフにすることもできます。

Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.