为了账号安全,请及时绑定邮箱和手机立即绑定

在Android中使用相机手电筒

在Android中使用相机手电筒

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

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

每个设备都有点不同。三星特别喜欢使应用程序开发人员的工作变得复杂。


在“ Galaxy”选项卡上,您应该擅长:


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之后对其进行更改。


查看完整回答
反对 回复 2019-12-20
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

设置参数后,请勿释放相机。我开始预览后发现闪光灯已激活(在手电筒模式下)。(适用于摩托罗拉Defy,2.1)

在尝试激活支持的闪光模式之前,最好检查一下它。

用android上的相机设置困扰是最黑暗的伏都教:许多设备的行为都不同,似乎没有可靠的方法可以通过一段代码将它们全部定位。最安全的选择是始终在调用onResume()方法时正确设置相机。我还将考虑在onConfigChange()中执行相同的 操作,因为至少摩托罗拉屏幕锁可以强制您的应用程序进入纵向模式,从而完全重新启动它。

Ps我想当您关闭相机时,本机相机应用程序将关闭,然后以新的状态重新创建。


查看完整回答
反对 回复 2019-12-20
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

我已通过以下方式完成此操作,该方法适用于许多手机:


 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" />


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 637 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信