如何解决Android 11-Mediastore播放列表从播放列表中删除多首曲目
在Android 11
上,当尝试从Playlist
删除多条曲目时,所有曲目将被删除,而不仅仅是选定的曲目。在Android 10
之前,它一直可以正常工作。
但是,如果仅删除1条轨道,则不会删除其他轨道。这是Android 11
以来的错误或预期行为吗?这是scoped storage
的副作用吗?
经过测试:Pixel 3,Android 11 Official release build
public void removeTracksFromPlaylist(long playlistId,String[] ids) {
Log.d(TAG,"removeTracksFromPlaylist() called with: playlistId = [" + playlistId + "],ids = [" + Arrays.toString(ids) + "]");
Uri uri = MediaStore.Audio.Playlists.Members.getContentUri(MediaStore.VOLUME_EXTERNAL,playlistId);
StringBuilder stringBuilder = new StringBuilder();
for (int index = 0; index < ids.length; index++) {
if (index > 0) {
stringBuilder.append(",");
}
stringBuilder.append("?");
}
String selection = MediaStore.Audio.Playlists.Members._ID + " IN (" + stringBuilder.toString() + ")";
contentResolver.delete(uri,selection,ids); // Returns count of all files removed from playlist
}
从源头上看,如果播放列表项的数量大于1,则会清除整个播放列表。
try (Cursor c = qb.query(helper,new String[] { Playlists.Members.PLAY_ORDER },queryArgs,null)) {
if ((c.getCount() == 1) && c.moveToFirst()) { // This condition fails if more than 1 item to delete
return c.getInt(0) - 1;
} else {
return -1;
}
}
private int removePlaylistMembers(@NonNull Uri playlistUri,@NonNull Bundle queryArgs)
throws FallbackException {
final int index = resolvePlaylistIndex(playlistUri,queryArgs);
try {
final File playlistFile = queryForDataFile(playlistUri,null);
final Playlist playlist = new Playlist();
playlist.read(playlistFile);
final int count;
if (index == -1) {
count = playlist.asList().size();
playlist.clear(); //Clears whole playlist
} else {
count = 1;
playlist.remove(index);
}
playlist.write(playlistFile);
resolvePlaylistMembers(playlistUri);
return count;
} catch (IOException e) {
throw new FallbackException("Failed to update playlist",e,android.os.Build.VERSION_CODES.R);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。