Android API 19+:有时在图像的DocumentsContract.getDocumentId中没有类型,无法通过id找到
创始人
2024-08-13 03:30:33
0

在Android API 19及更高版本中,可以使用以下代码示例来解决在图像的DocumentsContract.getDocumentId中没有类型的问题:

public String getImagePathFromUri(Context context, Uri uri) {
    String imagePath = null;
    if (DocumentsContract.isDocumentUri(context, uri)) {
        // 如果是文档类型的URI
        String documentId = DocumentsContract.getDocumentId(uri);
        if (isMediaDocument(uri)) {
            // MediaProvider
            String[] split = documentId.split(":");
            String type = split[0];
            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            }
            String selection = "_id=?";
            String[] selectionArgs = new String[]{split[1]};
            imagePath = getDataColumn(context, contentUri, selection, selectionArgs);
        } else if (isDownloadsDocument(uri)) {
            // DownloadsProvider
            if (documentId.startsWith("raw:")) {
                imagePath = documentId.replaceFirst("raw:", "");
            } else {
                Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
                imagePath = getDataColumn(context, contentUri, null, null);
            }
        }
    } else if ("content".equalsIgnoreCase(uri.getScheme())) {
        // 如果是content类型的URI
        imagePath = getDataColumn(context, uri, null, null);
    } else if ("file".equalsIgnoreCase(uri.getScheme())) {
        // 如果是file类型的URI
        imagePath = uri.getPath();
    }
    return imagePath;
}

private String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
    String[] projection = {MediaStore.Images.Media.DATA};
    Cursor cursor = null;
    String path = null;
    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
        if (cursor != null && cursor.moveToFirst()) {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            path = cursor.getString(columnIndex);
        }
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return path;
}

private boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}

private boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

这段代码使用了DocumentsContract类来处理不同类型的URI,并通过查询MediaStore或DownloadsProvider来获取图像的路径。具体的处理流程如下:

  1. 首先,判断URI是否是文档类型的URI,可以使用DocumentsContract.isDocumentUri(context, uri)方法来判断。
  2. 如果是文档类型的URI,使用DocumentsContract.getDocumentId(uri)方法获取文档的ID。
  3. 判断该文档是否属于MediaProvider或DownloadsProvider,可以使用isMediaDocument(uri)isDownloadsDocument(uri)方法来判断。
  4. 如果是MediaProvider类型的文档,通过解析documentId获取类型和ID,并根据类型选择对应的contentUri,然后使用getDataColumn()方法查询MediaStore并获取图像路径。
  5. 如果是DownloadsProvider类型的文档,判断documentId是否以"raw:"开头,如果是则直接使用该路径,否则根据documentId构建对应的contentUri,然后使用getDataColumn()方法查询DownloadsProvider并获取图像路径。
  6. 如果不是文档类型的URI,判断URI的scheme是"content"还是"file",分别使用getDataColumn()方法查询对应的内容提供器或直接获取文件路径。
  7. 返回获取到的图像路径。

注意:以上代码仅适用于处理图像的路径,如果需要处理其他类型的文件路径,请相应地修改代码中的逻辑。

相关内容

热门资讯

安卓换鸿蒙系统会卡吗,体验流畅... 最近手机圈可是热闹非凡呢!不少安卓用户都在议论纷纷,说鸿蒙系统要来啦!那么,安卓手机换上鸿蒙系统后,...
安卓系统拦截短信在哪,安卓系统... 你是不是也遇到了这种情况:手机里突然冒出了很多垃圾短信,烦不胜烦?别急,今天就来教你怎么在安卓系统里...
app安卓系统登录不了,解锁登... 最近是不是你也遇到了这样的烦恼:手机里那个心爱的APP,突然就登录不上了?别急,让我来帮你一步步排查...
安卓系统要维护多久,安卓系统维... 你有没有想过,你的安卓手机里那个陪伴你度过了无数日夜的安卓系统,它究竟要陪伴你多久呢?这个问题,估计...
windows官网系统多少钱 Windows官网系统价格一览:了解正版Windows的购买成本Windows 11官方价格解析微软...
安卓系统如何卸载app,轻松掌... 手机里的App越来越多,是不是感觉内存不够用了?别急,今天就来教你怎么轻松卸载安卓系统里的App,让...
怎么复制照片安卓系统,操作步骤... 亲爱的手机控们,是不是有时候想把自己的手机照片分享给朋友,或者备份到电脑上呢?别急,今天就来教你怎么...
安卓系统应用怎么重装,安卓应用... 手机里的安卓应用突然罢工了,是不是让你头疼不已?别急,今天就来手把手教你如何重装安卓系统应用,让你的...
iwatch怎么连接安卓系统,... 你有没有想过,那款时尚又实用的iWatch,竟然只能和iPhone好上好?别急,今天就来给你揭秘,怎...
iphone系统与安卓系统更新... 最近是不是你也遇到了这样的烦恼?手机更新系统总是失败,急得你团团转。别急,今天就来给你揭秘为什么iP...