前言:本系列是我在平时工作中遇到的一些问题,通过各种途径解决之后的经验之谈
最近项目有一个需求,就是拍照上传图片。其实这个需求,分解之后挺简单的。不外乎就是:
1.调用相机拍照
2.保存图片到指定位置(这里不用默认位置,是因为,我后面上传需要给地址,自己写一个,可以方便用)
3.在onActivityResult中获取图片,显示图片
4.压缩图片,上传
1,2:相机拍照and保存图片到指定位置
//这一句不用解释吧,拍照
Intent takePictureIntent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
if(takePictureIntent.resolveActivity(activity.getPackageManager()) !=null) {
//创建图片文件(路径就放在这里面了)
File photoFile = createImageFile();
if(photoFile !=null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile));
//这里添加这个文件的绝对路径
activity.setPathForCamera(photoFile.getAbsolutePath());
}
}
activity.startActivityForResult(takePictureIntent,5);//跳转界面传回拍照所得数据
/**
* 保存相机拍摄的图片
*/
private File createImageFile() {
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File imageFile =null;
try{
imageFile = File.createTempFile(generateFileName(),".jpg",storageDir);
}catch(IOException e) {
e.printStackTrace();
}
return imageFile;
}
3.在onActivityResult中获取图片(显示,这里就不写了)
@Override
protected voidonActivityResult(intrequestCode, intresultCode,Intent data) {
if(requestCode ==Photo&& resultCode ==RESULT_OK) {
//这里这个data是为null的,这样是得不到这个之前那个文件的,原因后面解释通过getPathForCamera
//方法获取uri,进而得到这个文件的
//data.getParcelableExtra()
//这里,获取之前添加的路径
File photoFile =newFile(getPathForCamera());
//压缩和上传
proxy.compressAndUploadPic(photoFile,UploadFileBusiness.CHECK_PIC);
}
}
4.压缩图片,上传
/**
* 压缩并上传图片
*/
public void compressAndUploadPic(File file, final intfileType) {
//这下面的注释部分,其实是显示图片的逻辑,不过这里不需要,就注释了
//Uri uri = UriUtils.getImageContentUri(activity,file);
//DataModel select =newDataModel(uri, false);
//mDatas.remove(addModel);
//mDatas.add(select);
//if(mDatas.size() < Constant.MAX_PIC_CHECK) {
//mDatas.add(addModel);
//}
//mAdapter.setData(mDatas);
//这里用的是luban框架帮我做压缩
Luban.with(activity)
.load(file)
.setCompressListener(newOnCompressListener() {
@Override
public void onStart() {
}
@Override
public void onSuccess(File file) {
//提交到服务器
uploadSingleFile(file,urls,fileType);
}
@Override
public void onError(Throwable e) {
}
}).launch();
}
ok,多余的不多说了,就来说一说,之前说到的,//data.getParcelableExtra() 为null的问题。原因,很简单,就是因为我指定路径之后,但是相机的activity是原生的,它是可以收到我activity发给它的数据,但是,重点,它不会通过intent绑定数据,返回回来。因为,我们无法控制相机的intent,相机的机制,只会处理某些(比如默认路径)路径(我随意指定的路径,目前是不能处理的)。所以,这里的intent就为null了。那么解决方案就是,我所写的那样,用一个变量去保存那个路径,然后,通过这个路径拿出这张图片。好了,这样子就可以解决,inten为空,拿不到照片了。