【问题标题】:How to edit already present file in SD CARD using SAF(storage access framework)?如何使用 SAF(存储访问框架)编辑 SD CARD 中已经存在的文件?
【发布时间】:2016-10-12 02:05:34
【问题描述】:

我有一个疑问,我阅读这些教程只是为了清楚地了解更高版本的 android How to use the new SD card access API presented for Android 5.0 (Lollipop)?kitkat 中引入的 SAF

How to persist permission in android API 19 (KitKat)?

Android API below 19 equivalent for ContentResolver takePersistableUriPermission

Android Gallery on KitKat returns different Uri for Intent.ACTION_GET_CONTENT

现在我有一个问题,当意图被触发时,我选择了 sd 卡以从我得到的意图中获取 uritree,但是根树是我必须遍历 uri 以获取特定文件 uri . 现在的问题是我的手机中有 mp3 文件,我想编辑选择的特定文件,那么如何从树中获取选定的文件 uri 并进行编辑?我尝试直接使用文件进行编辑,但它使我的 mp3 文件消失,我不想再次触发 SAF 意图 n 那么如何检查用户是否已授予 sd 卡的权限? 附言我正在使用 jaudio tagger 来编辑 mp3 文件的标签。 谢谢!! 我已经得到了这个问题中几乎所有内容的答案现在的问题是,如果我使用 jaudio 标记库来标记将 File 作为对象但 android 4.4 及更高版本不会让你修改 File 对象的 mp3 文件,所以我只想知道替代方法我可以在上面的 4.4 中编辑 File 对象吗?

【问题讨论】:

  • AFAIK jaudio tagger 不接受 documentFile 对象。 “我尝试使用文件直接编辑”是什么意思? File 对象无法编辑可移动存储中的文档。
  • 我的意思是这样它会更改标签,但首先它会消失,当我重新启动手机时,它会显示在我的手机中。音频文件 f = AudioFileIO.read(testFile);标记标记 = f.getTag(); tag.setField(FieldKey.ARTIST,"莱昂之王"); f.commit();
  • Reyansh,你有没有搞清楚这件事的真相?我同时使用 jaudiotagger(用于 flac)和 jid3(用于 mp3)面临同样的问题我知道 jid3 在最终同步(写入)mp3 之前实际上创建了一个临时文件。此过程将在外部 sdcard 上失败。
  • 是的,我知道了,一旦我完成了正确的代码,我会回答它。就像您需要将外部 sd 卡文件复制到内部存储中,然后对其进行编辑并再次将其放置在您需要稍微处理 DocumentFile 的位置。如果您只想阅读其背后的逻辑,请查看github.com/timusus/Shuttle/tree/dev/app/src/main/java/com/…

标签: android performance android-permissions user-permissions


【解决方案1】:

我就是这样做的, 首先将文件从 sdcard 复制到手机内存,然后进行所需的更改,然后将文件剪切并再次粘贴到原始位置。 示例在这里,我正在编辑 sdcard 中的 mp3 文件的标签:-

https://github.com/reyanshmishra/Rey-MusicPlayer/tree/master/app/src/main/java/com/boom/music/player/TagEditor

【讨论】:

    【解决方案2】:

    您引用的库称为JaudioTagger,它不接受并且很可能永远不会接受DocumentFile存储访问框架是 Google 的发明,远非任何标准。而且 JaaudioTagger 是为便携性而编写的。

    然而,我终于设法让 JaudioTagger 主要使用 SAF 运行,但不得不对其进行大幅修改,甚至重写一些函数。基本上我用我自己的类替换了所有 FileRandomAccessFile,另外临时文件的处理和重命名必须重写(例如方案:复制原始文件,更改副本,删除原始文件,将副本重命名为原始名称)。

    事实上,使用原生 TagLib 可能更容易,因为它已经接受了一个特殊的 C++ 类作为输入。我所做的只是创建这样一个 C++ 类,它的基础是从 ParcelFileDescriptor 派生的文件描述符,该文件描述符从 DocumentFile 派生的 Uri 派生。

    最后可能会得出这样的结论:存储访问框架有些欠佳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-20
      • 2020-11-25
      • 2015-09-28
      • 2016-08-01
      • 2014-05-07
      • 2016-12-27
      • 2015-06-28
      • 1970-01-01
      相关资源
      最近更新 更多