Android-关于android调用闪光灯的问题
目前,有个项目,需要将手机背后的闪光灯打开,当做照明的作用(当然是硬件支持的情况下)。
实现如下:
Camera.Parameters parameters=camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
camera.setParameters(parameters);
camera.takePicture(shutterCallBack, null, jpegCallBack);
问题是,可以打开闪光灯,但是只是一瞬间,相当于一个拍照。就结束了,但如果不调用
takePicture方法,又不能打开闪光灯。
求解:怎么在不调用拍照的情况下,长期打开闪光灯。(实在解决不了,拍照也可以,关键是如何长期打开闪光灯)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
//mCamera为Camera对象,下面的是拍照方法。
mCamera.takePicture(null, null, null, jpegCallback);
//拍照时,开启闪光灯
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
mCamera.setParameters(parameters)
注意:需要开启闪光灯的权限,摄像头权限:
<!-- 打开Camera的权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.autofocus"/>
<!-- 开启闪光灯权限 -->
<uses-permission android:name="android.permission.FLASHLIGHT"/>
package com.wjh.myset;
import java.io.PrintStream;
import java.lang.reflect.Method;
import android.os.IBinder;
public class MyFlashLight {
private Object svc = null;
private Method getFlashlightEnabled = null;
private Method setFlashlightEnabled = null;
@SuppressWarnings("unchecked")
public MyFlashLight() throws Exception{
try {
// call ServiceManager.getService("hardware") to get an IBinder for the service.
// this appears to be totally undocumented and not exposed in the SDK whatsoever.
Class sm = Class.forName("android.os.ServiceManager");
Object hwBinder = sm.getMethod("getService", String.class).invoke(null, "hardware");
// get the hardware service stub. this seems to just get us one step closer to the proxy
Class hwsstub = Class.forName("android.os.IHardwareService$Stub");
Method asInterface = hwsstub.getMethod("asInterface", android.os.IBinder.class);
svc = asInterface.invoke(null, (IBinder) hwBinder);
// grab the class (android.os.IHardwareService$Stub$Proxy) so we can reflect on its methods
Class proxy = svc.getClass();
// save methods
getFlashlightEnabled = proxy.getMethod("getFlashlightEnabled");
setFlashlightEnabled = proxy.getMethod("setFlashlightEnabled", boolean.class);
}
catch(Exception e) {
throw new Exception("LED could not be initialized");
}
}
public boolean isEnabled() {
try {
return getFlashlightEnabled.invoke(svc).equals(true);
}
catch(Exception e) {
return false;
}
}
public void enable(boolean tf) {
try {
setFlashlightEnabled.invoke(svc, tf);
}
catch(Exception e) {}
}
}
代码来自于http://code.google.com/p/search-light/
不同类别的手机开启闪光灯的方法不一定相同,下面的代码适用于mb525,其他的手机我还没有试过.
这个基本上不同手机厂家的做法都是有区别的,需要驱动层的支持,有的厂家的手机不直接支持这个功能,可以在adb中用下面的命令确定:
打开闪光灯:
echo 1 > /sys/class/leds/spotlight/brightness
关闭闪光灯:
echo 0 > /sys/class/leds/spotlight/brightness
如果不存在spotlight这个节点那么该手机需要打开camera才能支持闪光灯的常亮了。
不同设备好像有差异,试一试下面的代码
Camera cam;
void ledon() {
cam = Camera.open();
Parameters params = cam.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_ON);
cam.setParameters(params);
cam.startPreview();
cam.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
}
});
}
void ledoff() {
cam.stopPreview();
cam.release();
}