vainquit 2021-03-10 11:39 采纳率: 100%
浏览 67
已结题

android不能保存content uri,如何实现上传功能断点续传?

现在我想要实现一个从安卓上传文件到服务器的效果,具体流程是:用户点击上传按钮,就会激活ActivityResultContracts.GetContent,让用户选择SD卡上某个文件;被选中的文件会返回给我一个content uri;于是我将该uri保存下来,并用contentResolver.openInpustream来获取该文件的字节流,再写入到网络的outpustream去;若上传到一半手机重启了,那么下次再次运行程序时,我就重新用刚才保存下来的uri来打开字节流,继续上传……

听起来很美好,但问题在于,好像android不能持久保存content uri,我刚才保存那个uri是没有效果的,关机重启再用该uri打开字节流,会引发“java.lang.SecurityException: Permission Denial: opening provider com.android.externalstorage.ExternalStorageProvider from ProcessRecord{1771158d 10738:com.example.clouddisk/u0a186} (pid=10738, uid=10186) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS”。

搜了很多解决办法,例如takePersistableUriPermissions()是没有效果的,它只作用于openDocument等操作获取的uri,不适用于getConten获取的urit(https://commonsware.com/blog/2016/08/10/uri-access-lifetime-shorter-than-you-might-think.html)。按照这篇文章的说法,我想要得到content uri的持久连接,唯一的办法就是把external storage里的内容copy到internal storage里去。

 

到了这里我就十分困惑,怎么会有这么反人类的设计呢?但更重要的是,这样一来我该如何实现上传的断点续传功能?总不能让用户再选一次吧?

  • 写回答

2条回答 默认 最新

  • viewgroup 2021-03-10 13:40
    关注

    最好的办法是获取到具体的路径,最简单

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名