【Android 11/12】 通过Uri获取绝对路径的方法

这篇具有很好参考价值的文章主要介绍了【Android 11/12】 通过Uri获取绝对路径的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理:通过对不同的Uri进行辨别,提取ID,

需要android.permission.MANAGE_EXTERNAL_STORAGE权限

android.externalstorage类型content的Uri处理方式:

直接获取"primary:"后的路径即可,后面即是相对路径.

media类型content的Uri处理方式:

与下一个类似,获取ID后进入数据表中查找.

android.providers类型content的Uri处理方式:

进入MediaStore.Files表中进行查询_data字段,旧版通过直接查询uri的方法获取_data已经无效.

下面贴的代码适合所有类型的文件,若只需要查询某种媒体的文件,只需要换一个查询表即可.文章来源地址https://www.toymoban.com/news/detail-558140.html

MediaStore.Files.getContentUri("external")
MediaStore.Files.getContentUri("internal")
MediaStore.Video.Media.EXTERNAL_CONTENT_URI
MediaStore.Video.Media.INTERNAL_CONTENT_URI
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
MediaStore.Images.Media.INTERNAL_CONTENT_URI
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
MediaStore.Audio.Media.INTERNAL_CONTENT_URI
MediaStore.Downloads.Media.EXTERNAL_CONTENT_URI
MediaStore.Downloads.Media.INTERNAL_CONTENT_URI

代码

public static String Uri2Path(Context context, Uri uri) {
        if (uri == null) {
            return null;
        }

        if(ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
            return uri.getPath();
        }
        else if(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
            String authority = uri.getAuthority();

            if(authority.startsWith("com.android.externalstorage")) {
                return Environment.getExternalStorageDirectory() + "/" + uri.getPath().split(":")[1];
            }
            else {
                String idStr = "";
                if(authority.equals("media")) {
                    idStr = uri.toString().substring(uri.toString().lastIndexOf('/') + 1);
                }
                else if(authority.startsWith("com.android.providers")) {
                    idStr = DocumentsContract.getDocumentId(uri).split(":")[1];
                }

                ContentResolver contentResolver = context.getContentResolver();
                Cursor cursor = contentResolver.query(MediaStore.Files.getContentUri("external"),
                        new String[] {MediaStore.Files.FileColumns.DATA},
                        "_id=?",
                        new String[]{idStr}, null);
                if (cursor != null) {
                    cursor.moveToFirst();
                    try {
                        int idx = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
                        
                        return cursor.getString(idx);
                    } catch (Exception e) {
                    } finally {
                        cursor.close();
                    }
                }
            }
        }
        return null;
    }

到了这里,关于【Android 11/12】 通过Uri获取绝对路径的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高通 Android 12/13获取IMIE号

    1、由于我们工厂smt需要显示imei号,因此需要 2、查阅相关资料Android O(之后)Android 10之后进行限制  3、通过反射获取 imei号  4、通过 TelephonyManager 中getImei()方法获取 5、结果 获取imei号 如下图所示     6、到这里基本结束了,转载请注明出处,谢谢 7、记得添加系统权限 否则

    2024年02月11日
    浏览(43)
  • Android12以上获取设备网络信号数据

    公司有很多物联网设备,关键的信号参数是RSRP,总有些地方信号差,不适合安装。所以让开发一款测信号的app,用于现场的同事在判定是否符合设备信号条件,再考虑安装设备。 由于与开发过程中使用的是Android sdk33,版本太高,网上搜到的很多旧的方法已经弃用,用起来也

    2024年01月17日
    浏览(41)
  • Android 两种方获取U盘的挂载路径

    Android 两种方获取U盘的挂载路径 第一种

    2024年02月14日
    浏览(51)
  • 关于Android 11、12和13服务保活问题

    物联网环境,为了解决不同厂商、不同设备、不同网络情况下使用顺畅,同时也考虑到节约成本,缩小应用体积的好处,我们需要一个服务应用一直存在系统中,保活它以提供服务给其他客户端调用。 开机自启动,通过广播通信, 必要权限 开机自启动Service相关代码 注意

    2023年04月08日
    浏览(83)
  • android 手机获取root权限(刷入magisk面具方式)_获取刷入模块_MIUI_android7/android12实践

    Magisk安装教程 - Magisk中文网 (magiskcn.com) android12: How to Root Xiaomi Redmi Note 11T Pro / 11T Pro+ using Magisk without TWRP (getdroidtips.com) 视频教程 ★ bigstar ★ 玩机必看!带你入坑安卓刷机,小白也能看懂的ROOT基础指南来啦!_哔哩哔哩_bilibili 将前面列出的参考都看一遍 最好把文章结尾的基

    2024年02月06日
    浏览(89)
  • Android 12 Wifi 开发(获取列表、连接、断开连接)

    获取Wifi列表: 扫描(这个方法早在Android 9.0 就被弃用), 不过如果不调用的话是没法及时获取Wifi列表的广播的。 (不需要也能正常获取,没有延迟,经实验毫无区别) 创建广播并接收: 配置并连接( 无系统签名 ): 配置并连接( 有系统签名 ): 断开连接(无系统签名

    2024年02月03日
    浏览(34)
  • Android12 获取音频输出列表&设置音频输出通道

    有个需求是APP端能够获取所有音频输出列表,研究了很长时间源码,发现只有这个API合适。 这个API能够获取到设备上所有可用的输出,且APP可以调用。 需要在framework层修改,找一个Manager或者自己写一个Manager,添加以下API方法。

    2024年02月16日
    浏览(62)
  • 记录问题: servlet获取项目包绝对路径

    【2023-8-8 23:46:27 星期二】 如何获取在webapp下的路径?而不是target包下的webapp目录 比如这里应该获取到 F:TiamDesktopfreemarkerfreemarker-demo01srcmainwebapp 而 readPath 总是获取到 F:TiamDesktopfreemarkerfreemarker-demo01targetfreemarker-demo01 百度搜了一堆方法都是获取target包下的路径, 哪里出

    2024年02月14日
    浏览(43)
  • Android文件选择器 路径选择 支持安卓4.4 ~ 13 支持Android/data目录访问 支持SD卡 适配Android11

    Android上进行文件选择或操作的第三方库,自动申请存储权限,支持 Android4.4 ~ 13,再也不用为了适配各种版本而苦恼了,快速集成,一句代码搞定,完善的文档,支持无root权限访问和操作Android/data和Android/obb目录(适配Android 13),支持SD卡,高度自定义UI满足你的所有需求,使用非常

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包