您的位置:首页 > 其它

Fragment 调用系统相机闪退问题

2016-04-01 17:04 162 查看
调用系统相机是很常见的功能点了,基本所有需要上传头像的应用都会有这个功能,而现在基本所有应用都有头像,所以。。。

不过也会遇到很多坑,例如在fragment中 不走onActivityResult方法。

解决办法就是在fragment 所在的Activity中重写onActivityResult方法 ,如下:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
personFragment.onActivityResult(requestCode, resultCode, data);


其中 super方法必须包含

然后就是调用fragment的onActivityResult方法。

这个问题比较好处理,不过还会遇到一个问题例如:

data ==null

现在同行的方法就是 调用系统相机时,把照片保存在一个固态

private String fileName;
public final File FILE_SDCARD = Environment
.getExternalStorageDirectory();
public final File FILE_LOCAL = new File(FILE_SDCARD, "vCar");
public final File FILE_PIC_SCREENSHOT = new File(FILE_LOCAL,
"images/screenshots");

/**
* 相机选择
*/
private void selectCamera() {
fileName = String.valueOf((new Date()).getTime()) + ".jpg";
SPUtil.getInstance().putString(Constant.FILE_PATH,fileName);
File filePath = FILE_PIC_SCREENSHOT;
if (!filePath.exists()) {
filePath.mkdirs();
}
try {
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(filePath, fileName);
// localTempImgDir和localTempImageFileName是自己定义的名字
Uri u = Uri.fromFile(f);
intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
intent.putExtra(MediaStore.EXTRA_OUTPUT, u);
startActivityForResult(intent, TAKE_PICTURE);
} catch (Exception e) {
e.printStackTrace();
}
}


不要以为这样就可以了 ,第三个坑来袭。

就是在这种情况下 你获取照片的方法如下:
File f = new File(FILE_PIC_SCREENSHOT, fileName);
Intent intent = new Intent(getActivity(), ActivityCropper.class);
intent.putExtra("path", f.getAbsolutePath());

// intent.putExtra("name", select_Num);
startActivityForResult(intent, CROP_PICTURE);
这时候在有些手机上还会报错,例如

filename ==null

原因可能是在fragment 调用相机并且返回后,fileName 没有保存

所以我的方法是保存在本地并且从本地读取。

存:

SPUtil.getInstance().putString(Constant.FILE_PATH,"")


读取:

SPUtil.getInstance().getString(Constant.FILE_PATH,"")
这样就不会报错并且能够顺利拿到图片了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: