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

        由于项目需求,要实现一个调用相机拍照然后将矩形框中的部分切割出来的功能,于是在网上找了 一个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

你可能感兴趣的:(Android)