android 调用系统相机拍照的各种异常处理

1 本文只讨论调用系统相机出现的异常解决办法下面是调用系统相机的代码

先看一下最简单的写法

		Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
		startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);

 android.provider.MediaStore.ACTION_IMAGE_CAPTURE这个是调用系统相机的action

 SELECT_PIC_BY_TACK_PHOTO 这个用于在onActivityResult方法里面(和requestCode对应)回调判断

在onActivityResult 这个方法里面一般我们需要从回调的Intent里面取到我们需要的图片

获取图片的方法 Bitmap photo = data.getParcelableExtra("data"); 

这里面得到的是图片的缩略图,但是有些手机这个取到的是是null,所以我们需要另外一种方式

2  指定图片的拍摄路径:

		Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
		Uri outputFileUri = Uri.fromFile(cameraTempFile);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
		startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);
这个时候onActivityResult回调以后我们不在用  data.getParcelableExtra( "data" ); 而是用我们自己定义的cameraTempFile获取拍照后存储的图片

注意:需要缩略图的自己用原图生成即可,不要直接用否则可能会出现内存不足情况

3 用上面的方法依然会有一个问题,有些机型(主要是山寨机)你指定的这个文件,拍照的时候直接奔溃

这个是否我们需要先创建这个文件才可以

	cameraTempFile = new File(cameraTempPathDir + timeStamp + ".jpg");
		if (!cameraTempFile.exists()) {
			try {
				cameraTempFile.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
4 经过以上处理我们可以完美拍照了,什么还有问题onActivityResult没被调用

这个原因主要是你拍照的Activity被系统关闭了,这种情况下cameraTempFile如果不做处理也会为空,下面先说先原因

关闭原因 A 三星的camera强制切换到横屏  导致Activity重启生命周期 (但是部分机型  配置  android:configChanges  也不能阻止横竖屏切换); 

              B 系统内存不足造成activity被关闭,这个时候会调用

public void onTrimMemory(int level) {
		super.onTrimMemory(level);
		switch (level) {
		case TRIM_MEMORY_UI_HIDDEN:// 内存不足,并且该进程的UI已经不可见了。
	}
	}

下面说下处理方案,也非常的简单

如果 系统销毁activity,   会在销毁之前调用 onSaveInstanceState,我们在这个方法内 保存图片的路径   

当activity重新创建的时候 会将 onSaveInstanceState  保存的文件传递给onCreate()当中

在onCreate当中  检查照片的地址是否存在文件  以此来判定拍照是否成功

然后拿到图片在做后续处理即可

这个地址有一个完整的例子

http://blog.csdn.net/aaawqqq/article/details/37034243




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值