一个众所周知的解决方案是获取文件描述符并使用“proc/self/fd/FD_NUMER”技巧,例如:
ParcelFileDescriptor mParcelFileDescriptor = null;
String getFileNameThatICanUseInNativeCode(Context context, DocumentFile doc) {
try {
Uri uri = doc.getUri();
mParcelFileDescriptor =
context.getContentResolver().openFileDescriptor(uri, "r");
if (mParcelFileDescriptor != null) {
int fd = mParcelFileDescriptor.getFd();
return "/proc/self/fd/" + fd;
}
}
catch (FileNotFoundException fne) {
return "";
}
}
// Don't forget to close mParcelFileDescriptor when done!
将此内容传递到本地的C/C++代码中可以正常工作,但仅当文件在手机主存储器中时。如果用户尝试打开插入到手机槽中的外部SD卡中的文件,则无法工作 - 以这种方式打开的文件没有读取权限。我只能获取文件描述符int编号并使用fdopen(fd)。但这将需要修改第三方库(开源或许可证)的源代码,并且每当这些库的原始源代码更新时都会带来很大的麻烦。
是否有更好的解决方法?不,我不想听添加
android:requestLegacyExternalStorage="true"
在AndroidManifest.xml的应用程序部分中进行设置 - Google威胁在2020年Android的下一个版本中禁用该功能,因此需要一个永久性解决方案。另一个简单但愚蠢的解决方案是将用户尝试打开的整个(可能很大)文件复制到私有应用程序目录中。这种方法既愚蠢又无用...