首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Android中使用相机手电筒

在Android中使用相机手电筒
EN

Stack Overflow用户
提问于 2011-04-01 00:58:33
回答 7查看 88.9K关注 0票数 53

我正在尝试在一个小工具中使用相机LED手电筒。我已经找到了几个关于这个话题的帖子(也就是后面提到的the one ),现在我正在尝试使用以下方法来控制灯光:

代码语言:javascript
复制
Camera cam = Camera.open();     
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.release();

在AndroidManifest.xml中尝试了不同的权限,目前我有:

代码语言:javascript
复制
<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设备:灯不亮。所以我现在有几个问题:

  1. 有没有办法在模拟器中测试led灯的行为?
  2. 我是不是做错了什么here?
  3. According to
  4. 问题解决了同样的问题,它在
  5. 选项卡上的工作方式不同。怎么做?
  6. ,最后,如果它的功能确实不同,我开始怀疑它是不是只有Galaxy Tab,还是其他设备也使用了不同的方法。那就很难测试了,对我来说似乎很奇怪。

谢谢你的见解!

顺便说一句,我很快就用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。这几乎就像是摄像头对象接受了请求,但并没有真正将其传递给硬件!?

--

在Konstantins注释之后,我删除了cam.release();部分。他是对的,如果你松开摄像头,设置就不会被保留。如果您再次使用cam.open(),您将获得一个新的实例,但灯已关闭。不过银河系标签上的灯还是不亮。所以,我猜如果你试图通过一个小工具来控制它,那就很难让灯一直亮着。一旦后台服务完成,camera对象就会自动释放,因此灯光会再次关闭。我的问题仍然存在,特别是为什么摄像头一开始就没有打开。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-04-08 01:33:25

每种设备都有一点不同。三星尤其喜欢让应用程序开发者的事情变得复杂。

在Galaxy选项卡上,您应该熟悉:

代码语言:javascript
复制
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之后更改它。

票数 34
EN

Stack Overflow用户

发布于 2011-04-04 20:31:04

设置参数后,切勿松开摄像头。我发现在我开始预览后闪光灯被激活了(在手电筒模式下)。(适用于摩托罗拉defy,2.1 )

这也是一个好主意,检查支持的闪光灯模式,然后再尝试激活它们。

在android上摆弄摄像头设置是最黑暗的巫毒:许多设备的行为方式都不同,似乎没有可靠的方法来用一段代码来针对所有设备。最安全的方法是在调用onResume()方法时始终正确设置摄影机。我也会考虑在onConfigChange(),中做同样的事情,因为至少摩托罗拉屏幕锁定器可以强制你的应用程序进入纵向模式,完全重启它。

附注:我猜想当你关闭相机时,本地相机应用程序也会被关闭,然后在一个新的状态下重新创建。

票数 18
EN

Stack Overflow用户

发布于 2012-09-22 02:03:29

我是这样做的,在很多手机上都能用到:

代码语言:javascript
复制
 String manuName = android.os.Build.MANUFACTURER.toLowerCase();
 Camera mCamera;

下面的代码显示了如何关闭和打开灯光:

代码语言:javascript
复制
  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类:

代码语言:javascript
复制
 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中设置以下权限:

代码语言:javascript
复制
 <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" />
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5503480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档