java - 如何从 Android 应用程序的音乐库中排除声音 fragment

标签 java android

自 2016 年 5 月以来,我在 Play 商店中就有了一个 Android 音乐应用程序。目前我要求用户指定一个包含他们所有音乐的文件夹。

我使用以下代码过滤他们文件夹中的音乐文件:

private boolean isAudioFile(String songTitleLowerCase) {
    return songTitleLowerCase.endsWith(".mp3") || songTitleLowerCase.endsWith(".wma") || songTitleLowerCase.endsWith(".wav") || songTitleLowerCase.endsWith(".m4a") || songTitleLowerCase.endsWith("" +
            ".flac");
    }

我还有其他代码可以搜索所有子文件夹。

这工作正常,但有一些限制:

  1. 大多数用户可能无法找到他们所在的文件夹 音乐被存储。我在应用程序中有一些关于常见的提示 手机保存音乐文件夹的位置,但在所有手机之间 手机型号,以及所有的Android版本,他们有很多 可能性。

  2. 如果用户有两个或更多包含音乐的文件夹,那么他们要么必须合并他们的音乐,要么只能通过我的应用访问他们的部分音乐 Collection 。我还没有实现多个音乐文件夹选择的代码。

我认为大多数应用程序会自动查找设备上的所有音乐文件,我想这样做。之前我实现了这个功能,问题是我最终得到了所有声音文件(即来自 Google map ),以及播客和有声读物。

那么我怎样才能排除声音 fragment 、播客和有声读物呢?我只是通过我选择包含在上面截断的代码中的扩展来做到这一点吗?我真的不确定现在哪些文件格式对音乐听众很重要,哪些文件格式只适用于声音和播客,或者是否有重叠使用。 IE。 .wav 文件是用于音乐文件还是仅用于声音剪辑?

感谢您对我的问题的耐心和理解。非常感谢您的反馈,因为一旦我的应用能够自动准确地找到所有音乐,它将有助于使我的应用更加用户友好。

最佳答案

由于问题的性质,没有明确的答案:我可以使用一些带有背景音乐的高质量设备录制与典型歌曲大致相同持续时间的语音,但无法确定类型音频文件(你确定我不是在唱歌?)。如果您仅根据持续时间或大小过滤文件,请记住,您会让很多 Dream Theater 粉丝非常生气。

因此,首先,扩展是不可靠的。使用类似 mime-util 的东西使用扩展名和/或魔数(Magic Number)提取格式(由于网站离线并且库似乎不再积极开发,请参阅 this SO question 了解使用说明)。我不确定 MediaMetadataRetriever 的记录是什么在这方面,但我想你可以试试。您还可以获得类似 Apache Tika 的内容但对于您的需求来说它似乎很重。

接下来,筛选出正确的文件。任何带有 MIME audio/* 的内容都是安全的选择。您可能需要将特定的 application/* 类型列入白名单,但我知道的唯一一种是 application/ogg 甚至在那种情况下 audio/ogg 是首选。为了避免常见的非音乐格式,黑名单audio/audible, audio/vnd.audible.aax, audio/x-pn-audibleaudio(即 .aa、.aax 和类似的有声读物格式)、audio/aacaudio/3gp。更多想法咨询Wikipedia .

这是不太可靠的部分。你可以假设任何低于 30 岁的东西都不应该是音乐(即使对于金属核来说这听起来也太短了)。对于太长的文件,可以假设类似的情况:只要确保您选择一个合理的值,例如 90 分钟左右(不,15 分钟不合理。而且我什至不听 Dream Theater)。

还有更多:您可能希望您心爱的用户好心地为他/她的文件设置元数据。使用 MediaMetadataRetriever检查是否存在诸如 Album、AlbumArtist、Genre 等值。还要检查比特率 - 任何超过 80 的都可以作为音乐。

其中最不可靠的是:检查大小/持续时间比率。同样,MediaMetadataRetriever 是您的 friend 。这需要大量测试,但我可以从我的 Collection 中告诉你,当存储为质量 4 ogg 文件时,平均 4-4.5 分钟的歌曲略小于 4MB,但在 320kbps mp3 中可以增长到 15MB。请务必检查类型 - 无损格式(如 flac 或 wav)要大得多,因此 5 分钟的 flac 歌曲大约需要 40MB。但是,您对上限不感兴趣,因为录音通常质量较低,因此,如果大小(以 MB 为单位)/持续时间(以分钟为单位)< 0.5(0.7 也可能有效),那绝对是不是音乐。

暂时就想到这些了。我的电脑上有很多不同的歌曲格式和文件时长(但不是有声读物或录音),所以我想如果你需要的话,我可以给你一些更具体的数字。

注意:我假设在一般情况下您需要从非歌曲中过滤掉歌曲。如果您打算使用 Android 的媒体播放器播放它们,则无需为每一种过时的音频格式而烦恼:check which types Android supports并据此过滤。

附言如果您正在研究肯定会破坏您用于过滤的任何理智方式的示例,just look into prog genres (ambient works too)。

关于java - 如何从 Android 应用程序的音乐库中排除声音 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41888518/

相关文章:

java - 如何使用JAVA执行psexec的cmd行并在一行中登录到文本文件?

java - 使用java的nextprobableprime()获取previousprobableprime

android - 如何修复 "Gradle 5.4 requires Java 8 or later to run. Your build is currently configured to use Java 7"

Android:如何获取当前的前台 Activity (来自服务)?

javascript - 使用javascript自动打开短信?

java - 在 Android 中映射 XML 属性和代码方法

java - 从按钮数组中返回选择

java - 访问@Id 时出现 LazyInitializationException

Java : Components position

android - 上传图像并在 UI 上显示结果 : AsyncTask or Service?