不懂就学系列(二):调用相机拍照并上传图片(intent为null)

前言:本系列是我在平时工作中遇到的一些问题,通过各种途径解决之后的经验之谈

最近项目有一个需求,就是拍照上传图片。其实这个需求,分解之后挺简单的。不外乎就是:

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为空,拿不到照片了。

你可能感兴趣的:(不懂就学系列(二):调用相机拍照并上传图片(intent为null))