android media库中external的读取

一、android是如何管理多媒体文件(音频、视频、图片)的信息。

通过DDMS,我们在/data/data/com.android.providers.media下找到数据库文件

  

  打开external.db文件进一步查看:在media表格下,可以看到文件路径(_data)和Uri的标示ID(_id)的对应关系。

  

二、URI与文件相互转换

   1.从URI获得文件路径

string  myImageUrl = "content://media/external/images/media/***";
     Uri uri = Uri.parse(myImageUrl);
     
 
     String[] proj = { MediaStore.Images.Media.DATA };   
     Cursor actualimagecursor = this.ctx.managedQuery(uri,proj,null,null,null);  
     int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);   
     actualimagecursor.moveToFirst();   
     
 
     String img_path = actualimagecursor.getString(actual_image_column_index);  
     File file = new File(img_path);
     Uri fileUri = Uri.fromFile(file);

2.由文件路径得到URI

Uri mUri = Uri.parse("content://media/external/images/media"); 
             Uri mImageUri = null;
 
             Cursor cursor = managedQuery(
                     MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null,
                     null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
             cursor.moveToFirst();
 
             while (!cursor.isAfterLast()) {
                 String data = cursor.getString(cursor
                         .getColumnIndex(MediaStore.MediaColumns.DATA));
                 if (picPath.equals(data)) {
                     int ringtoneID = cursor.getInt(cursor
                             .getColumnIndex(MediaStore.MediaColumns._ID));
                     mImageUri = Uri.withAppendedPath(mUri, ""
                             + ringtoneID);
                     break;
                 }
                 cursor.moveToNext();
             }



Android 11 及以上版本中,由于限制了对外部存储的访问,从 URI 中读取文件路径的方法发生了变化,可以使用以下方法: ```java public String getFilePathFromUri(Context context, Uri uri) { String filePath = ""; if (DocumentsContract.isDocumentUri(context, uri)) { // 如果是Document类型的URI,则通过Document ID获取文件路径 String documentId = DocumentsContract.getDocumentId(uri); if (uri.getAuthority().equals("com.android.externalstorage.documents")) { String[] split = documentId.split(":"); String type = split[0]; if (type.equals("primary")) { filePath = Environment.getExternalStorageDirectory() + "/" + split[1]; } else { filePath = "/storage/" + type + "/" + split[1]; } } else if (uri.getAuthority().equals("com.android.providers.downloads.documents")) { Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.parseLong(documentId)); filePath = getDataColumn(context, contentUri, null, null); } else if (uri.getAuthority().equals("com.android.providers.media.documents")) { String[] split = documentId.split(":"); String type = split[0]; Uri contentUri = null; if (type.equals("image")) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if (type.equals("video")) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if (type.equals("audio")) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } String selection = MediaStore.Images.Media._ID + "=?"; String[] selectionArgs = new String[]{split[1]}; filePath = getDataColumn(context, contentUri, selection, selectionArgs); } } else if (uri.getScheme().equals("file")) { filePath = uri.getPath(); } return filePath; } private String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { String column = "_data"; String[] projection = {column}; Cursor cursor = null; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) { cursor.close(); } } return null; } ``` 在上述代码中,使用了 `DocumentsContract` 类来处理不同类型的 URI,同时还使用了 `Environment.getExternalStorageDirectory()` 方法来获取外部存储器的路径。由于这种方法仅适用于 Android 11 及以上版本,因此需要在代码中进行版本判断。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值