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开启照相机拍照时闪退的处理相关推荐

  1. android 永久root权限,安卓 实现永久性开启adb 的root权限

    adb 的root 权限是在system/core/adb/adb.c 中控制.主要根据ro.secure 以及 ro.debuggable 等system property 来控制. 默认即档ro. ...

  2. 安卓开发拍照时闪退遇到问题: file:///storage/emulated/0/0.jpg exposed beyond app through ClipData.Item.getUri()

    问题描述: 打开摄像头拍照时程序闪退,错误提示如下: android.os.FileUriExposedException: file:///storage/emulated/0/RadioDirec ...

  3. 腾讯优测-优社区干货精选 |  那些年,我们在Android机型适配上遇到的坑之Camera拍照时快门咔嚓声...

    文/腾讯优测研发工程师 吴宇焕 优测小优有话说: android机型适配的坑自然是不少,不想掉坑快来优测优社区~ 现在Android手机一般都会带有照相功能,有很多朋友就发现手机照相时快门声音很响,想 ...

  4. android切换账户功能,安卓9系统开启多用户 android 9支持多用户切换吗?

    android 9支持多用户切换吗? 消息说是支持的呢 Android中的APP如何实现多帐号切换? 这个并不难,你可以同时在服务器的数据库中关联一个主键下的多个账户,每一个账户都有唯一的主键,用主键 ...

  5. android 百度地图 addoverlay,百度地图 在调用 addOverlay 方法时闪图

    代码调试 跟踪 ,在调用 addOverlay 导致闪退 var self = null; var map = null; var mapRegionPage = null; mui.plusRead ...

  6. android 10闪退如何解决,安卓Activity启动在10.0下闪退

    锐英源精品开源,禁止转载和任何形式的非法内容使用,违者必究 安卓Activity启动在10.0下闪退 背景 近期开发的安卓App在数据量大时,安卓10.0下启动Activity时闪退,安卓8.0下不闪 ...

  7. Android自定义相机,切换前后摄像头,照相机拍照

    Android自定义相机,简单实现切换前后摄像头,照相机拍照 Ctrl +C  Ctrl+V 可以直接 run 起来,注释比较详细;源码下载 <?xml version="1.0&qu ...

  8. 安卓,上传图片不能调取照相机拍照

    我们常见的上传文件或者图片 是使用的input <form><input type="file" name="pic" id="pi ...

  9. android应用白屏闪退,安卓小精灵白屏闪退BUG

    机型:红米3 and 魅蓝3 大约50部左右 昨天打包的apk 打开小精灵白屏闪退 经过多次测试,必须打开wifi才能开启(只是打开wifi不连接也可以),摆平后无法加载广告,然后闪退. 网络环境:4 ...

最新文章

  1. 美工自我培养的几点经验总结
  2. CEO 赠书 | 节省 50% 的人生,终止“瞎忙”式勤奋
  3. 昨天又写到个结构体排序,用多种cmp
  4. Java Web Token - JWT
  5. python中的类属性和实例属性
  6. Vue源码之 Vue的生命周期
  7. IntelliJ IDEA 偏好设置
  8. 【linux】nohup运行守护进程
  9. 【java学习之路】(java框架)001.Maven配置及使用
  10. XEN虚拟机修改系统时间
  11. Django面试题(一)django的中间件最多可以写几个方法?使用中间件做什么?
  12. 深海迷航坐标传送代码_深海迷航秘籍代码大全 美丽水世界秘籍代码教程
  13. 深度精简版操作系统下IIS的安装方法
  14. 安装杀毒软件后计算机运行速度慢,ThinkPad运行速度慢怎么办
  15. 支付宝小程序悬浮按钮
  16. easyui treegrid php,jQuery中关于EasyUI的TreeGrid查询功能的实现
  17. 手机上有哪些可以记录生日倒计时天数的软件?
  18. ios-bug.html黑屏重启,iOS12曝重大BUG:iPhone黑屏无法充电!你中招没?
  19. C++ -- 基于多态的后宫管理系统(其实就是职工管理或者图书管理系统根据我自己的需求改编,毕竟追我的人太多了,要好好管理一下)
  20. flutter 分组列表

热门文章

  1. ERA5 积雪 降雪 区别_黑龙江漠河迎入秋以来最大降雪
  2. 2021年广东省安全员B证(项目负责人)免费试题及广东省安全员B证(项目负责人)考试试卷
  3. 《深度学习原理与TensorFlow实践》喻俨,莫瑜
  4. oracle强制关闭session,Oracle终止session
  5. 我在深圳300元月薪的小资生活(强人)
  6. 中国虾青素市场趋势报告、技术动态创新及市场预测
  7. (8)common-upload文件上传出现org.apache.commons.fileupload.FileUploadBase$IOFileUploadException
  8. 计算机系统节能减排,节能减排,我们怎么做?
  9. 微信小程序https端口指定(非443)
  10. SCAN算法 | 磁头引臂调度问题 | 双磁头进阶 | Java实现(详细注释)