1. 程式人生 > >Android 華為手機獲取相簿圖片路徑,獲取不到問題

Android 華為手機獲取相簿圖片路徑,獲取不到問題

有個需求,可以從系統相簿選擇圖片,上傳到伺服器。那麼選擇從系統相簿選擇完圖片後,圖片的名字需要顯示在頁面上。這裡出了個 Bug,華為手機用系統的方法,獲取相簿圖片路徑,返回 null。用別的品牌的手機,卻又是正常的。

問題展示:

華為 Mate10.jpg

解決步驟:

1、Debug 跟了一遍程式碼,發現程式碼裡面獲取相簿圖片的路徑為 null,因為做了非空判斷,所以直接返回 null 了。
2、Google ,發生此 bug 的根本原因是版本不同導致的 Uri 的問題。Android 4.3 及以下,根據 Uri 來查詢系統相簿,得到照片的 path 完全沒有問題。而 Android 4.4 返回的 Uri 跟 Android 4.3 及以下完全不一樣。Android 4.3 返回的是檔案路徑,而 Android 4.4 返回的卻是“content://com.android.providers.media.documents/document/image:xxxxx”,拿這個 Uri 去查詢系統相簿,圖片路徑返回肯定為 null 了。

可行方案:通過下面的方法將 Uri 轉換成我們需要的 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 = "";
        //如果是華為手機,呼叫上面給出的方法,即可得到正確的圖片途徑
        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", "上傳的網址是----->" + 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();
    }

解決後的效果展示:

圖例.jpg

本文原創釋出於微信公眾號「NoBug」,程式設計、思維、成長、正能量,關注並回復「程式設計」、「閱讀」、「Java」、「Python」等關鍵字獲取免費學習資料

不要給自己的人生設限