android全局变量闪退,安卓使用Intent开启照相机拍照时闪退的处理
1.现象
在使用安卓手机的一些应用调用照相机时,我们会发现有时候当我们拍照完毕时,程序会出现闪退,非常影响用户体验。目前项目中也有类似的拍照上传功能,当使用米3手机测试时,拍照上传功能可以正常使用,当我们换上红米或者其他一些比较早或者比较低端的手机时,就出现了闪退的问题。
1.1开启相机的intent
/* mPictureCachePath为当前照相相片的存储路径 */
pictureCachePath = Utility.getExternalCacheDir(this)+...;
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(mPictureCachePath)));
startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);
1.2onActivityResult接收intent返回值并获取bitmap
File file = new File(mPictureCachePath);
if (file.exists()) {
Bitmap bitmap = BitmapUtils.convertToBitmap(
mPictureCachePath, width, height);
}
2.分析问题
经过debug我们可以发现,如果程序发生闪退,此时mPictureCachePath值为null,可是我们在一开始已经为这个变量赋值,为什么当从相机程序返时,mPictureCachePath这个全局变量会变为null?
那我们给mPictureCachePath赋个初始值看看,结果当程序返回时,这个变量的值不是我们赋值过的路径,而是那个初始值。这样,我推测当前所在的Activity在相机程序返回时应该是被重新创建了。
通过调试,我们发现如果使用米3手机,程序不闪退,相机程序在返回我们的Actvity时没有执行onCreate方法,而使用红米手机,程序闪退时,此时我们的Actvity执行了onCreate,也就是说用红米时,当我们开启相机程序时,我们自己的Activity已经被销毁了! 所以当相机程序返回我们的Activity时,这个Activity是刚刚创建的,我们刚刚为图片创建的路径记录变量此时其实并没有被赋值。
3.解决方式
既然变量有可能丢,那么我们就可以把这个变量记录下来,可以使用sp等。假如我们的程序中还需要记录一些其他的变量,比如一些我们自定义的比较复杂的类,sp就没办法满足存储的需要。
此时我们可以使用如下两个方法
protected void onSaveInstanceState(Bundle outState)
protected void onRestoreInstanceState(Bundle savedInstanceState)
这两个方法并不是Activity每次都会调用的,我们注意到onCreate和onRestoreInstanceState都有个Bundle类型的参数,那么这个参数是谁传来的呢?肯定是onSaveInstanceState传来的。
当我们的Activity在未经我们自己finish的情况下被结束(没有被回收也会执行onSaveInstanceState),onSaveInstanceState方法就会被调用。此时我们就可以利用outState参数来存储我们的数据,当onCreate或者onRestoreInstanceState(只有Activity被真正回收后才调用)时,将这些数据拿出来重新赋值给我们的成员变量,这样,就算是Activity被销毁了,我们依然可以重新获得相关变量的值。
/**
* 保存相册参数
* 说明:对于配置低的手机,开启照相机时,当前activity会被回收,导致再次返回该activity时,原先保存
* 的变量被重新初始化,导致程序无法运行,造成崩溃。此处需要记录相关变量信息,如果activity异常退出,
* 再次进入时调用onRestoreInstanceState函数就可以恢复这些变量的值。
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState");
/* 保存相片路径 */
outState.putString("mCurrentSelectPictureCachePath", mCurrentSelectPictureCachePath);
}
/**
* 恢复相册参数
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "onRestoreInstanceState");
/* 恢复当前相片存储路径 */
mPictureCachePath = savedInstanceState.getString("mCurrentSelectPictureCachePath", mCurrentSelectPictureCachePath);
......
}
这样,mPictureCachePath的值就可以被保存下来,当程序返回时,如果Activity没有被回收,则不会执行onRestoreInstanceState方法,如果被回收了,就调用onRestoreInstanceState方法对变量值进行恢复。
android全局变量闪退,安卓使用Intent开启照相机拍照时闪退的处理相关推荐
- android 永久root权限,安卓 实现永久性开启adb 的root权限
adb 的root 权限是在system/core/adb/adb.c 中控制.主要根据ro.secure 以及 ro.debuggable 等system property 来控制. 默认即档ro. ...
- 安卓开发拍照时闪退遇到问题: file:///storage/emulated/0/0.jpg exposed beyond app through ClipData.Item.getUri()
问题描述: 打开摄像头拍照时程序闪退,错误提示如下: android.os.FileUriExposedException: file:///storage/emulated/0/RadioDirec ...
- 腾讯优测-优社区干货精选 | 那些年,我们在Android机型适配上遇到的坑之Camera拍照时快门咔嚓声...
文/腾讯优测研发工程师 吴宇焕 优测小优有话说: android机型适配的坑自然是不少,不想掉坑快来优测优社区~ 现在Android手机一般都会带有照相功能,有很多朋友就发现手机照相时快门声音很响,想 ...
- android切换账户功能,安卓9系统开启多用户 android 9支持多用户切换吗?
android 9支持多用户切换吗? 消息说是支持的呢 Android中的APP如何实现多帐号切换? 这个并不难,你可以同时在服务器的数据库中关联一个主键下的多个账户,每一个账户都有唯一的主键,用主键 ...
- android 百度地图 addoverlay,百度地图 在调用 addOverlay 方法时闪图
代码调试 跟踪 ,在调用 addOverlay 导致闪退 var self = null; var map = null; var mapRegionPage = null; mui.plusRead ...
- android 10闪退如何解决,安卓Activity启动在10.0下闪退
锐英源精品开源,禁止转载和任何形式的非法内容使用,违者必究 安卓Activity启动在10.0下闪退 背景 近期开发的安卓App在数据量大时,安卓10.0下启动Activity时闪退,安卓8.0下不闪 ...
- Android自定义相机,切换前后摄像头,照相机拍照
Android自定义相机,简单实现切换前后摄像头,照相机拍照 Ctrl +C Ctrl+V 可以直接 run 起来,注释比较详细;源码下载 <?xml version="1.0&qu ...
- 安卓,上传图片不能调取照相机拍照
我们常见的上传文件或者图片 是使用的input <form><input type="file" name="pic" id="pi ...
- android应用白屏闪退,安卓小精灵白屏闪退BUG
机型:红米3 and 魅蓝3 大约50部左右 昨天打包的apk 打开小精灵白屏闪退 经过多次测试,必须打开wifi才能开启(只是打开wifi不连接也可以),摆平后无法加载广告,然后闪退. 网络环境:4 ...
最新文章
- 美工自我培养的几点经验总结
- CEO 赠书 | 节省 50% 的人生,终止“瞎忙”式勤奋
- 昨天又写到个结构体排序,用多种cmp
- Java Web Token - JWT
- python中的类属性和实例属性
- Vue源码之 Vue的生命周期
- IntelliJ IDEA 偏好设置
- 【linux】nohup运行守护进程
- 【java学习之路】(java框架)001.Maven配置及使用
- XEN虚拟机修改系统时间
- Django面试题(一)django的中间件最多可以写几个方法?使用中间件做什么?
- 深海迷航坐标传送代码_深海迷航秘籍代码大全 美丽水世界秘籍代码教程
- 深度精简版操作系统下IIS的安装方法
- 安装杀毒软件后计算机运行速度慢,ThinkPad运行速度慢怎么办
- 支付宝小程序悬浮按钮
- easyui treegrid php,jQuery中关于EasyUI的TreeGrid查询功能的实现
- 手机上有哪些可以记录生日倒计时天数的软件?
- ios-bug.html黑屏重启,iOS12曝重大BUG:iPhone黑屏无法充电!你中招没?
- C++ -- 基于多态的后宫管理系统(其实就是职工管理或者图书管理系统根据我自己的需求改编,毕竟追我的人太多了,要好好管理一下)
- flutter 分组列表
热门文章
- ERA5 积雪 降雪 区别_黑龙江漠河迎入秋以来最大降雪
- 2021年广东省安全员B证(项目负责人)免费试题及广东省安全员B证(项目负责人)考试试卷
- 《深度学习原理与TensorFlow实践》喻俨,莫瑜
- oracle强制关闭session,Oracle终止session
- 我在深圳300元月薪的小资生活(强人)
- 中国虾青素市场趋势报告、技术动态创新及市场预测
- (8)common-upload文件上传出现org.apache.commons.fileupload.FileUploadBase$IOFileUploadException
- 计算机系统节能减排,节能减排,我们怎么做?
- 微信小程序https端口指定(非443)
- SCAN算法 | 磁头引臂调度问题 | 双磁头进阶 | Java实现(详细注释)