【问题标题】:insert song to playlist returns null将歌曲插入播放列表返回 null
【发布时间】:2014-01-06 03:23:35
【问题描述】:

我正在尝试构建一个音乐播放器应用程序,我想添加一个功能以便将歌曲添加到播放列表中。代码如下:

public static void addToPlaylist(ContentResolver resolver,SongDetails songDetails,int  playlistId) {
    String[] cols = new String[] {
            "count(*)"
    };
    Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
    Cursor cur = resolver.query(uri, cols, null, null, null);
    cur.moveToFirst();
    final int base = cur.getInt(0);
    cur.close();
    ContentValues values = new ContentValues();

    values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(base +   songDetails.getId()));
    values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, songDetails.getId());
    values.put(MediaStore.Audio.Playlists.Members.DISPLAY_NAME, songDetails.getSongTitle());
    values.put(MediaStore.Audio.Playlists.Members.ARTIST, songDetails.getArtistName());
    values.put(MediaStore.Audio.Playlists.Members.DATA, songDetails.getSongData());

    Log.i("URI:",resolver.insert(uri, values)+"");
}

在日志中我总是得到:

URI: null

这意味着这首歌没有添加到播放列表中。有人知道为什么没有添加这首歌吗?

【问题讨论】:

  • 你不想在PLAY_ORDER中加入base + 1吗?
  • 它也返回了 null
  • 你在哪里设置 songDetails id
  • 我在调用此代码的活动中设置了它,就在使用此代码之前。
  • 所以,你是说有必填字段,是什么?!

标签: java android playlist mediastore


【解决方案1】:

我一直在使用这种方法,它对我有用。

 public static String addTracksToPlaylist(final long id, List<MediaData> tracks, final Context context) {
    int count = getPlaylistSize(id, context);
    ContentValues[] values = new ContentValues[tracks.size()];
    for (int i = 0; i < tracks.size(); i++) {
        values[i] = new ContentValues();
        values[i].put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, i + count + 1);
        values[i].put(MediaStore.Audio.Playlists.Members.AUDIO_ID, tracks.get(i).getId());
    }
    Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", id);
    ContentResolver resolver = context.getContentResolver();
    int num = resolver.bulkInsert(uri, values);
    resolver.notifyChange(Uri.parse("content://media"), null);
    return String.format(context.getString(R.string.ADDED_TO_PLAYLIST), num, context.getString(R.string.CURRENT));
 }

从播放列表中检索曲目:

public static Cursor getTrackListFromPlaylist(Context context, long plid) {
        String[] MEDIA_COLUMNS = new String[] {
                MediaStore.Audio.Media.ARTIST,
                MediaStore.Audio.Media.ARTIST_ID,
                MediaStore.Audio.Media.TITLE,
                MediaStore.Audio.Playlists.Members.AUDIO_ID,
                MediaStore.Audio.Media.DURATION,
                MediaStore.Audio.Media.DATA,
                MINUTES + "||':'||" + SECONDS + " as " + FORMATTED_DURATION,
                MediaStore.Audio.Media.ALBUM_ID,
                MediaStore.Audio.Media.ALBUM,
                MediaStore.Audio.Media._ID
        };
        return query(context, MediaStore.Audio.Playlists.Members.getContentUri("external", plid),
                MEDIA_COLUMNS, null, null, MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER);
    }

【讨论】:

  • 如果我们说我们将使用这段代码,如果我们没有插入除了它的 id 之外的曲目名称,我们将如何检索给定当前播放列表的歌曲名称?
  • 好吧,在您插入音频的 id 的代码中,到目前为止一切都很好,但是您如何在不首先插入它们的情况下获取数据、标题和其他内容呢?跨度>
  • Afaik 当您将曲目的 ID 插入播放列表成员时,它们会自动绑定。无需将相同的数据保留两次。
  • 好吧,当我尝试通过上述方式插入歌曲时,当我记录生成的 URI 时,我得到 content://media/external/audio/playlists/3/members/70 但是,当我查询第二种方法获取曲目数量时,我得到了前一个数字,这表明没有任何变化。你知道为什么吗?
  • 我正在尝试在仅包含一首曲目的播放列表中添加一首曲目,每次我得到 1 的大小,如果它真的有效,它应该是 2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2011-09-17
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多