如何以编程方式在 Lollipop Android 中打开 FlashLight

Posted

技术标签:

【中文标题】如何以编程方式在 Lollipop Android 中打开 FlashLight【英文标题】:How to turn on FlashLight in Lollipop programmatically Android 【发布时间】:2015-04-23 17:29:11 【问题描述】:
Camera cam = Camera.open();     
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();

上述方法不适用于 Lollipop,因为相机在 Lollipop 中已弃用。我无法找到任何其他方式在 Lollipop 中以编程方式打开 Flash。我怎样才能做到这一点。提前致谢。

【问题讨论】:

【参考方案1】:

Camera 类现已弃用。

对于上面的 LOLLIPOP,你需要使用 camera2 Api

所以 nickkadrov 的解决方案不适用于 6.0 及更高版本的设备,打开/关闭闪光灯的最佳方法是尝试以下代码

public static void toggleFlashLight()
    toggle=!toggle;
               try 
            CameraManager cameraManager = (CameraManager) getApplicationContext().getSystemService(Context.CAMERA_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
                for (String id : cameraManager.getCameraIdList()) 

                    // Turn on the flash if camera has one
                    if (cameraManager.getCameraCharacteristics(id).get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) 
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
                            cameraManager.setTorchMode(id, true);
                        
                    
                
            
         catch (Exception e2) 
            Toast.makeText(getApplicationContext(), "Torch Failed: " + e2.getMessage(), Toast.LENGTH_SHORT).show();
        



toggle 是类级别的静态布尔变量,默认值为 false

static boolean toggle=false;

【讨论】:

权限真的有必要吗?在我的设备上它也可以不使用。 您的代码需要 API23,实际上是 android 6.0。【参考方案2】:
mCam = Camera.open();
Camera.Parameters p = mCam.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCam.setParameters(p);
mPreviewTexture = new SurfaceTexture(0);
try 
   mCam.setPreviewTexture(mPreviewTexture);
 catch (IOException ex) 
   // Ignore

mCam.startPreview();

它适用于 Android 5.0.x。并且不要忘记在清单中添加相机使用权限。

<uses-permission android:name="android.permission.CAMERA" />

【讨论】:

相机类现已弃用。你知道做同样事情的任何替代方法吗? SDK > 21 时弃用【参考方案3】:

您的代码应该可以正常工作。请检查您是否添加了正确使用相机的权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>

这应该添加到您的其他规范之上的 AndroidManifest 中。

此外,还有一个关于不同设备的有趣讨论和一个适用于每个设备的示例:Flashlight in Android

如果您不想使用已弃用的 API,可以查看:

Package Summary of Camera2

Camera device specification on the new api

很遗憾,我无法为您提供使用新 API 的示例,因为我自己还没有使用它。

【讨论】:

以上是关于如何以编程方式在 Lollipop Android 中打开 FlashLight的主要内容,如果未能解决你的问题,请参考以下文章

Android Lollipop 中的另一个通知正在取消通知

如何在视图内的特定位置触发 Android Lollipop 的涟漪效应,而不触发触摸事件?

即使在 Lollipop 之前,如何获取当前设备的用户列表?

Android 材料设计按钮 - Pre lollipop

应用程序如何检测状态栏颜色(Android 5.0 Lollipop)?

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?