最近遇到了一个奇葩问题 ,自定义相机 ,拍照一直没有问题 三百年没有动过的代码 ,在项目上uat的时候拍照黑屏了 ,先上代码让大家看一下 避免出现这个错误
if (mCamera == null) { mCamera = getCamera(mCameraId); if (mHolder != null) {在onResume方法中这么写的一直没有问题 但是今天打开相机就是黑屏 ,后来发现了 在onResume方法中给开启相机会有一定的延迟 ,具体为什么我也不知道 ,因为我切换前后摄像头是可以预览的 所以我坚信了我预览的代码没有问题startPreview(mCamera, mHolder);}}
然而,为了解决这个问题 我把开启相机的代码放在了SurfaceHolder的surfaceCreated方法中
public void surfaceCreated(SurfaceHolder holder) { if (mCamera == null) { mCamera = getCamera(mCameraId); } if (mCamera == null) { ToastUtil.makeText("请检查相机相关权限是否打开!"); }else { startPreview(mCamera, holder); } }我以为这样就没有问题了 还是自己太年轻啊正常的拍照是没有问题了 但是 锁屏和跳转到别的界面再回来的时候 又是黑屏了 因为 我在onPause方法中把相机设为null 在网上查了好多资料 有的说是设置预览大小的时候 获取宽高为奇数,我的不是这种问题 ,因为如果我的是这样的问题就不会出现有预览的界面 所以我Pass了 网上还有的人说在onResume方法中sleep一下 我尝试延时时间缩短到50ms已经可以完全正常预览了,而且视觉上几乎感觉不到延迟(zxing的二维码扫描预览视觉上也会有略微延迟),而如果改成10ms就不行了。差不多这个时间应该是需要用来调用底层so档的最短时间。所以最终解决办法还需要将上述OnResume()中的开启相机方法改成如下
if (isONe!=1){ if (mCamera == null) { mCamera = getCamera(mCameraId); if (mHolder != null) { new Thread(){ @Override public void run() { super.run(); try{ Thread.sleep(50); }catch (Exception e){ } startPreview(mCamera, mHolder); } }.start(); } } }嘻嘻 代码修改成这样 拍照已经是可以了 但是你以为这样就完成了 那就错了 你们太小看我家测试的能力了 。。。。。其实这时候我心中一万只曹尼玛经过 但是没有办法 我只能一个测试会改变一个程序员的代码习惯 ,因为我被我家的测试改变了 好了废话不多说了 我们自测只是小心翼翼的点击操作 好像自己的孩子一样 怕点坏了 但是我家测试就把你写的程序当作是他的天敌 使劲的操作 不点蹦就誓不罢休 唉 天有不测风云啊 android 这么多机型 总有一款机型会会出现问题
下面我就说一下这个特殊机型 魅族 ,当手机的拍照权限拒绝的时候 魅族获取的Camera不为null 那么这就尴尬了 因为我判断逻辑就是判断Camera是否为null 上代码
if (mCamera == null) { ToastUtil.makeText("请检查相机相关权限是否打开!"); }else { startPreview(mCamera, holder); }
因为mCamera不为null 所以走进了开启相机 但是相机权限的关闭了 爆出了异常 所以 我在判断权限的位置多加了代码 代码如下
if (mCamera == null) { ToastUtil.makeText("请检查相机相关权限是否打开!"); }else { try{ // setParameters 是针对魅族MX5。MX5通过Camera.open()拿到的Camera对象不为null Camera.Parameters mParameters = mCamera.getParameters(); mCamera.setParameters(mParameters); startPreview(mCamera, holder); }catch(Exception e) { ToastUtil.makeText("请检查相机相关权限是否打开!"); } }
这样就能满足条件了 嘻嘻完美解决了 之前还遇到了特别的问题 小米手机拍出的照片比一般的手机排除的照片要大 因为之前做视频拍摄的时候 视频要做压缩 所以在做视频配置的时候 小米手机要做特别的处理
第一写这么就的文章 写的不好 大家多多包涵