回答:
この問題では、次のことを行う必要があります。
懐中電灯が利用可能かどうかを確認しますか?
もしそうなら、オフ/オンにします
そうでない場合は、アプリのニーズに応じて何でもできます。
以下のためのフラッシュの可用性の検査機器では:
次のものを使用できます。
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は多くの問題を引き起こします。
以下のリストにある問題を参照できます。
Samsung Galaxy Ace 2.2.1およびGalaxy TabでカメラのLED /フラッシュライトをオン/オフにする
私の経験から、アプリケーションが縦向きと横向きの両方で機能するように設計されている場合、変数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から
上記の提案された行が機能しませんでした。
you need to declare the variable cam as static
Camera
クラスでAndroidStudio
あることに注意してandroid.hardware
クラス...
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();
}
}
}
以下の簡単な3つのステップでAutoFlashライトを手に入れました。
<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();
ビルド+実行—>薄暗いライトエリアに移動して写真をスナップします。デバイスがサポートしている場合は、自動フラッシュライトが表示されます。
Android Lollipopはcamera2 APIを導入し、以前のカメラAPIを廃止しました。ただし、非推奨のAPIを使用してフラッシュをオンにすることは引き続き機能し、新しいAPIを使用するよりもはるかに簡単です。
新しいAPIは専用のフル機能のカメラアプリでの使用を意図しており、そのアーキテクトは懐中電灯をオンにするなどの単純な使用例を実際に考慮していなかったようです。これを行うには、CameraManagerを取得し、ダミーのSurfaceを使用してCaptureSessionを作成し、最後にCaptureRequestを作成して開始する必要があります。例外処理、リソースのクリーンアップ、長いコールバックが含まれています!
Lollipop以降で懐中電灯をオンにする方法を確認するには、AOSPプロジェクトのFlashlightControllerを見てください(変更された古い使用APIとして最新のものを見つけてください)。必要な権限を設定することを忘れないでください。
Android Marshmallowはついに、setTorchModeでフラッシュをオンにする簡単な方法を導入しました。
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;
}
}
}
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();
}
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.
この関数を、SurfaceViewを使用してフラグメントを介してアプリケーションに実装しました。このstackoverflowの質問とその回答へのリンクはここにあります
お役に立てれば :)
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);
これを試して。
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();
}