Android 11 无法再通过 id 获取相册
Android 11 no longer able to get album by id
我的音乐应用程序在 Android 中不再有效 11. 我无法通过内容解析器的 ID 获取专辑。下面的代码适用于 Android 10 而不是 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 项,无法进行下一步,它 returns 错误)。 (此代码在 Android 10 及以下完美运行)另一方面,通过使用此子句:
final String where = ALBUM_TITLE + " != '';
我得到了设备中的所有相册。
当这样做并在相册的 ALBUM_ID 中获取 int 值时,我得到了我正在寻找的完全相同的值。但是,如果我请求字符串值,我会得到另一个完全不同的值。奇怪的是,如果我使用该字符串值作为专辑 ID 查询内容解析器,我确实会得到所需的专辑。解析器不知何故只查看列的字符串字段。
PD:在 Android 10,该列的字符串和整数字段具有相同的值。 Android 11.
上的不同值
知道会发生什么吗?也许权限?我已阅读 Android 11 个文档和更改,但没有发现任何相关内容。
谢谢。
好的。如果有任何人遇到同样的问题,我已经找到了解决方案(我希望不会,这很愚蠢)问题是在 Android 中,11 个 ID 不再那么小(如 1、2、12、34 等) . id 值有点长,无法作为 int 检索。实际上,当您想要获取 int 值时,您只是获取了 long 字段的 las 8 或 9 值。结论:您必须始终将 id 保存为 String 或 Long 值。
我的音乐应用程序在 Android 中不再有效 11. 我无法通过内容解析器的 ID 获取专辑。下面的代码适用于 Android 10 而不是 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 项,无法进行下一步,它 returns 错误)。 (此代码在 Android 10 及以下完美运行)另一方面,通过使用此子句:
final String where = ALBUM_TITLE + " != '';
我得到了设备中的所有相册。
当这样做并在相册的 ALBUM_ID 中获取 int 值时,我得到了我正在寻找的完全相同的值。但是,如果我请求字符串值,我会得到另一个完全不同的值。奇怪的是,如果我使用该字符串值作为专辑 ID 查询内容解析器,我确实会得到所需的专辑。解析器不知何故只查看列的字符串字段。
PD:在 Android 10,该列的字符串和整数字段具有相同的值。 Android 11.
上的不同值知道会发生什么吗?也许权限?我已阅读 Android 11 个文档和更改,但没有发现任何相关内容。
谢谢。
好的。如果有任何人遇到同样的问题,我已经找到了解决方案(我希望不会,这很愚蠢)问题是在 Android 中,11 个 ID 不再那么小(如 1、2、12、34 等) . id 值有点长,无法作为 int 检索。实际上,当您想要获取 int 值时,您只是获取了 long 字段的 las 8 或 9 值。结论:您必须始终将 id 保存为 String 或 Long 值。