未經(jīng)本人授權(quán)馏谨,不得轉(zhuǎn)載别渔!否則必將維權(quán)到底
有個(gè)需求,可以從系統(tǒng)相冊(cè)選擇圖片惧互,上傳到服務(wù)器哎媚。那么選擇從系統(tǒng)相冊(cè)選擇完圖片后,圖片的名字需要顯示在頁面上喊儡。這里出了個(gè) Bug拨与,華為手機(jī)用系統(tǒng)的方法,獲取相冊(cè)圖片路徑艾猜,返回 null截珍。用別的品牌的手機(jī)攀甚,卻又是正常的。
問題展示:
解決步驟:
1岗喉、Debug 跟了一遍代碼,發(fā)現(xiàn)代碼里面獲取相冊(cè)圖片的路徑為 null炸庞,因?yàn)樽隽朔强张袛嗲玻灾苯臃祷?null 了。
2埠居、Google 查牌,發(fā)生此 bug 的根本原因是版本不同導(dǎo)致的 Uri 的問題。Android 4.3 及以下滥壕,根據(jù) Uri 來查詢系統(tǒng)相冊(cè)纸颜,得到照片的 path 完全沒有問題。而 Android 4.4 返回的 Uri 跟 Android 4.3 及以下完全不一樣绎橘。Android 4.3 返回的是文件路徑胁孙,而 Android 4.4 返回的卻是“content://com.android.providers.media.documents/document/image:xxxxx”,拿這個(gè) Uri 去查詢系統(tǒng)相冊(cè)称鳞,圖片路徑返回肯定為 null 了涮较。
可行方案:通過下面的方法將 Uri 轉(zhuǎn)換成我們需要的 path 即可
public static String getImagePathFromURI(Activity activity,Uri uri) {
Cursor cursor = activity.getContentResolver().query(uri, null, null, null, null);
String path = null;
if (cursor != null) {
cursor.moveToFirst();
String document_id = cursor.getString(0);
document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
cursor.close();
cursor = activity.getContentResolver().query(
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
if (cursor != null) {
cursor.moveToFirst();
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
cursor.close();
}
}
return path;
}
邏輯完整代碼:
/**
* @param uri
* @param multipartContent
* @return
* @throws Exception
*/
public static String uploadImageInWeb(String uploadKey,Uri uri,Activity context, CustomMultipartEntity multipartContent) throws Exception {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor actualimagecursor = context.managedQuery(uri,proj,null,null,null);
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
String img_path = "";
//如果是華為手機(jī),調(diào)用上面給出的方法冈止,即可得到正確的圖片途徑
if(isHuaWeiPhone()){
img_path = getImagePathFromURI(context,uri);
}else{
img_path = actualimagecursor.getString(actual_image_column_index);
}
if (img_path==null) {
return null;
}
File imageFile = new File(img_path);
KeithXiaoYClient client = KeithXiaoYApplication.mClient;
String url = Constants.serverAdd
+ "?sessionkey="
+ Constants.sessionKey;
LogUtils.i("keithxiaoy", "上傳的網(wǎng)址是----->" + url + "/");
Map<String, String> params = new HashMap<String, String>();
params.put("uploadFileName", imageFile.getName());
params.put("uploadContentType", "image/png");
params.put("uploadKey", uploadKey);
params.put("method", "upload");
multipartContent.addPart("uploadFile", new FileBody(imageFile));
JSONObject object = client.uploadMediaFiles(url, params,multipartContent);
JSONArray jsonArray = object.getJSONArray("upload");
if (jsonArray != null) {
LogUtils.i("keithxiaoy", "上傳成功");
} else {
LogUtils.i("keithxiaoy", "上傳失敗");
}
return imageFile.getName();
}