前言:本系列是我在平時工作中遇到的一些問題僻爽,通過各種途徑解決之后的經(jīng)驗之談
最近項目有一個需求富岳,就是拍照上傳圖片。其實這個需求垢袱,分解之后挺簡單的。不外乎就是:
1.調用相機拍照
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);//跳轉界面?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) {
//提交到服務器
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為空删壮,拿不到照片了。