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
    }

修改: 来自来源的一些信息:(https://android.googlesource.com/platform/packages/providers/MediaProvider/+blame/refs/tags/android-11.0.0_r3/src/com/android/providers/media/MediaProvider.java#5610

从源头上看,如果播放列表项的数量大于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;
            }
}
 

此处使用索引来清除播放列表:(https://android.googlesource.com/platform/packages/providers/MediaProvider/+blame/refs/tags/android-11.0.0_r3/src/com/android/providers/media/MediaProvider.java#5566

 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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...