我想在Android中以编程方式打开前闪光灯(不是相机预览)。我在谷歌上搜索了一下,但我找到的帮助把我转到了这个页面
有人有链接或示例代码吗?
我想在Android中以编程方式打开前闪光灯(不是相机预览)。我在谷歌上搜索了一下,但我找到的帮助把我转到了这个页面
有人有链接或示例代码吗?
当前回答
你也可以使用下面的代码来关闭闪光灯。
Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
其他回答
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") }
}
}
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();
}
}
}
试试这个。
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();
}
你也可以使用下面的代码来关闭闪光灯。
Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
在不同的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);
您可以选择为调试日志设置日志级别。日志使用LumberJack库。默认为“LogLevel”。没有一个
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
之后,你只需要调用单例来打开或关闭相机闪光灯。
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
您必须注意访问Camera的运行时权限 在初始化NoobCameraManager之前。在0.1.2版本中 或者更早的时候,我们使用直接从 库,但由于对Activity对象的依赖,我们必须 删除它。
切换Flash也很容易
if(NoobCameraManager.getInstance().isFlashOn()){
NoobCameraManager.getInstance().turnOffFlash();
}else{
NoobCameraManager.getInstance().turnOnFlash();
}