ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.getPath()与游标之间的区别在于从Android中的uri获取文件的真实路径

2019-09-29 16:24:52  阅读:763  来源: 互联网

标签:android


这个问题的主要思想与标题相同 – 当你从Android中的uri获得文件的真实路径时,.getPath()与游标的区别是什么?

如果您没有通过使用光标得到我的意思,示例就在这里.

private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else { 
        cursor.moveToFirst(); 
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

两种最常见的方式是这两种方式,但使用光标似乎有点过于复杂,而使用一个简单的方法.getPath()可以获得相同的结果.所以,我认为在某些情况下我必须使用光标的原因,但我无法得到它.

你能解释一下它会是什么吗?

解决方法:

what is the difference between .getPath() vs cursor, when you get the real path of a file from uri in Android?

Uri不是文件.没有“真正的道路”.

如果Uri的方案是文件,那么它表示文件系统上的文件,理论上,您的应用程序应该能够访问该文件.使用getPath()获取文件系统路径.

如果该方案是其他任何方式,它不一定代表您的应用程序可以访问的文件系统上的文件.例如,如果方案是http或https,则Uri表示将从Web服务器下载的内容.

如果方案是内容,则由ContentProvider支持.使用ContentResolver和openInputStream()在Uri标识的内容上获取InputStream.

如果该方案是内容并且您从MediaStore专门获得了Uri,那么也许您的Cursor方法将为您提供一条路径.它也可能会给你null,并且你可能无法访问你获得的路径(仅仅因为系统的MediaStore可以索引文件并不意味着你的应用程序可以访问同一个文件).因此,这种技术是不可靠的,不应该使用.

但是,除此之外,您无法对用于支持该内容Uri的数据做出任何假设.它可能是:

>外部存储上的本地文件
>其他应用程序的内部存储上的本地文件(例如,由FileProvider提供)
>可移动存储上的本地文件
>加密的本地文件,需要由ContentProvider即时解密
>数据库中BLOB列中保存的字节流,需要由ContentProvider提供
>首先需要由其他应用下载的内容(例如,Dropbox)
> ……等等

所以,回顾一下:Uri不是文件.没有“真正的道路”.

标签:android
来源: https://codeday.me/bug/20190929/1832388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有