Java 手动将歌曲作为音乐曲目添加到Mediastore

Java 手动将歌曲作为音乐曲目添加到Mediastore,java,android,android-mediascanner,Java,Android,Android Mediascanner,我想创建一个音乐播放器,可以在线下载歌曲并将其添加到MediaStore。我正在使用下载管理器,并允许MediaScanner在下载完成时扫描此文件 DownloadManager.Request request .... request.allowScanningByMediaScanner(); ... downloadManager.enqueue(request); 在安卓5.0及以上版本中工作正常。 但是这首歌是使用codec()下载的,android lollipop版本不支持co

我想创建一个音乐播放器,可以在线下载歌曲并将其添加到MediaStore。我正在使用下载管理器,并允许MediaScanner在下载完成时扫描此文件

DownloadManager.Request request ....
request.allowScanningByMediaScanner();
...
downloadManager.enqueue(request);
在安卓5.0及以上版本中工作正常。
但是这首歌是使用codec()下载的,android lollipop版本不支持codec(),因此MediaScanner不会将此文件添加到MediaStore

这是我的问题,我的应用程序可以播放opus编解码器,但歌曲下载后在MediaStore中不存在,因此我的应用程序找不到这首歌曲

如何强制MediaScanner将下载的文件添加到MediaStore.Audio作为音乐曲目。如果不能,我如何将此歌曲手动添加到MediaStore。下载完成后的音频:

public class BroadcastDownloadComplete extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.DOWNLOAD_COMPLETE")) {

            //addSongToMediaStore(intent);
        }
    }
}
您可以使用来请求Android扫描要作为媒体包含的文件。您需要使用静态方法。

从源代码中,我们可以看到扫描仪的最终实现有两个步骤来扫描音频文件。如果这两个步骤中的任何一个失败,音频文件将不会插入媒体提供程序

步骤1检查文件扩展名

static bool FileHasAcceptableExtension(const char *extension) {
    static const char *kValidExtensions[] = {
        ".mp3", ".mp4", ".m4a", ".3gp", ".3gpp", ".3g2", ".3gpp2",
        ".mpeg", ".ogg", ".mid", ".smf", ".imy", ".wma", ".aac",
        ".wav", ".amr", ".midi", ".xmf", ".rtttl", ".rtx", ".ota",
        ".mkv", ".mka", ".webm", ".ts", ".fl", ".flac", ".mxmf",
        ".avi", ".mpeg", ".mpg"
    };
    static const size_t kNumValidExtensions =
         sizeof(kValidExtensions) / sizeof(kValidExtensions[0]);
    for (size_t i = 0; i < kNumValidExtensions; ++i) {
        if (!strcasecmp(extension, kValidExtensions[i])) {
            return true;
        }
    }
    return false;
}
对于5.0之前的Android版本,扫描仪可能在此步骤失败。由于缺少内置的opus编解码器支持,
setDataSource
最终将失败。媒体文件最终不会添加到媒体提供商

建议的解决方案

因为我们知道音频文件将被添加到

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
我们可以手动操作数据库。如果希望音频文件与数据库中的其他音频文件保持一致,则必须自己检索所有元数据。因为可以播放opus文件,所以我认为检索元数据很容易

// retrieve more metadata, duration etc.
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Audio.AudioColumns.DATA, "/mnt/sdcard/Music/example.opus");
contentValues.put(MediaStore.Audio.AudioColumns.TITLE, "Example track");
contentValues.put(MediaStore.Audio.AudioColumns.DISPLAY_NAME, "example");
// more columns should be filled from here
Uri uri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, contentValues);
Log.d(TAG, uri.toString());
之后,你的应用程序可以找到音频文件

getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI...

谢谢这帮我找到了为什么我所有转码到opus的音频文件都没有出现在音乐应用程序中。。。
getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI...