Android 11不再能够通过id获取专辑



我的音乐应用程序在Android 11中不再工作。我无法从内容解析器中按id获取专辑。下面的代码可以在Android 10上运行,而不能在Android 11上运行

public final static String ALBUM_ID = android.provider.MediaStore.Audio.Albums._ID;
public Observable<Cursor> getAlbumById(int albumId) {
return Observable.create(emitter -> {
final String where = ALBUM_TITLE + " != '' AND " + ALBUM_ID + "=?";
final String[] columns = {ALBUM_ID, ALBUM_TITLE, ALBUM_FIRST_YEAR, ALBUM_LAST_YEAR, ALBUM_NUMBER_OF_SONGS, ALBUM_ARTIST_ID, ARTIST_NAME};
final String sort = android.provider.MediaStore.Audio.Albums.DEFAULT_SORT_ORDER;
final String[] values = { String.valueOf(albumId) };
Cursor cursor = null;
try {
cursor = MediaStore.this.contentResolver.query(ALBUM_URI, columns, where, values, sort);
if (cursor == null || cursor.getCount() == 0) {
throw new MediaItemNotFoundException();
}
emitter.onNext(cursor);
emitter.onComplete();
} catch (MediaItemNotFoundException e) {
emitter.onError(e);
} catch (Exception e) {
emitter.onError(new MediaStoreQueryException(e.getMessage(), e.getCause()));
}
});
}

权限我正在使用:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<application
android:name=".AndroidApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"

当我查询内容解析器请求该专辑id时,我得到一个空光标(0项,不能移动下一步,它返回false)。(此代码在Android 10及以下版本上运行良好)另一方面,通过使用以下子句:

final String where = ALBUM_TITLE + " != '';

我得到设备中所有的相册。

当这样做并在专辑的ALBUM_ID中获得int值时,我得到了与我正在寻找的完全相同的值。然而,如果我请求字符串值,我得到另一个完全不同的值。奇怪的是,如果我使用该字符串值作为专辑id查询内容解析器,我确实会得到想要的专辑。不知何故,解析器只查看列的String字段。

PD:在Android 10中,该列的string和int字段具有相同的值。Android 11的不同值

你知道会发生什么吗?也许权限?我读了Android 11的文档和变化,但没有发现任何相关的

谢谢。

好的。如果遇到同样的问题,我已经找到了解决方案(我希望不是,这很愚蠢)。问题是,在Android 11中,id不再那么小(如1、2、12、34等)。id值太长,不能作为整型检索。实际上,当你想要得到整型值时你只需要得到长字段的最后8或9个值。结论:您必须始终将id保存为String或Long值。

最新更新