| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | package com.littleboss.smartnote; import android.annotation.SuppressLint; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class UriParser {     /**      * 获取小于api19时获取相册中图片真正的uri      * 对于路径是:content://media/external/images/media/33517这种的,需要转成/storage/emulated/0/DCIM/Camera/IMG_20160807_133403.jpg路径,也是使用这种方法      * @param context      * @param uri      * @return      */     private static String getFilePath_below19(Context context,Uri uri) {         //这里开始的第二部分,获取图片的路径:低版本的是没问题的,但是sdk>19会获取不到         Cursor cursor = null;         String path = "";         try {             String[] proj = {MediaStore.Images.Media.DATA};             //好像是android多媒体数据库的封装接口,具体的看Android文档             cursor = context.getContentResolver().query(uri, proj, null, null, null);             //获得用户选择的图片的索引值             int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);             //将光标移至开头 ,这个很重要,不小心很容易引起越界             cursor.moveToFirst();             //最后根据索引值获取图片路径   结果类似:/mnt/sdcard/DCIM/Camera/IMG_20151124_013332.jpg             path = cursor.getString(column_index);         } finally {             if (cursor != null) {                 cursor.close();             }         }         return path;     }     /**      * @param context 上下文对象      * @param uri     当前相册照片的Uri      * @return 解析后的Uri对应的String      */     @SuppressLint("NewApi")     public static String getPath(final Context context, final Uri uri) {         // FIXME: 2018/11/13 Added if condition for test         if (uri != null) {             final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;             String pathHead = "";             // 1. DocumentProvider             if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {                 // 1.1 ExternalStorageProvider                 if (isExternalStorageDocument(uri)) {                     final String docId = DocumentsContract.getDocumentId(uri);                     final String[] split = docId.split(":");                     final String type = split[0];                     if ("primary".equalsIgnoreCase(type)) {                         return pathHead + Environment.getExternalStorageDirectory() + "/" + split[1];                     }                 }                 // 1.2 DownloadsProvider                 else if (isDownloadsDocument(uri)) {                     final String id = DocumentsContract.getDocumentId(uri);                     return id.substring(4);                 }                 // 1.3 MediaProvider                 else if (isMediaDocument(uri)) {                     final String docId = DocumentsContract.getDocumentId(uri);                     final String[] split = docId.split(":");                     final String type = split[0];                     Uri contentUri = null;                     if ("image".equals(type)) {                         contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                     } else if ("video".equals(type)) {                         contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;                     } else if ("audio".equals(type)) {                         contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;                     }                     final String selection = "_id=?";                     final String[] selectionArgs = new String[]{split[1]};                     return pathHead + getDataColumn(context, contentUri, selection, selectionArgs);                 }             }             // 2. MediaStore (and general)             else if ("content".equalsIgnoreCase(uri.getScheme())) {                 if (isGooglePhotosUri(uri)) {//判断是否是google相册图片                     return uri.getLastPathSegment();                 } else if (isGooglePlayPhotosUri(uri)) {//判断是否是Google相册图片                     return getImageUrlWithAuthority(context, uri);                 } else {//其他类似于media这样的图片,和android4.4以下获取图片path方法类似                     return getFilePath_below19(context, uri);                 }             }             // 3. 判断是否是文件形式 File             else if ("file".equalsIgnoreCase(uri.getScheme())) {                 return pathHead + uri.getPath();             }         }         return null;     }     /**      * @param uri      *         The Uri to check.      * @return Whether the Uri authority is ExternalStorageProvider.      */     private static boolean isExternalStorageDocument(Uri uri) {         return "com.android.externalstorage.documents".equals(uri.getAuthority());     }     /**      * @param uri      *         The Uri to check.      * @return Whether the Uri authority is DownloadsProvider.      */     private static boolean isDownloadsDocument(Uri uri) {         return "com.android.providers.downloads.documents".equals(uri.getAuthority());     }     /**      * @param uri      *         The Uri to check.      * @return Whether the Uri authority is MediaProvider.      */     private static boolean isMediaDocument(Uri uri) {         return "com.android.providers.media.documents".equals(uri.getAuthority());     }     /**      *  判断是否是Google相册的图片,类似于content://com.google.android.apps.photos.content/...      **/     public static boolean isGooglePhotosUri(Uri uri) {         return "com.google.android.apps.photos.content".equals(uri.getAuthority());     }     /**      *  判断是否是Google相册的图片,类似于content://com.google.android.apps.photos.contentprovider/0/1/mediakey:/local%3A821abd2f-9f8c-4931-bbe9-a975d1f5fabc/ORIGINAL/NONE/1075342619      **/     public static boolean isGooglePlayPhotosUri(Uri uri) {         return "com.google.android.apps.photos.contentprovider".equals(uri.getAuthority());     }     /**      * Google相册图片获取路径      **/     public static String getImageUrlWithAuthority(Context context, Uri uri) {         InputStream is = null;         if (uri.getAuthority() != null) {             try {                 is = context.getContentResolver().openInputStream(uri);                 Bitmap bmp = BitmapFactory.decodeStream(is);                 return writeToTempImageAndGetPathUri(context, bmp).toString();             } catch (FileNotFoundException e) {                 //e.printStackTrace();                 Log.i("err getImageUrl...() : ", e.toString());             }finally {                 try {                     if(is!=null)                         is.close();                 }catch (IOException e){                     //e.printStackTrace();                     Log.i("err getImageUrl...() : ", e.toString());                 }             }         }         return null;     }     /**      * 将图片流读取出来保存到手机本地相册中      **/     public static Uri writeToTempImageAndGetPathUri(Context inContext, Bitmap inImage) {         ByteArrayOutputStream bytes = new ByteArrayOutputStream();         inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);         String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);         return Uri.parse(path);     }     /**      * Get the value of the data column for this Uri. This is useful for      * MediaStore Uris, and other file-based ContentProviders.      *      * @param context      *            The context.      * @param uri      *            The Uri to query.      * @param selection      *            (Optional) Filter used in the query.      * @param selectionArgs      *            (Optional) Selection arguments used in the query.      * @return The value of the _data column, which is typically a file path.      */     private static String getDataColumn(Context context, Uri uri, String selection,                                        String[] selectionArgs) {         Cursor cursor = null;         final String column = "_data";         final String[] projection = { column };         try {             cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,                     null);             if (cursor != null && cursor.moveToFirst()) {                 final int column_index = cursor.getColumnIndexOrThrow(column);                 return cursor.getString(column_index);             }         } finally {             if (cursor != null)                 cursor.close();         }         return null;     } } | cs | 
라는 클래스를 만들고(출처 : https://github.com/kjs1715/SmartNote/blob/27a6f8ca9c8f2d198206f57eba02c1622bd7a3f7/app/src/main/java/com/littleboss/smartnote/UriParser.java)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public static String uriToFilename(Uri uri) {     String path = null;     if (Build.VERSION.SDK_INT < 11) {         path = getPath(mainActivity.getApplicationContext(), uri);     } else if (Build.VERSION.SDK_INT < 19) {         path = getPath(mainActivity.getApplicationContext(), uri);     } else {         path = getPath(mainActivity.getApplicationContext(), uri);     }     uri = Uri.parse(path);     Cursor cursor = mainActivity.getContentResolver().query(uri, null, null, null, null );     cursor.moveToNext();     String resutlPath = cursor.getString( cursor.getColumnIndex( "_data" ) );     cursor.close();     return resutlPath; } | cs | 
라는 파일을 만들면 uri를 통해서 절대경로를 갖고오고 구글포토 서버에 있는 그림은 다운로드 받아서 패스 가져옴
