前言:本系列是我在平時工作中遇到的一些問題,通過各種途徑解決之后的經(jīng)驗之談
最近項目有一個需求,就是拍照上傳圖片。其實這個需求,分解之后挺簡單的。不外乎就是:
1.調(diào)用相機拍照
2.保存圖片到指定位置(這里不用默認位置,是因為,我后面上傳需要給地址,自己寫一個,可以方便用)
3.在onActivityResult中獲取圖片,顯示圖片
4.壓縮圖片,上傳
1,2:相機拍照and保存圖片到指定位置
//這一句不用解釋吧,拍照
Intent takePictureIntent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
if(takePictureIntent.resolveActivity(activity.getPackageManager()) !=null) {
//創(chuàng)建圖片文件(路徑就放在這里面了)
File photoFile = createImageFile();
?if(photoFile !=null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile));
//這里添加這個文件的絕對路徑
activity.setPathForCamera(photoFile.getAbsolutePath());
}
}
activity.startActivityForResult(takePictureIntent,5);//跳轉(zhuǎn)界面?zhèn)骰嘏恼账脭?shù)據(jù)
/**
* 保存相機拍攝的圖片
*/
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) {
//提交到服務(wù)器
uploadSingleFile(file,urls,fileType);
}
@Override
public void onError(Throwable e) {
}
}).launch();
}
ok,多余的不多說了,就來說一說,之前說到的,//data.getParcelableExtra() ?為null的問題。原因,很簡單,就是因為我指定路徑之后,但是相機的activity是原生的,它是可以收到我activity發(fā)給它的數(shù)據(jù),但是,重點,它不會通過intent綁定數(shù)據(jù),返回回來。因為,我們無法控制相機的intent,相機的機制,只會處理某些(比如默認路徑)路徑(我隨意指定的路徑,目前是不能處理的)。所以,這里的intent就為null了。那么解決方案就是,我所寫的那樣,用一個變量去保存那個路徑,然后,通過這個路徑拿出這張圖片。好了,這樣子就可以解決,inten為空,拿不到照片了。