MediaStore.Audio.Playlists.Members.moveItem не работает

Я работаю с Android над приложением Media Player, когда создаю список воспроизведения в базе данных, а затем пытаюсь его изменить, например, удаляя песни из списка воспроизведения или перемещая песню в другое место (в приложении есть функция переупорядочения, перетаскивание) , это просто не работает. Я использую эти два кода для удаления и изменения порядка:

public boolean movePlaylistSong(int playlistId, int from, int to){
    try{
        return MediaStore.Audio.Playlists.Members.moveItem(context.getContentResolver(), playlistId, from, to);
    }catch(Exception e){
        Logger.e(TAG, e.getMessage());
    }
    return false;
}

public boolean removeFromPlaylist(int playlistId, int audioId) {
    try{
        ContentResolver resolver = context.getContentResolver();
        Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
        return resolver.delete(uri, MediaStore.Audio.Playlists.Members.AUDIO_ID +"=?", new String[]{String.valueOf(audioId)}) != 0;
    }catch(Exception e){
        e.printStackTrace();
    }
    return false;
}

Оба они возвращают true, что это было успешно, но при перезагрузке списка воспроизведения из базы данных (URI внешнего содержимого списков воспроизведения) он снова возвращает исходный без применения ИЗМЕНЕНИЙ. Он возвращает результат успеха, но на самом деле это не сработало.

Заранее спасибо.


person user1995726    schedule 11.08.2013    source источник
comment
MediaStore.Audio.Playlists.Members.moveItem у меня тоже не работает! Вы все еще работаете над этим?   -  person The Original Android    schedule 26.04.2015


Ответы (2)


Вызов moveItem изменит значение PLAY_ORDER, но вам нужно выполнить сортировку по PLAY_ORDER вашего курсора, чтобы увидеть изменение. В противном случае курсор будет сортироваться по _ID, который не редактируется.

Uri uriPlaylistTracks = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistID);
String sortOrder = MediaStore.Audio.Playlists.Members.PLAY_ORDER;
cursor = resolver.query(uriPlaylistTracks, STAR, null, null, sortOrder);

Чтобы изменить PLAY_ORDER, я сделал следующее:

//get the PLAY_ORDER values for song
cursor.moveToPosition(fromPosition);
int from = (int) cursor.getLong(cursor.getColumnIndex(Audio.Playlists.Members.PLAY_ORDER));
cursor.moveToPosition(toPosition); //position in list
int to = (int) cursor.getLong(cursor.getColumnIndex(Audio.Playlists.Members.PLAY_ORDER));
//update the PLAY_ORDER values using moveItem
boolean result = MediaStore.Audio.Playlists.Members.moveItem(resolver,
                playlistID, from, to);
//get new cursor with the updated PLAY_ORDERs
cursor = resolver.query(uriPlaylistTracks, STAR, null, null, sortOrder);
//change the cursor for a listview adapter
adapter.changeCursor(cursor);
adapter.notifyDataSetChanged();
person jtav    schedule 15.11.2013
comment
Я думаю, что ваш ответ полезен о sortOrder. Но метод MediaStore.Audio.Playlists.Members.moveItem не работает, вместо него необходимо использовать метод resolver.update. - person The Original Android; 26.04.2015
comment
Метод moveItem работал на устройствах, которые я тестировал до сих пор — я добавил в ответ некоторый код того, как я использую команду moveItem. Важно использовать в нем значения PLAY_ORDER. - person jtav; 17.05.2015
comment
Это не сработало для меня. Что было сделано, так это «MediaStore.Audio.Playlists.Members.moveItem(resolver, playlistID, fromPosition, toPosition);» Так что я думаю, вам не следует использовать значения Play_Order в moveItem(). - person Anjani; 11.03.2016

Борьба с той же проблемой. Ведет себя как успешно, но без изменений. Однако я заметил, что ваш playlistid имеет тип int, но в документации указано, что он длинный.

public static final boolean  moveItem (ContentResolver res, long playlistId, int from, int to) 

Я также нашел этот ответ на форуме Альтернатива MediaStore.Playlists.Members.moveItem

Я обнаружил, что он перемещает PLAY_ORDER, но не AUDIO_ID.

person Theo    schedule 29.09.2013