android4.4以及以上的系统,无法获取相册图片解决方法。

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:22   1137   0

以前获取相册的图片用的这个Intent

<pre name="code" class="html">Intent localIntent = new Intent();
localIntent.setType("image/*");
localIntent.setAction("android.intent.action.GET_CONTENT");

然后在onActivityResult中 intent.getData() 就可以获取到图片的uri。今天用4.4的系统发现根据返回的uri获取不到对应的图bitmap了。

 
报各种权限错误之类的,打印返回值 返现uri变了
4.4之前:content://media/external/images/media/9498
4.4之后:content://com.android.providers.media.documents/document/image%3A31581
好了废话不多说,以下是网上搜到解决方案。感谢提供解决方案的大神!
/**
  * 根据图片的uri获取路径,用于解决4.4以上系统获取不到图片uri
  * @param context
  * @param uri
  * @return
  */
 @TargetApi(Build.VERSION_CODES.KITKAT) 
 public static String getPath(final Context context, final Uri uri) {  
    
     final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;  
   
     // DocumentProvider  
     if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {  
         // 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 Environment.getExternalStorageDirectory() + "/" + split[1];  
             }  
   
             // TODO handle non-primary volumes  
         }  
         // DownloadsProvider  
         else if (isDownloadsDocument(uri)) {  
   
             final String id = DocumentsContract.getDocumentId(uri);  
             final Uri contentUri = ContentUris.withAppendedId(  
                     Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));  
   
             return getDataColumn(context, contentUri, null, null);  
         }  
         // 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 getDataColumn(context, contentUri, selection, selectionArgs);  
         }  
     }  
     // MediaStore (and general)  
     else if ("content".equalsIgnoreCase(uri.getScheme())) {  
   
         // Return the remote address  
         if (isGooglePhotosUri(uri))  
             return uri.getLastPathSegment();  
   
         return getDataColumn(context, uri, null, null);  
     }  
     // File  
     else if ("file".equalsIgnoreCase(uri.getScheme())) {  
         return uri.getPath();  
     }  
   
     return null;  
 }  
   
 /**
 * 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.
 */  
 public 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 index = cursor.getColumnIndexOrThrow(column);  
             return cursor.getString(index);  
         }  
     } finally {  
         if (cursor != null)  
             cursor.close();  
     }  
     return null;  
 }  
   
   
 /**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is ExternalStorageProvider.
 */  
 public 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.
 */  
 public 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.
 */  
 public static boolean isMediaDocument(Uri uri) {  
     return "com.android.providers.media.documents".equals(uri.getAuthority());  
 }  
   
 /**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is Google Photos.
 */  
 public static boolean isGooglePhotosUri(Uri uri) {  
     return "com.google.android.apps.photos.content".equals(uri.getAuthority());  
 }  

用这个getPath方法获取到图片的路径。然后转化成uri或者Bitmapfactory.decodeFile() 大家就随意发挥吧。


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP