英文:
Adding songs to a playlist in Android Q (API29) and above throws a SecurityException
问题
由于Android Q(API 29)中的Android隐私更改,无法将歌曲添加到播放列表,当添加曲目时会抛出以下错误消息。
java.lang.SecurityException: com.mp3player.mp3player无法访问content://media/external_primary/audio/media/117
我知道我们可以将其捕获为RecoverableSecurityException
,并为每个文件单独授予许可。
但是这确实很麻烦,我想知道是否有另一种方法。
我已经找到了用户@Theo的一个帖子,完全相同的问题,但没有任何答案。
用于将歌曲添加到播放列表的代码
public void addToPlayList(Context c, long songID, long playListID, String playlistName) {
Uri playListUri = MediaStore.Audio.Playlists.Members.getContentUri("external", playListID);
String[] columns = {
MediaStore.Audio.Playlists.Members.AUDIO_ID,
MediaStore.Audio.Playlists.Members.PLAY_ORDER,
};
ContentResolver resolver = c.getContentResolver();
Cursor cursor = resolver.query(playListUri, columns, null, null, null);
int playOrder = 0;
if (cursor != null) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
playOrder = cursor.getInt(0) + 1;
}
cursor.close();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, songID);
contentValues.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, playOrder);
resolver.insert(playListUri, contentValues);
resolver.notifyChange(Uri.parse("content://media"), null);
}
编辑
看起来抛出的异常不是RecoverableSecurityException
的实例,那么我们如何访问该内容?
英文:
Because of the Android Privacy Changes in Android Q (API29) it's not possible to add songs to a Playlist and it throws this error message when adding a track.
java.lang.SecurityException: com.mp3player.mp3player has no access to content://media/external_primary/audio/media/117
I know that we can this catch this as a RecoverableSecurityException
and grant permission for each file individually.
But this is really a hassle and i'm wondering if there is another way.
I already found a post from User @Theo with the same exact problem but without any answers.
Code for adding songs to a playlist
public void addToPlayList(Context c, long songID, long playListID, String playlistName) {
Uri playListUri = MediaStore.Audio.Playlists.Members.getContentUri("external", playListID);
String[] columns = {
MediaStore.Audio.Playlists.Members.AUDIO_ID,
MediaStore.Audio.Playlists.Members.PLAY_ORDER,
};
ContentResolver resolver = c.getContentResolver();
Cursor cursor = resolver.query(playListUri, columns, null, null, null);
int playOrder = 0;
if (cursor != null) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
playOrder = cursor.getInt(0) + 1;
}
cursor.close();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, songID);
contentValues.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, playOrder);
resolver.insert(playListUri, contentValues);
resolver.notifyChange(Uri.parse("content://media"), null);
}
EDIT
Looks like the thrown Exception is not an instance of RecoverableSecurityException
so how do we get access to that content?
答案1
得分: -1
你可以使用playListUri.getpath()
来解决这个问题。
英文:
you can use playListUri.getpath()
and solve it.
专注分享java语言的经验与见解,让所有开发者获益!
评论