当尝试通过存储访问框架获取一个uri编辑音频文件时,如果用户从“音频”选项卡中进行选择,则得到java.lang.IllegalArgumentException: Media is read-only
。
SAF在将uri移至sdcard根目录以及从存储卷本身中选择文件方面非常有效。但是,从SAF Picker的“音频”选项卡中进行选择会返回一个只读uri。当前,我有一条消息告诉用户只能从卷本身中进行选择,但是我的报告显示他们仍然相当频繁地使用它。
这是我当前调用SAF选择器的方式:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("audio/mpeg");
startActivityForResult(intent, REQUEST_CODE_SAF_READ_FILE);
根据Android文档,在使用Intent.CATEGORY_OPENABLE
时,
所有选定的文档将通过持久的读写权限授予返回到调用应用程序...
-这就是为什么出现只读错误如此令人惊讶的原因。
我有什么办法可以获取适当的可写uri?我知道某些提供程序可以是只读的,但是由于它由文件支持,有没有办法我可以查询只读uri指向的媒体文件的存储量?
我可以从SAF公开的只读uri中获取显示名称和文件大小,但根据文档
...它称为“显示名称”。这是特定于提供程序的,不一定是文件名。
任何建议都值得赞赏。