Android 10下使用FilePicker报“Input string was not in a correct format”错误求助
解决CrossFilePicker在Android 10上的“Input string was not in a correct format”异常
你遇到的这个异常,本质是旧版本的Plugin.FilePicker没有适配Android 10引入的Scoped Storage机制,导致解析文件URI时出现了整数格式转换错误。具体来说,插件内置的IOUtil.GetPath方法尝试把URI中的某段字符串解析成Int64,但这段字符串并非有效数字,最终抛出了格式异常。
下面是几个可行的解决方案:
1. 升级到最新版FilePicker插件
旧版本插件对Android 10+的URI处理存在bug,优先尝试升级到最新稳定版:
- 在NuGet包管理器中搜索
Plugin.FilePicker,直接更新到最新版本 - 或者通过命令行安装:
Install-Package Plugin.FilePicker -Version <最新版本号>
新版本已经修复了Scoped Storage环境下的URI解析问题,大部分情况升级后就能解决异常。
2. 启用Legacy Storage兼容(临时过渡方案)
如果暂时不想升级插件,或者升级后仍有问题,可以在AndroidManifest.xml中添加属性,让App在Android 10上绕过Scoped Storage限制,使用旧的文件访问逻辑:
<application android:requestLegacyExternalStorage="true" ...> ... </application>
注意:这个方案在Android 11及以上系统中会被忽略,长期来看还是建议升级插件适配Scoped Storage。
3. 手动处理文件流(绕过路径解析)
如果上述方案都不适用,可以直接通过插件提供的文件流操作文件,完全绕过路径解析逻辑:
FileData fileData = await CrossFilePicker.Current.PickFile(); if (fileData != null) { // 直接使用文件流,不依赖路径 using (var sourceStream = fileData.GetStream()) { // 将文件复制到App私有目录,方便后续操作 var targetFilePath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), fileData.FileName ); using (var targetStream = File.Create(targetFilePath)) { await sourceStream.CopyToAsync(targetStream); } // 后续直接使用targetFilePath即可 } }
这种方式从根源上避免了URI解析的问题,也符合Android 10+的存储规范。
内容的提问来源于stack exchange,提问作者sahithi
相关产品推荐
相关产品推荐

