如何在Android中以编程方式打开前置闪光灯?

我想在Android中以编程方式打开前闪光灯(不是相机预览)。我在谷歌上搜索了一下,但我找到的帮助指向了页面

有人有链接或示例代码吗?

385824 次浏览

对于2021年,使用CameraX,现在非常容易:https://stackoverflow.com/a/66585201/294884


对于这个问题,你应该:

  1. 检查手电筒是否亮 是否可用?< / p >

  2. 如果是,则关闭/打开

  3. 如果不是,那么你可以根据你的应用做任何事情 需求。< / p >

对于设备中的检查flash的可用性:

你可以使用以下方法:

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

如果flash可用,则返回true,否则返回false。

参见:
http://developer.android.com/reference/android/content/pm/PackageManager.html了解更多信息。

用于打开/关闭手电筒:

我谷歌了一下,找到了这个关于安卓,许可,手电筒。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" />

然后使用相机并设置相机。参数。这里使用的主要参数是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 你也可以尝试添加一个SurfaceView,如这个答案Galaxy Nexus上的LED手电筒由什么API控制?所述 这似乎是一个解决方案,工作在许多手机

更新5重大更新

我已经找到了一个替代链接(上面的坏链接):http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm你现在可以使用这个链接。[更新:14/9/2012此链接现在断开]

更新1

另一个开放源代码: http://code.google.com/p/torch/source/browse/ < / p >

更新2

示例显示如何开启摩托罗拉Droid的LED: http://code.google.com/p/droidled/

另一种开放源代码:

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

更新3(用于打开/关闭摄像头的小部件)

如果你想开发一个小部件,打开/关闭你的相机,那么你必须参考我的答案小部件打开/关闭相机手电筒在android

更新4

如果你想设置相机LED出现的光强度,你可以参考我可以改变Android设备的LED亮度吗?完整的帖子。请注意,只有根HTC设备支持此功能。

* *问题:* *

在打开/关闭手电筒时也有一些问题。如。对于没有FLASH_MODE_TORCH的设备,或者即使它有,那么手电筒不打开等。

三星通常会制造很多问题。

你可以参考下面列出的问题:

在Android中使用相机手电筒

打开/关闭三星Galaxy Ace 2.2.1 &相机LED/闪光灯;Galaxy Tab < / >

根据我的经验,如果你的应用程序被设计为纵向和横向工作,你需要将变量cam声明为静态。否则,在切换方向时调用的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

上面建议的台词对我不起作用。

我得到了自动闪光与以下简单的三步。

  • 我刚刚在Manifest.xml文件中添加了摄像头和Flash权限
<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 —> Now Go to Dim light area and Snap photo, you should get auto flash light if device supports.

你也可以使用下面的代码来关闭闪光灯。

Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);

我已经在我的应用程序中通过使用SurfaceView的片段实现了这个功能。这个stackoverflow问题的链接和答案可以在在这里中找到

希望这对你有所帮助。

Android棒棒糖引入了camera2 API,并弃用了之前的相机API。但是,使用已弃用的API来打开flash仍然有效,并且比使用新的API简单得多。

似乎这个新的API是专门用于全功能的相机应用程序的,它的架构师并没有真正考虑到更简单的用例,比如打开手电筒。现在要做到这一点,必须获得CameraManager,使用虚拟Surface创建CaptureSession,最后创建并启动CaptureRequest。包括异常处理,资源清理和长回调!

要了解如何将手电筒打开Lollipop和更新,请查看AOSP项目中的< >强FlashlightController < / >强(尝试找到已修改的旧使用api的最新版本)。不要忘记设置所需的权限。


Android Marshmallow终于介绍了一个用< >强setTorchMode < / >强打开flash的简单方法。

完整的代码为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;
}
}


}

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

在不同的Android版本中有不同的访问Camera Flash的方法。在棒棒糖中很少有api停止工作,然后在棉花糖中又发生了变化。为了克服这个问题,我创建了一个简单的库,我已经在我的几个项目中使用了它,它给出了很好的结果。它仍然是不完整的,但是您可以尝试检查代码并找到缺失的部分。这是链接——NoobCameraFlash

如果你只是想在你的代码中集成,你可以使用gradle。以下是使用说明(直接从自述文件中获取)-

步骤1。将JitPack存储库添加到构建文件中。将它添加到您的根版本中。Gradle在存储库的末尾:

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

步骤2。添加依赖项

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

使用

初始化NoobCameraManager单例。

NoobCameraManager.getInstance().init(this);

您可以选择为调试日志设置日志级别。日志使用伐木工人库。默认的LogLevel是LogLevel.None

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

之后,你只需要调用单例来打开或关闭相机闪光灯。

NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
你必须注意访问Camera的运行时权限 在初始化NoobCameraManager之前。在0.1.2版本中 或者更早的时候,我们使用直接从 库,但由于对Activity对象的依赖,我们必须 删除它。< / p >

切换Flash也很容易

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

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"/>

< em >额外编辑< / em >

人们仍然在给我的答案投票,所以我决定发布额外的代码 这是我以前解决这个问题的方法:

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

试试这个。

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

2022年Kotlin版本:

fun Context.isFlashLightAvailable() = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)


val Context.camaraManager: CameraManager get() = getSystemService(CameraManager::class.java)




fun Context.toggleFlashLight(on: Boolean) {
camaraManager.run {


val firstCameraWithFlash = cameraIdList.find { camera ->
getCameraCharacteristics(camera).keys.any { it == FLASH_INFO_AVAILABLE }
}


firstCameraWithFlash?.let {
runCatching { setTorchMode(it, on) }.onFailure { Timber.e(it, "Error setTorchMode") }
} ?: Timber.e(Throwable("toggleFlashLight"), "Camera with flash not found")


}
}

或者用一个返回结果的挂起函数

suspend fun Context.toggleFlashLightWithResult(on: Boolean): Boolean {
return suspendCancellableCoroutine { cont ->
runCatching {
camaraManager.run {


val firstCameraWithFlash = cameraIdList.find { camera ->
getCameraCharacteristics(camera).keys.any { it == FLASH_INFO_AVAILABLE }
}


val callback = object : CameraManager.TorchCallback() {
override fun onTorchModeChanged(cameraId: String, enabled: Boolean) {
super.onTorchModeChanged(cameraId, enabled)
            

if (cont.isActive) cont.resume(enabled)
}
}


if (firstCameraWithFlash == null) {
Timber.e(Throwable("toggleFlashLight"), "Camera with flash not found")
cont.resume(false)
} else {
Timber.tag("~!").d("firstCameraWithFlash: $firstCameraWithFlash")
setTorchMode(firstCameraWithFlash, on)
registerTorchCallback(mainExecutor, callback)
}


cont.invokeOnCancellation { unregisterTorchCallback(callback) }
}
}
.onFailure { Timber.e(it, "Error toggleFlashLight") }


}
}