问题描述
- Android拍照onActivityResult的奇怪BUG
- 这个BUG是一个很奇怪的问题,调用系统相机拍照(在别人的手机上还有美颜相机,美颜相机很容易出这个问题,系统相机不太容易出)
第一次遇到这种特别奇葩的问题,完全跟踪不到,无论如何都没有任何错误输出,没有任何提示无征兆的闪退。
具体就是传入一个指定文件作为拍照文件。如下:Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (picturesUploadAndEditView != null){ picturesUploadAndEditView.dissmissDialog(); } tempPhotoPath = getTempImage(); if (tempPhotoPath == null || tempPhotoPath.trim().equals("""")){ Toast.makeText(MyApplication.getInstance() getResources().getString(R.string.sd_error) Toast.LENGTH_LONG); return; } File tempFile = new File(tempPhotoPath); Uri imageUri = Uri.fromFile(tempFile); intent.putExtra(MediaStore.EXTRA_OUTPUT imageUri); startActivityForResult(intent ACTION_TAKE_PHOTO);
getTempImage()是一个自动生成照片保存路径的方法。
但是拍照完毕后 大概有20%左右几率,程序会直接闪退。经过调试发现是tempPhotoPath变成了null.加了try catch捕获异常并加Toash提示却无效,Toash根本不出程序就直接闪退了。后来我甚至把整个onActivityResult都加try里面了,但是还可能闪退,奇怪的是,闪退没有任何的错误输出,后来我在代码里逐行加调试输出跟踪,发现只要执行了return,就没有然后了,执行完了,程序不是回到原来的地方而是闪退出去,没报错信息。后来加了UncaughtExceptionHandler试图捕获错误输错却根本没进入到那里面去。求解,彻底没有任何思路了。
解决方案
测试了半天,经过查找资料终于发现问题。
在调用相机过后,拍照时候可能原来的应用已经被回收了。尤其是同事用美颜相机测试,可能占用内存过大,直接kill掉了。
我发现在这种情况下,返回原activity的onActivityResult,返回数据都正常的,照片也确实拍到了找得到,只是原来activity内的成员变量都没了,或者说,整个application貌似都销毁了,所有数据都没了。
所以看似好像就是程序彻底闪退一样。其实并没有发生异常,只是APP都没了还玩个毛线啊。
解决方案二:
问题应该是oom
解决方案三:
网页卡了,抱歉。。。
解决方案四:
那就是说明getTempImage中有可能获取不到图片,Android系统不同,获取相机返回数据的方法也不一样,有的getData是null,另外,照相可能会引起activity的横竖屏转换,你最好把activity的横屏禁止掉
解决方案五:
感觉有可能是照片过大,导致照片为空,看需不需要对照片进行裁剪或者压缩。
解决方案六:
这个还是要分析 getTempImage() 为什么返回空?
对于同一款手机,是否每次都正确、或者错误?如果不是,可能是系统接口或者图片大小的问题;但如果不是,则情况可能会比较复杂,因为接口和图片大小已经确定,不可能是这两方面的原因。
程序可能存在其它问题,建议你单独(另外写一个简单的程序)对拍照的接口进行测试,而不是在你的应用中进行测试。
解决方案七:
是不是你的文件夹创建没成功啊