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
猜测是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
相关文章推荐
- 理解ASP.NET 5 Web Apps
- 关于iOS提交审核的IDFA-2
- 【实际项目】微信相关api调用例子【以分享为例】
- Android线程模型(Painless Threading)
- iOS开发用Tableview实现能改变字体颜色的高仿系统的ActionSheet
- 关于iOS提交审核的IDFA
- Android ListView头部随着上下拖动缩放
- Android开发之MVP模式
- Swift2中的String与Character
- Android 之 传感器 应用
- Android 控件设置焦点,防止跳转页面出现焦点不在页面顶部
- 框架模式 MVC 在Android中的使用
- Android开发笔记(四十七)Runnable接口实现多线程
- CodeForces 461A Appleman and Toastman
- [资源贴] AChartEngin -Android 图形化报表 插件
- IOS闪退信号
- android 安装 apk 遭遇 java.lang.UnsupportedOperationException: Only file:// URIs
- Android Studio中获取SHA1或MD5的方法
- CodeForces 461C Appleman and a Sheet of Paper
- Unity3D 游戏在 iOS 上因为 trampolines 闪退的原因与解决办法