2 u011073953 u011073953 于 2016.01.27 10:41 提问

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试图捕获错误输错却根本没进入到那里面去。求解,彻底没有任何思路了。

7个回答

u011073953
u011073953   2016.01.29 11:24
已采纳

测试了半天,经过查找资料终于发现问题。
在调用相机过后,拍照时候可能原来的应用已经被回收了。尤其是同事用美颜相机测试,可能占用内存过大,直接kill掉了。
我发现在这种情况下,返回原activity的onActivityResult,返回数据都正常的,照片也确实拍到了找得到,只是原来activity内的成员变量都没了,或者说,整个application貌似都销毁了,所有数据都没了。
所以看似好像就是程序彻底闪退一样。其实并没有发生异常,只是APP都没了还玩个毛线啊。

g951dd
g951dd   2016.01.27 11:24

问题应该是oom

u011073953
u011073953 OOM那难道不会报出error吗?就是没捕获error。也应该会提示出错误信息啊
2 年多之前 回复
u011073953
u011073953 OOM那难道不会报出error吗?就是没捕获error。也应该会提示出错误信息啊
2 年多之前 回复
g951dd
g951dd   2016.01.27 11:25

网页卡了,抱歉。。。

bdmh
bdmh   Ds   Rxr 2016.01.27 10:46

那就是说明getTempImage中有可能获取不到图片,Android系统不同,获取相机返回数据的方法也不一样,有的getData是null,另外,照相可能会引起activity的横竖屏转换,你最好把activity的横屏禁止掉

u011073953
u011073953 补充一下 getTempImage定义只是获取临时保存图片的文件。这个如果是null我会不允许拍照的。横竖屏的话。我是限制过的应该不是。
2 年多之前 回复
onlyarce
onlyarce   2016.01.27 11:04

感觉有可能是照片过大,导致照片为空,看需不需要对照片进行裁剪或者压缩。

u011073953
u011073953 主要是我对照片过大导致OOM是处理了的。
2 年多之前 回复
u011073953
u011073953 到应该不是照片过大问题。而且我代码里只有预览图片而已,是压缩后显示的。实际发送时候直接发送文件,不涉及内存问题的。
2 年多之前 回复
91program
91program   Ds   Rxr 2016.01.27 11:29

这个还是要分析 getTempImage() 为什么返回空?
对于同一款手机,是否每次都正确、或者错误?如果不是,可能是系统接口或者图片大小的问题;但如果不是,则情况可能会比较复杂,因为接口和图片大小已经确定,不可能是这两方面的原因。
程序可能存在其它问题,建议你单独(另外写一个简单的程序)对拍照的接口进行测试,而不是在你的应用中进行测试。

u011073953
u011073953 getTempImage() 我是确定不是空的,有输出,而且如果那个是空的话,是不会调用相机的。关键问题是,有一个正常的路径,但是拍照回来就成了null了
2 年多之前 回复
Mr_dsw
Mr_dsw   Ds   Rxr 2016.01.27 19:53

是不是你的文件夹创建没成功啊

u011073953
u011073953 不是的
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
android 进行拍照操作时对 onActivityResult()的封装隔离
在进行调用相机拍照功能时,需要使用到 startActivityForResult 和 onActivityResult 在实际使用时还是略微有些繁琐,比较理想的状态应当是屏蔽拍照、截屏等处理细节,调用拍照功能的Activity页面只需要调用拍照方法并获得照片路径即可 即:如  getPhoto(params , callback(){ onImageInfo(String imageP
解决android调用系统相机拍照保存时onActivityResult中data为null的问题
调用系统相机照相的代码: boolean isNull=false;//判断照相机返回数据是否为空 Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE"); File file = new File(Environment.getExternalStorageDirectory()
Android调用相机无法执行onActivityResult或data为null
最近项目中调用系统相机时遇到了这么个问题:红米手机无法执行onActivityResult回调,部分华为手机无法获取到照片数据,最后各种分析,各种网上搜索资料折腾了好久,最后终于把问题解决,当看到问题的最终原因时,我也是醉了,简直就是坑爹坑大发了。 最开始用红米手机调用系统相机的时,当我拍照完成点击那个勾勾始终无法返回到前面的界面上,也就是无法调用onActivityResult函数取到拍照
compileSdkVersion为23以下的应用运行在Android6.0的拍照权限处理(拍照时onActivityResult的data返回为null的处理办法)
compileSdkVersion在23以下的应用运行在Android6.0的拍照权限处理[拍照时onActivityResult的data返回为null的处理办法]场景还原我以前开发的一个项目中需要适配到Android6.0,主要是权限的适配,其他权限基本都还能用,第一个想法就是把compileSdkVersion改为23,然后加上网上好多大牛写的第三方动态权限请求库即可(github搜andro
调用系统相机照相,照完后没有调用onActivityResult
我碰到的一个这样的问题,其他手机机型没有问题,魅族MX2就是不行。
Android_照相机Camera_使用intent调用系统照相机在onActivityResult返回data为空
本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/16916279 1.调用系统照相机 [java] view plaincopy //实例化一个intent,并指定action   Intent intent = new Intent
解释 Android 调用系统相机,在onActivityResult中接收的data为null的原因
很多时候,我们在使用程序调用系统相机的时候,会发现在onActivityResult中接收的data为null,开始我也一直不明白,这是为什么,后来查看了源码才知道,今天在这记录一下,方便以后忘了。哈哈。 下面这个方法是我调用系统相机的方法,其中红色标记的方法是设置拍照后相片保存的地址。 /** * 设置一些参数 * */ private void takePhoto ()
关于调用系统照相机不执行OnActivityResult的解决方式
最近做一个项目要调用系统照相机并且将图片保存起来,但是跳转到系统照相机点击确认后却不返回,原因是没有加入SD卡读取和写入的权限,晕死。
Android调用系统相机onActivityResult返回参数data为null
一般调用系统相机的代码: filePath = ImageUtil.getCacheFilePath(this, StaticValue.PHOTO_PROTOCOL_ENTRUST); File file = new File(filePath); Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Android中调用本机camera,遇到无法回调onActivityresult方法
今天写项目调用本机camera时,遇到zhge