使用 Android NDK 从字符串路径打开文件
Opening Files from a String Path with Android NDK
我最近一直在浏览 Android 文件访问文档,但我似乎无法弄清楚如何实际打开一个文件,该文件以包含文件路径的字符串给出喜欢开
我(最终)想要完成的是这样的:
- 用户使用 Intents 选择特定类型的文本文件,接收该文件的 URI。由此我推导出路径 (
getPath()
) 并将此字符串传递给本机 C++ 代码。
- 本机 C++ 从字符串打开文件,解析内容。
- 使用上述内容执行一些实际工作。
根据我目前的发现,似乎无法再以这种方式打开文件(至少从 SDK 版本 26 开始):
- 一个我知道存在的文件的硬编码路径给了我
permission denied
。
- 从
getPath()
收到的路径本身会触发 No such file or directory
错误。
一种解决方法是使用 ContentResolver
在 Java 端打开文件,然后将文件描述符传递给本机端。这行得通,但有问题:文件可以包含对要打开的其他文件的引用 ("include files"),因此这种解决方案的用途有限。
为了清楚起见,这些文件本地驻留在 Android 系统的 "USB" 分区上,与应用程序本身无关。不像 resources/assets APK 或其他此类问题似乎需要的类似内容。
总而言之,我想问题是这样的:如果给定应用程序 Java 端的路径,是否可以打开一个文件,以及它可能引用的任何其他文件?执行此操作是否有任何要求,例如请求对文件夹或类似内容的正确权限?
从 Android 6.0(API 级别 23)开始,您需要 request permissions every time your app starts for "dangerous actions",例如访问文件系统或读取联系人。链接的页面已经有一段代码,您可以复制。
在旧手机上,在清单中请求权限就足够了,但 target SDK version 最近升级到 8.0 (=26)。如果您想支持 6.0 之前的设备,Android 兼容性库将允许您调用相同的 API.
我最近一直在浏览 Android 文件访问文档,但我似乎无法弄清楚如何实际打开一个文件,该文件以包含文件路径的字符串给出喜欢开
我(最终)想要完成的是这样的:
- 用户使用 Intents 选择特定类型的文本文件,接收该文件的 URI。由此我推导出路径 (
getPath()
) 并将此字符串传递给本机 C++ 代码。 - 本机 C++ 从字符串打开文件,解析内容。
- 使用上述内容执行一些实际工作。
根据我目前的发现,似乎无法再以这种方式打开文件(至少从 SDK 版本 26 开始):
- 一个我知道存在的文件的硬编码路径给了我
permission denied
。 - 从
getPath()
收到的路径本身会触发No such file or directory
错误。
一种解决方法是使用 ContentResolver
在 Java 端打开文件,然后将文件描述符传递给本机端。这行得通,但有问题:文件可以包含对要打开的其他文件的引用 ("include files"),因此这种解决方案的用途有限。
为了清楚起见,这些文件本地驻留在 Android 系统的 "USB" 分区上,与应用程序本身无关。不像 resources/assets APK 或其他此类问题似乎需要的类似内容。
总而言之,我想问题是这样的:如果给定应用程序 Java 端的路径,是否可以打开一个文件,以及它可能引用的任何其他文件?执行此操作是否有任何要求,例如请求对文件夹或类似内容的正确权限?
从 Android 6.0(API 级别 23)开始,您需要 request permissions every time your app starts for "dangerous actions",例如访问文件系统或读取联系人。链接的页面已经有一段代码,您可以复制。
在旧手机上,在清单中请求权限就足够了,但 target SDK version 最近升级到 8.0 (=26)。如果您想支持 6.0 之前的设备,Android 兼容性库将允许您调用相同的 API.