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