如何通过Content URI从云向应用下载文件?及Intent实现云Zip文件下载
实现云存储Zip文件下载到应用的Intent方案
嘿,看你已经搞定了通过系统文件浏览器选择云存储文件的部分,接下来要把选中的Zip文件下载到自己应用里对吧?我给你梳理下具体的步骤和代码调整,直接能用的那种:
1. 处理Intent返回的文件Uri
首先,用户选择完文件后,你得在OnActivityResult方法里接住返回的文件Uri——这是系统给你的访问入口,不是本地路径哦。代码可以这么写:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); // 确认用户成功选择了文件 if (resultCode == Result.Ok && data != null) { var cloudFileUri = data.Data; // 调用下载方法处理这个Uri DownloadZipToAppStorage(cloudFileUri); } }
2. 把云存储文件写入应用私有目录
拿到Uri后,我们用ContentResolver来读取云存储里的文件内容,然后写入到应用的私有存储目录(这个目录只有你的应用能访问,安全又不需要额外权限)。这里要注意大文件的话别卡UI线程,我给你写了异步版本:
private async void DownloadZipToAppStorage(Android.Net.Uri fileUri) { try { // 把耗时操作丢到后台线程,避免UI卡顿 await Task.Run(() => { using (var inputStream = ContentResolver.OpenInputStream(fileUri)) { // 定义目标路径:应用私有files文件夹下的downloaded.zip var targetFilePath = Path.Combine(FilesDir.AbsolutePath, "downloaded.zip"); // 写入文件 using (var outputStream = new FileStream(targetFilePath, FileMode.Create)) { inputStream.CopyTo(outputStream); } } }); // 回到UI线程提示用户 RunOnUiThread(() => Toast.MakeText(this, "Zip文件已成功下载到应用!", ToastLength.Short).Show()); } catch (Exception ex) { RunOnUiThread(() => Toast.MakeText(this, $"下载出错:{ex.Message}", ToastLength.Long).Show()); } }
3. 几个关键注意点
- 权限问题:从Android 10开始,用
ACTION_GET_CONTENT获取的Uri,通过ContentResolver访问不需要额外的存储权限,系统已经给了临时访问权限;如果要写到外部公共目录才需要WRITE_EXTERNAL_STORAGE,但非常不建议这么做,私有目录更安全。 - 大文件处理:上面的代码用了
Task.Run把下载逻辑放到后台,避免阻塞UI导致ANR(应用无响应),这是必须的哦。 - Uri有效期:如果需要长期访问这个云文件,你可以调用
ContentResolver.TakePersistableUriPermission来获取持久权限,不然重启应用后Uri就失效了。
内容的提问来源于stack exchange,提问作者Lamarti Rémi
相关产品推荐
相关产品推荐

