如何使用存储访问框架(SAF)编辑SD卡中已有的文件?

4

我有一个疑问,我阅读这些教程只是为了更清楚地了解在安卓的较高版本中引入的SAF。如何使用Android 5.0(棒棒糖)中提供的新SD卡访问API?

如何在Android API 19(KitKat)中保持权限?

Android API 19以下的ContentResolver.takePersistableUriPermission等效功能

安卓4.4的图库返回不同的Uri给Intent.ACTION_GET_CONTENT

现在我有一个问题,当意图被触发并选择SD卡以从意图获取uritree时,我正在获取,但是根树需要迭代通过uri来获取特定的文件uri。现在的问题是我手机里有MP3文件,我想编辑所选的那个特定文件,所以我怎么能从树中获取所选文件的uri并进行编辑呢?我尝试直接使用文件进行编辑,但它会使我的mp3文件消失,我不想再次触发SAF意图,所以如何检查用户是否已经授予SD卡权限?请注意,我正在使用jAudio Tagger来编辑mp3文件的标签。

谢谢!!我已经得到了这个问题的几乎所有答案。现在的问题是,如果我要使用jAudio Tagger库标记MP3文件,因为安卓4.4及以上版本不允许您修改File对象,所以我只想知道替代方法,如何在4.4以上版本中编辑File对象?


据我所知,jaudio标记器不接受 documentFile 对象。您说的“我尝试使用文件直接进行编辑”是什么意思?可移动存储中的文档无法通过 File 对象进行编辑。 - Malith Lakshan
我是说像这样,它改变了标签,但首先会消失,然后当我重新启动手机时,它会显示在我的手机上。 AudioFile f = AudioFileIO.read(testFile); Tag tag = f.getTag(); tag.setField(FieldKey.ARTIST,"Kings of Leon"); f.commit(); - Reyansh Mishra
Reyansh,你解决了这个问题吗?我使用jaudiotagger(用于flac)和jid3(用于mp3)都遇到了同样的问题。我知道jid3在最终同步(写入)mp3之前实际上会创建一个临时文件。这个过程将在外部sd卡上失败。 - Theo
是的,我明白了,一旦我完成了正确的代码,我就会回答它。这就像你需要将外部SD卡文件复制到内部存储器中,然后编辑它并再次放置在原处,你需要稍微处理一下DocumentFile。如果你只想阅读其背后的逻辑,请查看https://github.com/timusus/Shuttle/tree/dev/app/src/main/java/com/simplecity/amp_library/tagger - Reyansh Mishra
2个回答

1

0
你所提到的库被称为JaudioTagger,它不支持DocumentFile,而且很可能也永远不会支持。 Storage Access Framework是Google的发明,远非任何标准。而且JaudioTagger是为了可移植性而编写的。
然而,我最终设法让JaudioTagger在SAF上运行,但不得不大量修改它,甚至重写一些功能。基本上我用自己的类替换了所有的FileRandomAccessFile,并且必须重写临时文件和重命名的处理方式(例如方案:复制原始文件,更改副本,删除原始文件,将副本重命名为原始名称)。
事实上,使用原生的TagLib可能更容易,因为它已经接受特殊的C++类作为输入。我所做的就是创建这样的C++类,其基础是从ParcelFileDescriptor派生的文件描述符,派生自Uri,派生自DocumentFile。
最后,人们可能会得出结论,存储访问框架有点不太优秀。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接