目前Android应用众多,都想更贴心的方便用户,有些产品考虑到在黑夜或暗处的使用场景就会加入打开闪光灯功能。此篇文章将会从代码的角度阐述闪光灯的一些机型问题。

 

      下面我用一种打开闪光灯的方法举例,说明一下容易出现机型问题的点。如果我们要加入打开关闭闪光灯功能用于照明使用。首先会先判断闪光灯是否存在有两种方法:


方法一:

if(mCamera.getParameters().getSupportedFlashModes() !=null){
//有闪光灯
}else{
//无闪光灯
}

 方法二:

if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
//有闪光灯
} else {
//无闪光灯
}

因为无法正确的自动判断,我们就需要针对这10%左右的手机做适配,设置机型开关明确指定问题机型是否有闪光灯所以这是第一个容易出机型问题的点。

 

做了闪光灯有无判断后,通常的做法是

camera = Camera.open();
mParameters = camera.getParameters();
mSurfaceHolder = mSurfaceView.getHolder();

这时有些同学不会加入

mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

这句话,但如果不加入这句话低版本机型会无法打开闪光灯。第二个容易出机型问题的点。


再之后

mSurfaceHolder.addCallback(new Callback() {
   public void surfaceDestroyed(SurfaceHolder holder) {
   }
   public void surfaceCreated(SurfaceHolder holder) {
        try {
            camera.setPreviewDisplay(mSurfaceHolder);
        } catch (Exception e) {
            camera.release();
        }
        camera.startPreview();
    }
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
});



如果要开启就

private void turnOn() {
    mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    camera.setParameters(mParameters);
}



如果要关闭就

private void turnOff() {
    mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
    camera.setParameters(mParameters);
}

这样还是会有一些机型是无法打开闪光灯的,例如vivox3t,因为这些机型无预览区是无法打开闪光灯的,所以为了解决这部分机型的问题,我们需要做一个预览区并设置为宽高各一单位,这样表面看不到预览区,并可以打开这部分机型的闪光灯,很多开发同学也是这么做的。这是第三个容易出机型问题的点。


<SurfaceView
android:layout_width="1dp"
android:layout_height="1dp"/>

但这个位置又涉及到了另一个机型问题点,如三星i9158机型,由于取景区的大小不匹配问题会出现黑屏现象。所以这个机型问题点取景区大小用经过换算的1dp是不通用的,改为1px此问题就迎刃而解了。这是第四个容易出机型问题的点。


      目前把有关闪光灯常见的一些机型问题做个整理,如有同学正在做这部分代码不防参考一二,避免一些机型问题。