问题描述
在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 (将#修改为@)