我有使用大量 c++ 本机代码的 android 应用程序。应用程序需要处理位于 sdcard 上的文件(读取、创建、附加)。但是 Kitkat+ 拒绝为 3rd 方应用程序写入 sdcard。Android 5 引入了新的 API,再次允许这样做。
如何使用为 Android 5.0 (Lollipop) 提供的新 SD 卡访问 API?
我发现的所有示例和文档主要用于 Java 方面。本机代码的示例不存在或非常不清楚。所以我想问几个问题。
上面的链接包含有价值的示例如何获取可以返回 ParcelFileDescriptor 的 DocumentFile。从这个对象我能够接收本机文件描述符 - ParcelFileDescriptor.getFd()。这是我通过 jni 发送到 c++ 代码的整数。
在 c++ 中,我使用 fdopen(fd) 打开文件。
我的问题是:
- fdopen 函数是如何使用新 api 打开文件的正确方法吗?或者 DocumentFile 已经打开了文件,我应该只在进一步的操作中使用 fd 。
- 使用 fclose 关闭本机代码中的文件描述符就足够了吗?或者我应该使用 ParcelFileDescriptor.detachFd() 在 java 端关闭它。或两者。
谢谢
编辑:我 getFD 和 detachFD 工作。但我从来没有找到答案如何正确替换 ftruncate,它也需要写访问权限,而且我没有找到像输入一样接受文件描述符的 ftruncate 版本