我正在尝试在小部件中使用相机LED手电筒。我已经找到了关于这个主题的几个主题(即后面提到的the one ..),现在我正试图控制灯光:
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.release();
在AndroidManifest.xml中尝试了不同的权限,目前我有:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
我正在我的Galaxy Tab上测试这个,因为我手头没有任何其他Android设备:灯不亮。所以我现在有几个问题:
感谢您的任何见解!
顺便说一句,我很快就用quick-settings进行了测试,这里有几次被提及。手电筒也无法使用快速设置。
请注意,Galaxy Tab stil使用android 2.2。我看到2.2和2.3之间有一些变化。
注释: 我知道它必须以某种方式工作,因为我发现市场上的其他应用程序与Galaxy Tab完美配合。
评论2: 如果我设置cam.setParameters(p);并使用getFlashMode()直接向相机询问当前状态,它正确返回FLASH_MODE_TORCH。但是,如果我释放相机并重新打开它,它将返回FLASH_MODE_OFF。这几乎就像Camera对象知道请求但是没有真正将它传递给硬件!?
-
康斯坦丁评论后,我删除了cam.release();部分。他是对的,如果你松开相机,设置就不会持续存在。如果再次使用cam.open(),您将获得一个关闭灯的新实例。尽管如此,光还没有在星系标签上工作。 所以,如果你试图通过一个小部件来控制它,我想很难保持亮点。一旦后台服务完成,相机对象就会自动释放,因此灯会再次关闭。我的问题仍然存在,特别是为什么相机一开始没有打开。
答案 0 :(得分:34)
每台设备都有点不同。三星特别喜欢让应用程序开发人员复杂化。
在Galaxy Tab上你应该很好:
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();
}
如果这不起作用,那么最初可能需要设置FLASH_MODE_OFF并在startPreview之后更改它。
答案 1 :(得分:18)
设置参数后,不得松开相机。我在开始预览后发现闪光灯已经激活(在手电筒模式下)。 (适用于motorola defy,2.1)
在尝试激活它们之前,检查支持的闪光模式也是一个好主意。
在Android上使用相机设置搞乱是最黑暗的伏都教:许多设备表现不同,似乎没有可靠的方法将它们全部用一段代码来定位。最安全的选择是在调用 onResume()方法时始终正确设置相机。我也会考虑做同样的事情 onConfigChange(),因为至少摩托罗拉屏幕锁定器可以强制您的应用程序进入纵向模式,完全重启。
P.S。我想当你关闭相机时,原生相机应用程序会关闭,然后在新的状态下重新创建。
答案 2 :(得分:11)
我是按照以下方式完成的,适用于许多手机:
String manuName = android.os.Build.MANUFACTURER.toLowerCase();
Camera mCamera;
以下代码显示了如何关闭和打开灯光:
private void processOnClick() {
if (manuName.contains("motorola")) {
DroidLED led;
try {
led = new DroidLED();
led.enable(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
if (mCamera == null) {
try {
mCamera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
}
if (mCamera != null) {
final Parameters params = mCamera.getParameters();
List<String> flashModes = params.getSupportedFlashModes();
if (flashModes == null) {
return;
} else {
if (count == 0) {
params.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
mCamera.startPreview();
}
String flashMode = params.getFlashMode();
if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);
} else {
// Toast.makeText(this,
// "Flash mode (torch) not supported",Toast.LENGTH_LONG).show();
params.setFlashMode(Parameters.FLASH_MODE_ON);
mCamera.setParameters(params);
try {
mCamera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
count = 1;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
if (mCamera == null) {
return;
}
}
private void processOffClick() {
if (manuName.contains("motorola")) {
DroidLED led;
try {
led = new DroidLED();
led.enable(false);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
if (mCamera != null) {
count = 0;
mCamera.stopPreview();
}
}
}
以下是DroidLED类:
class DroidLED {
private Object svc = null;
private Method getFlashlightEnabled = null;
private Method setFlashlightEnabled = null;
@SuppressWarnings("unchecked")
public DroidLED() 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) {}
}
}
必须在AndroidManifest.xml中设置以下权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
答案 3 :(得分:8)
这适用于HTC Desire ...(带2.2) (当然使用Camera和Flashlight权限):
Camera mycam = Camera.open();
Parameters p = mycam.getParameters();// = mycam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
mycam.setParameters(p); //time passes
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mycam.release();
答案 4 :(得分:4)
您还可以尝试添加曲面视图。请看一下我对LED flashlight on Galaxy Nexus controllable by what API?
的回答答案 5 :(得分:3)
答案 6 :(得分:1)
private Camera camera;
void openCam(){
camera = Camera.open();
if (camera != null) {
Camera.Parameters params = camera.getParameters();
camera.setParameters(params);
}
Camera.Parameters p = camera.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
}
在清单中设置权限:
<uses-permission
android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.flash" />