在Android中使用相机手电筒

我正在尝试在小部件中使用相机的LED手电筒。我已经找到了关于该主题的多个线程(即稍后提到的那个。.),现在我试图使用以下方法来控制灯光:


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设备:指示灯不亮。所以我现在有几个问题:


有什么方法可以在仿真器中测试led灯的行为吗?

我在这里做错什么了吗?

根据这个问题,这同样的问题交易,它的工作方式不同的Galaxy Tab的。怎么样?

最后,如果它的工作方式有所不同,我开始怀疑它只是Galaxy Tab还是其他设备也使用不同的方法。那时很难测试,对我来说似乎很奇怪。

感谢您的见解!


顺便说一句,我快速测试了快速设置,这里多次提到。手电筒也无法进行快速设置。


请注意,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(),则将关闭一个新实例。灯仍然无法在银河选项卡上工作。因此,我想如果您试图通过小部件来控制它,就很难保持点亮状态。后台服务完成后,相机对象会自动释放,因此灯会再次关闭。我的问题仍然存在,尤其是为什么相机一开始就无法开机。


largeQ
浏览 599回答 3
3回答

精慕HU

每个设备都有点不同。三星特别喜欢使应用程序开发人员的工作变得复杂。在“ Galaxy”选项卡上,您应该擅长:Camera cam;void ledon() {&nbsp; &nbsp; cam = Camera.open();&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; Parameters params = cam.getParameters();&nbsp; &nbsp; params.setFlashMode(Parameters.FLASH_MODE_ON);&nbsp; &nbsp; cam.setParameters(params);&nbsp; &nbsp; cam.startPreview();&nbsp; &nbsp; cam.autoFocus(new AutoFocusCallback() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onAutoFocus(boolean success, Camera camera) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });}void ledoff() {&nbsp; &nbsp; cam.stopPreview();&nbsp; &nbsp; cam.release();}如果这不起作用,则可能需要先设置FLASH_MODE_OFF并在startPreview之后对其进行更改。

慕姐8265434

设置参数后,请勿释放相机。我开始预览后发现闪光灯已激活(在手电筒模式下)。(适用于摩托罗拉Defy,2.1)在尝试激活支持的闪光模式之前,最好检查一下它。用android上的相机设置困扰是最黑暗的伏都教:许多设备的行为都不同,似乎没有可靠的方法可以通过一段代码将它们全部定位。最安全的选择是始终在调用onResume()方法时正确设置相机。我还将考虑在onConfigChange()中执行相同的&nbsp;操作,因为至少摩托罗拉屏幕锁可以强制您的应用程序进入纵向模式,从而完全重新启动它。Ps我想当您关闭相机时,本机相机应用程序将关闭,然后以新的状态重新创建。

梵蒂冈之花

我已通过以下方式完成此操作,该方法适用于许多手机:&nbsp;String manuName = android.os.Build.MANUFACTURER.toLowerCase();&nbsp;Camera mCamera;以下代码显示了如何打开和关闭灯:&nbsp; private void processOnClick() {&nbsp; &nbsp; if (manuName.contains("motorola")) {&nbsp; &nbsp; &nbsp; &nbsp; DroidLED led;&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; led = new DroidLED();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; led.enable(true);&nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // TODO Auto-generated catch block&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; if (mCamera == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mCamera = Camera.open();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if (mCamera != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final Parameters params = mCamera.getParameters();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<String> flashModes = params.getSupportedFlashModes();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (flashModes == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (count == 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params.setFlashMode(Parameters.FLASH_MODE_OFF);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mCamera.setParameters(params);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mCamera.startPreview();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String flashMode = params.getFlashMode();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params.setFlashMode(Parameters.FLASH_MODE_TORCH);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mCamera.setParameters(params);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Toast.makeText(this,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // "Flash mode (torch) not supported",Toast.LENGTH_LONG).show();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params.setFlashMode(Parameters.FLASH_MODE_ON);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mCamera.setParameters(params);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mCamera.autoFocus(new AutoFocusCallback() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onAutoFocus(boolean success, Camera camera) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = 1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; if (mCamera == null) {&nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; }}private void processOffClick() {&nbsp; &nbsp; if (manuName.contains("motorola")) {&nbsp; &nbsp; &nbsp; &nbsp; DroidLED led;&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; led = new DroidLED();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; led.enable(false);&nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // TODO Auto-generated catch block&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; if (mCamera != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mCamera.stopPreview();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}下面是DroidLED类:&nbsp;class DroidLED {&nbsp; &nbsp; private Object svc = null;&nbsp; &nbsp; private Method getFlashlightEnabled = null;&nbsp; &nbsp; private Method setFlashlightEnabled = null;&nbsp; &nbsp; @SuppressWarnings("unchecked")&nbsp; &nbsp; public DroidLED() throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // call ServiceManager.getService("hardware") to get an IBinder for the service.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // this appears to be totally undocumented and not exposed in the SDK whatsoever.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Class sm = Class.forName("android.os.ServiceManager");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Object hwBinder = sm.getMethod("getService", String.class).invoke(null, "hardware");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // get the hardware service stub. this seems to just get us one step closer to the proxy&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Class hwsstub = Class.forName("android.os.IHardwareService$Stub");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Method asInterface = hwsstub.getMethod("asInterface", android.os.IBinder.class);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; svc = asInterface.invoke(null, (IBinder) hwBinder);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // grab the class (android.os.IHardwareService$Stub$Proxy) so we can reflect on its methods&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Class proxy = svc.getClass();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // save methods&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getFlashlightEnabled = proxy.getMethod("getFlashlightEnabled");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setFlashlightEnabled = proxy.getMethod("setFlashlightEnabled", boolean.class);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch(Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new Exception("LED could not be initialized");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public boolean isEnabled() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return getFlashlightEnabled.invoke(svc).equals(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch(Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public void enable(boolean tf) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setFlashlightEnabled.invoke(svc, tf);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch(Exception e) {}&nbsp; &nbsp; }}必须在您的AndroidManifest.xml中设置以下权限:&nbsp;<uses-permission android:name="android.permission.CAMERA" />&nbsp;<uses-permission android:name="android.permission.FLASHLIGHT"/>&nbsp;<uses-feature android:name="android.hardware.camera" />&nbsp;<uses-feature android:name="android.hardware.camera.autofocus" />&nbsp;<uses-feature android:name="android.hardware.camera.flash" />
打开App,查看更多内容
随时随地看视频慕课网APP