Flutter:如何读取应用目录外文件并处理content路径读取异常
处理iOS和Android端通过uni_links获取文件路径的问题
Android端处理content:// URI
content:// 是Android的内容URI,并非直接的文件系统路径,直接用File类读取会抛出FileNotFoundException,需通过ContentResolver处理:
转换为可访问的临时文件
通过Android原生ContentResolver打开URI对应的输入流,将文件复制到应用缓存目录,再使用缓存文件的路径操作PDF:// Android原生Kotlin代码(通过Method Channel给Flutter调用) fun getAccessibleFile(context: Context, uri: Uri): File? { val inputStream = context.contentResolver.openInputStream(uri) ?: return null val tempFile = File(context.cacheDir, "temp_${System.currentTimeMillis()}.pdf") inputStream.use { input -> tempFile.outputStream().use { output -> input.copyTo(output) } } return tempFile }Flutter端通过Method Channel调用该方法,拿到临时文件的绝对路径后即可正常读取。
直接使用输入流处理
若无需文件路径,可直接读取输入流处理PDF内容,避免复制文件的开销。
iOS端处理文件URI
iOS通过"Open In"传递的文件通常以file://开头的URI返回,处理方式如下:
转换为本地文件路径
去掉file://前缀,直接获取文件系统路径:String? handleIOSFileUri(String uri) { if (uri.startsWith("file://")) { return uri.replaceFirst("file://", ""); } return null; }得到路径后即可创建
File对象操作,注意iOS沙箱机制,通过"Open In"接收的文件会存放在应用的Documents/Inbox目录下,应用拥有该目录的访问权限。权限安全处理
若遇文件访问权限问题,可使用NSFileCoordinator(原生iOS代码)协调文件访问:// iOS原生Swift代码 func getAccessibleFilePath(from uri: URL) -> String? { var filePath: String? let fileCoordinator = NSFileCoordinator() fileCoordinator.coordinate(readingItemAt: uri, options: .withoutChanges, error: nil) { newUrl in filePath = newUrl.path } return filePath }
内容的提问来源于stack exchange,提问作者Patryk Brejdak
相关产品推荐
相关产品推荐

