首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >手册将歌曲添加到Mediastore作为音乐曲目

手册将歌曲添加到Mediastore作为音乐曲目
EN

Stack Overflow用户
提问于 2016-04-13 04:18:55
回答 2查看 2.3K关注 0票数 10

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

代码语言:javascript
复制
DownloadManager.Request request ....
request.allowScanningByMediaScanner();
...
downloadManager.enqueue(request);

它在Android5.0和更高版本中运行良好。

但是这首歌是用长篇下载的,在棒棒糖版本下安卓系统不支持它,所以MediaScanner不会将这个文件添加到MediaStore中。

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

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

代码语言:javascript
复制
public class BroadcastDownloadComplete extends BroadcastReceiver {

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

            //addSongToMediaStore(intent);
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-22 10:46:27

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

步骤1检查文件扩展名

代码语言:javascript
复制
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;
}

自从Android5.0之后,已经添加了更多的扩展。opus的常见容器是ogg,这个扩展在Android5.0之前就已经存在了。假设您的音频文件扩展名为ogg,这一步的扫描过程很好。

step2检索元数据

通过第一步后,扫描器需要检索媒体的元数据,以便稍后插入数据库。我认为扫描仪在这一步做了编解码器级别的检查。

代码语言:javascript
复制
sp<MediaMetadataRetriever> mRetriever(new MediaMetadataRetriever);
int fd = open(path, O_RDONLY | O_LARGEFILE);
status_t status;
if (fd < 0) {
    // couldn't open it locally, maybe the media server can?
    status = mRetriever->setDataSource(path);
} else {
    status = mRetriever->setDataSource(fd, 0, 0x7ffffffffffffffL);
    close(fd);
}
if (status) {
    return MEDIA_SCAN_RESULT_ERROR;
}

对于5.0之前的Android版本,扫描器在这一步可能会失败。由于缺乏内置的opus支持,setDataSource最终将失败.媒体文件最终不会添加到媒体提供者。

建议的解决方案

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

代码语言:javascript
复制
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

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

代码语言:javascript
复制
// 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());

之后,应用程序可以找到音频文件。

代码语言:javascript
复制
getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI...
票数 6
EN

Stack Overflow用户

发布于 2016-04-13 04:30:37

您可以使用MediaScannerConnection要求Android扫描要作为媒体包含的文件。您需要使用scanFile()静态方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36588495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档