我想在Android中以编程方式打开前置闪光灯(不使用相机预览)。我用Google搜索了,但我发现的帮助将我转到了this页面
有没有人有任何链接或示例代码?
答案 0 :(得分:381)
对于这个问题,你应该:
检查手电筒是否是 可用与否?
如果是,请关闭/开启
如果没有,那么根据您的应用,您可以做任何事情 需求。
对于检查设备中的闪存可用性:
您可以使用以下内容:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
如果闪光灯可用则返回true,否则返回false。
有关详情,请参阅:http://developer.android.com/reference/android/content/pm/PackageManager.html。
打开/关闭手电筒:
我用Google搜索了一下这个关于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();
我刚刚找到了一个使用此权限的项目。检查quick-settings的src代码。这里http://code.google.com/p/quick-settings/(注意:此链接现已中断)
对于Flashlight,请直接查看http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight(注意:此链接现已损坏)
<强> Update6 强> 您还可以尝试按照此答案[{3}}中的说明添加SurfaceView 这似乎是适用于许多手机的解决方案。
更新5 重大更新
我找到了另一个链接(对于上面断开的链接):LED flashlight on Galaxy Nexus controllable by what API?您现在可以使用此链接。 [更新:14/9/2012此链接现已中断]
更新1
另一个OpenSource代码: http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm
更新2
示例显示如何在Motorola Droid上启用LED:http://code.google.com/p/torch/source/browse/
另一个开源代码:
http://code.google.com/p/droidled/
http://code.google.com/p/covedesigndev/
更新3(用于打开/关闭相机的小工具)
如果您想开发一个可打开/关闭相机的小部件,那么您必须参考我的回答http://code.google.com/p/search-light/ ..
更新4
如果您想设置从相机LED发出的光强度,您可以参考Widget for turning on/off camera flashlight in android完整帖子。请注意,只有root的HTC设备才支持此功能。
**问题:**
打开/关闭手电筒时也存在一些问题。例如。对于没有FLASH_MODE_TORCH
或者没有{{1}}的设备,则手电筒不会打开等等。
通常三星会产生很多问题。
您可以参考以下列表中的问题:
答案 1 :(得分: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
以上建议的行不适合我。
答案 2 :(得分:17)
在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();
}
}
关闭代码
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();
}
}
}
答案 3 :(得分:13)
我通过以下简单的三步获得了自动闪光灯。
<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();
构建+运行 - &gt;现在转到昏暗的灯光区域和Snap照片,如果设备支持,你应该获得自动闪光灯。
答案 4 :(得分:9)
Android Lollipop推出了 camera2 API,并弃用了之前的相机API。但是,使用已弃用的API打开闪存仍然有效,并且比使用新API简单得多。
似乎新的API旨在用于专用的全功能相机应用程序,并且其架构师并没有真正考虑更简单的用例,例如打开手电筒。要做到这一点,必须得到一个CameraManager,创建一个带有虚拟Surface的CaptureSession,最后创建并启动一个CaptureRequest。包括异常处理,资源清理和长回调!
要了解如何在Lollipop和更新版本上更换手电筒,请查看AOSP项目中的FlashlightController(尝试找到最新的已修改的旧版API)。别忘了设置所需的权限。
Android Marshmallow终于推出了一种使用setTorchMode打开闪光灯的简单方法。
答案 5 :(得分:6)
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 :(得分:6)
在不同的Android版本中有不同的方式访问相机闪光灯。很少有API在Lollipop停止工作,然后在Marshmallow再次更改。为了解决这个问题,我创建了一个简单的库,我在我的一些项目中使用它并且它给出了很好的结果。它仍然不完整,但您可以尝试检查代码并找到缺失的部分。这是链接 - NoobCameraFlash。
如果您只想集成代码,可以使用gradle。这是说明(直接来自自述文件) -
步骤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();
您必须注意运行时权限才能访问Camera 在初始化NoobCameraManager之前,你自己。在版本0.1.2中 或者更早,我们曾经直接从中提供权限支持 库,但由于依赖于Activity对象,我们必须这样做 删除它。
也很容易切换Flash
if(NoobCameraManager.getInstance().isFlashOn()){
NoobCameraManager.getInstance().turnOffFlash();
}else{
NoobCameraManager.getInstance().turnOnFlash();
}
答案 7 :(得分:0)
我已经使用SurfaceView通过片段在我的应用程序中实现了这个功能。可以找到此stackoverflow问题及其答案的链接here
希望这会有所帮助:)
答案 8 :(得分:0)
在Marshmallow及以上,CameraManager的`setTorchMode()&#39;似乎是答案。这对我有用:
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);
答案 9 :(得分: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();
}
答案 10 :(得分:-2)
您还可以使用以下代码关闭闪光灯。
Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);