在 Android 10 设备中找不到 java.lang.IllegalArgumentException Volume external_primary

Vel*_*elu 7 android mediastore android-contentresolver android-sdcard android-10.0

崩溃:找不到 java.lang.IllegalArgumentException 卷 external_primary

从媒体商店查询曲目时,我在某些 Android 10 设备(其中大部分来自小米米 A2 Lite、摩托罗拉、HMD Global Nokia)中遇到此崩溃。

Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

我应该为 Android 10 设备传递不同的 URI 吗?(但是它在大多数设备中都可以正常工作)

堆栈跟踪 :

Caused by java.lang.IllegalArgumentException: Volume external_primary not found
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.query(ContentProviderProxy.java:423)
at android.content.ContentResolver.query(ContentResolver.java:946)
at android.content.ContentResolver.query(ContentResolver.java:881)
at android.content.ContentResolver.query(ContentResolver.java:837)
at com.example.musicplayer.CursorFactory.getAllSongsCursor(CursorFactory.java:164)
Run Code Online (Sandbox Code Playgroud)

编辑:根据报告的这个问题,怀疑这可能是那些使用 Android 10 操作系统的设备中的 sdcard 问题。

Sir*_*mra 6

Android 10、API 28 后,从其他来源访问媒体内容时出现了一些变化。

谷歌在此链接中提到了它https://developer.android.com/training/data-storage/shared/media#storage-volume

您可以使用以下代码通过谷歌提供的更多信息来获取有关如何解决此问题的更多信息:

// Add a specific media item.
ContentResolver resolver = getApplicationContext()
        .getContentResolver();

// Find all audio files on the primary external storage device.
// On API <= 28, use VOLUME_EXTERNAL instead.
Uri audioCollection = MediaStore.Audio.Media.getContentUri(
        MediaStore.VOLUME_EXTERNAL_PRIMARY);

// Publish a new song.
ContentValues newSongDetails = new ContentValues();
newSongDetails.put(MediaStore.Audio.Media.DISPLAY_NAME,
        "My Song.mp3");

// Keeps a handle to the new song's URI in case we need to modify it
// later.
Uri myFavoriteSongUri = resolver
        .insert(audioCollection, newSongDetails);
Run Code Online (Sandbox Code Playgroud)

希望这对你有用!

  • 另一个观察结果是,MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) 不会加载 SdCard 中的歌曲。 (2认同)

Hau*_*Luu 5

谷歌添加了一个名为“作用域存储”的东西,它稍微改变了文件操作。所以你应该使用 VOLUME_EXTERNAL/VOLUME_EXTERNAL_PRIMARY 而不是 EXTERNAL_CONTENT_URI

val uri =
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
        } else {
            MediaStore.Video.Media.EXTERNAL_CONTENT_URI
        }
Run Code Online (Sandbox Code Playgroud)

使用 VOLUME_EXTERNAL/VOLUME_EXTERNAL_PRIMARY 是正确的方向,但在极少数情况下,用户将音频文件存储在 SD 卡上,但手机无法识别它,从而导致崩溃。这是一个设备错误,您对此无能为力。

来自https://developer.android.com/reference/android/provider/MediaStore#VOLUME_EXTERNAL_PRIMARY的文档

您可以在进行查询之前使用 getExternalVolumeNames 检查是否有可用的外部存储。

https://developer.android.com/reference/android/provider/MediaStore#getExternalVolumeNames(android.content.Context)