MuntashirAkon/AppManager · warning · IOException

No album art found

Error message

No album art found

What it means

Thrown by ThumbnailUtilsCompat.createAudioThumbnail when MediaMetadataRetriever.getEmbeddedPicture() returns null — the audio file simply contains no embedded artwork — or when no bitmap could be produced from it.

Solutions

  1. Handle the IOException and display a default album-art placeholder
  2. Pre-check getEmbeddedPicture() != null before requesting a thumbnail
  3. Read tag metadata separately (e.g. via a tags library) and fall back to folder art or online lookup

Example fix

// before
Bitmap thumb = ThumbnailUtilsCompat.createAudioThumbnail(file, size);
// after
Bitmap thumb;
try {
    thumb = ThumbnailUtilsCompat.createAudioThumbnail(file, size);
} catch (IOException e) {
    thumb = defaultAlbumArt; // placeholder for files without embedded art
}
Defensive patterns

Strategy: try-catch

Validate before calling

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(path);
boolean hasArt = mmr.getEmbeddedPicture() != null;
mmr.release();
if (!hasArt) return defaultAlbumArt;

Try / catch

Bitmap art;
try {
    art = ThumbnailUtilsCompat.createAudioThumbnail(file, size);
} catch (IOException e) {
    art = defaultAlbumArt; // files without embedded art are normal
}

Prevention

When it happens

Trigger: Calling createAudioThumbnail on an audio file without embedded album art (raw == null), e.g. a plain WAV/FLAC stream or a stripped MP3.

Common situations: Media-store sweeps over folders with non-music audio (voice notes, ringtones); files whose artwork was removed by a tag editor; users expecting thumbnails for all audio files.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of MuntashirAkon/AppManager@0152f468fc (2026-09-12). Data as JSON: /api/errors/85bf1a24a9fbcaf6. Report an issue: GitHub.

Appendix: source

Thrown at app/src/main/java/io/github/muntashirakon/AppManager/compat/ThumbnailUtilsCompat.java:56

     * @throws IOException If any trouble was encountered while generating or loading the thumbnail, or if
     *                     {@link CancellationSignal#cancel()} was invoked.
     */
    public static @NonNull Bitmap createAudioThumbnail(@NonNull Context context, @NonNull Uri uri, @NonNull Size size,
                                                       @Nullable CancellationSignal signal) throws IOException {
        // Checkpoint before going deeper
        if (signal != null) signal.throwIfCanceled();

        try (MediaMetadataRetriever retriever = new MediaMetadataRetriever()) {
            retriever.setDataSource(context, uri);
            final byte[] raw = retriever.getEmbeddedPicture();
            if (raw != null) {
                Bitmap bitmap = BitmapFactory.decodeByteArray(raw, 0, raw.length);
                return getThumbnail(bitmap, size, true);
            }
        } catch (RuntimeException e) {
            throw new IOException("Failed to create thumbnail", e);
        }
        throw new IOException("No album art found");
    }

    /**
     * Create a thumbnail for given video file.
     * <p>
     * This method should only be used for files that you have direct access to;
     * if you'd like to work with media hosted outside your app, consider using
     * {@link ContentResolver#loadThumbnail(Uri, Size, CancellationSignal)}
     * which enables remote providers to efficiently cache and invalidate
     * thumbnails.
     *
     * @param context The Context to use when resolving the video Uri.
     * @param uri     The video file.
     * @param size    The desired thumbnail size.
     * @throws IOException If any trouble was encountered while generating or
     *                     loading the thumbnail, or if
     *                     {@link CancellationSignal#cancel()} was invoked.
     */

View on GitHub (pinned to 0152f468fc)