您的位置:首页 > 移动开发

Android调用相机预览黑屏app passed NULL surface解决

2016-01-14 10:46 465 查看
由于项目需求,要实现一个调用相机拍照然后将矩形框中的部分切割出来的功能,于是在网上找了 一个PlayCamera的demo程序。但运行的时候发现,只有第一次安装上时拍照界面能成功预览,一旦用back按键返回或者按home键回到主界面,再启动程序的时候,预览界面就变黑了。

猜测是surfaceview一旦后台就自动destroy有没有重新绘制的缘故。所以先将CameraActivity.java的OnCreate()中打开相机的方法,具体如下:

Thread openThread = new Thread(){

@Override

public void run() {

// TODO Auto-generated method stub

CameraInterface.getInstance().doOpenCamera(CameraActivity.this);

}

};

openThread.start();

挪到Onresume()中,再将原本写在了CameraSurfaceView.java的surfaceDestroyed()中关闭相机的方法,具体如下:

CameraInterface.getInstance().doStopCamera();

注释掉,挪到CameraActivity.java的onPause()中。

这样改完之后,出现了奇怪的现象。小米4和中兴努比亚手机可以完全正常预览拍照了(按back或home返回再重新打开也正常),而三星S6完全不能预览,华为荣耀6 plus则home返回可以正常预览,back之后依旧黑屏。

百思不得其解,查看log后发现无法正常预览的情况下,后台印出了这样一行log:app passed NULL surface

谷歌之,发现stackoverflow上有仁兄遇到类似的问题,即部分机型黑屏(原网址附在文章最末)。于是按照最后一位仁兄回答的办法,将开启相机的时机做一下延迟试试看(该兄说的是延迟一秒)。一试,果然成功了!!!狂喜ing……

事实上, 我尝试延时时间缩短到50ms已经可以完全正常预览了,而且视觉上几乎感觉不到延迟(zxing的二维码扫描预览视觉上也会有略微延迟),而如果改成10ms就不行了。差不多这个时间应该是需要用来调用底层so档的最短时间。所以最终解决办法还需要将上述OnResume()中的开启相机方法改成如下:

new Thread(new Runnable(){

public void run(){

try {

Thread.sleep(50);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

CameraInterface.getInstance().doOpenCamera(CameraActivity.this);

}

}).start();

至此,大功告成啦~

参考网页:stackoverflow.com/questions/12098298/android-camera-app-passed-null-surface
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: