前言:Android系统通过FileDialog选择文件返回的文件URL和PC上不同,如我选择了Download文件夹的一个21929410_Offset Image0文件,返回的URL路径确是:content://com.android.externalstorage.documents/document/primary%3ADownload%2F21929410_Offset Image0。这是因为从Android5.0之后引入了Storage Access Framework (SAF)
,该框架允许用户在应用间共享文件,且提供了一个统一的方式来访问设备的文件系统。为了保护用户隐私和数据安全,应用不能直接访问设备的文件路径。
解决办法:QT并不提供将转换这种URL的功能,只能使用Java那边转换,有两个点需要注意下
1.通过FileDialog打开文件管理器后,"最近","图片","视频”,这些是属于Android自身的内容提供者(Content Providers)来管理和封装不同类型的文件存储。比如从"下载内容"里访问某个文件获取到的URL和直接从Download文件夹下访问这个文件返回的URL是不同的。在转换路径时注意判断各种情况。
2. 在Android10及之后的版本中,文件的隐私性做了进一步提升,从"下载内容"访问文件,返回的URL路径做了进一步“加密”。比如我访问了"下载内容"下的21929410_Offset Image0文件,返回的URL路径确是content://com.android.providers.downloads.documents/document/msf%3A43979。这时已经没办法再转换成本地路径了,通过QFile直接读取这个URL也读取不到,我这里的解决办法是暂时把这个文件拷贝到了本地的沙盒目录下,并返回这个文件的路径进行访问。
以下为路径转换代码
public static String getPathFromUri(Context context, Uri uri) {
St