Android test if front camera supports flash

2019-01-18 15:51发布

问题:

I know is possible to detect if camera has flash integrated, using a method like this:

 /** 
 * @return true if a flash is available, false if not
 */
public static boolean isFlashAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}

but if the device has 2 cameras how can I test for each of them if has flash available?

For example on a Samsung S2 device, on native camera application when using the front camera the flash button is disabled, meaning is not available.

Thanks.

回答1:

Paul's answer didn't work for me. The front camera on a Galaxy Nexus has a valid flash-mode of FLASH_MODE_OFF, but it is the only supported option. This method will work in all situations:

private boolean hasFlash(){
    Parameters params = mCamera.getParameters();
    List<String> flashModes = params.getSupportedFlashModes();
    if(flashModes == null) {
        return false;
    }

    for(String flashMode : flashModes) {
        if(Parameters.FLASH_MODE_ON.equals(flashMode)) {
            return true;
        }
    }

    return false;
}

If your app supports more than just FLASH_MODE_OFF and FLASH_MODE_ON, you'll need to tweak the if-check inside the loop.



回答2:

I figured this by myself and I post here the solution, which is actually very simple:

/**
 * Check if Hardware Device Camera can use Flash
 * @return true if can use flash, false otherwise
 */
public static boolean hasCameraFlash(Camera camera) {
    Camera.Parameters p = camera.getParameters();
    return p.getFlashMode() == null ? false : true;
}

The above method is different by this one:

/**
 * Checking availability of flash in device.
 * Obs.: If device has 2 cameras, this method doesn't ensure both cameras can use flash. 
 * @return true if a flash is available in device, false if not
 */
public static boolean isFlashAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}