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();


至此,大功告成啦~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"app passed null surface"是一个错误信息,表明应用程序在传递一个空的Surface对象时发生了问题。SurfaceAndroid系统中的绘图目标,用于显示图形、动画或视频。当应用程序试图将图形或视频渲染到Surface时,如果传递了一个空的Surface对象,则会引发此错误。 通常情况下,传递null Surface的原因可能是以下几个方面: 1. Surface对象未正确初始化:应用程序可能没有正确初始化Surface对象,导致传递时为空。在使用Surface之前,必须先实例化和初始化它。 2. Surface对象被销毁或释放:应用程序可能在使用Surface之前将其销毁或释放,导致传递时为空。在使用Surface对象之前,需要确保它处于有效状态。 3. 异步操作或并发访问问题:应用程序可能在使用Surface对象时存在并发访问问题,例如多个线程同时访问Surface。这可能导致出现null Surface错误。 为了解决这个问题,可以尝试以下解决方案: 1. 确保正确初始化Surface对象并在使用之前验证其有效性。 2. 检查Surface对象的生命周期,确保在使用期间不会被销毁或释放。 3. 考虑使用同步机制(如锁)来避免并发访问问题。 4. 检查应用程序的代码,查找可能导致传递null Surface的错误逻辑或错误用法。 总结:出现"app passed null surface"错误是因为应用程序在传递空的Surface对象时出现了问题。为了解决这个错误,需要确保正确初始化Surface对象,检查其生命周期并避免并发访问问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值