You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

音乐播放器专辑图获取失败:向Glide传入byte[]遇异常求助

解决方案

1. 修复MediaMetadataRetriever数据源设置问题

报错核心是setDataSource 失败:状态码 = 0x80000000,根源在于路径格式不兼容、权限不足或重载方法使用错误。修改getAlbumArt方法,采用更安全的重载逻辑并强化异常处理:

private byte[] getAlbumArt(Context context, Uri mediaUri) {
    byte[] albumArt = null;
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {
        // 兼容Content URI与文件URI的数据源设置方式
        retriever.setDataSource(context, mediaUri);
        albumArt = retriever.getEmbeddedPicture();
    } catch (Exception e) {
        Log.e("AlbumArtLoader", "获取专辑图失败", e);
    } finally {
        try {
            retriever.release();
        } catch (Exception ignore) {
            // 避免release操作抛出额外异常
        }
    }
    return albumArt;
}

2. 移除外在主线程的耗时操作

当前在主线程执行专辑图获取会阻塞UI甚至触发崩溃,将逻辑移至子线程执行,示例使用AsyncTask:

// 在Adapter的onBindViewHolder中调用
new AsyncTask<Integer, Void, byte[]>() {
    @Override
    protected byte[] doInBackground(Integer... params) {
        int position = params[0];
        String songPath = songArrayList.get(position).getPath();
        // 根据路径类型转换为标准Uri
        Uri mediaUri = songPath.startsWith("content://") 
                ? Uri.parse(songPath) 
                : Uri.fromFile(new File(songPath));
        return getAlbumArt(context, mediaUri);
    }

    @Override
    protected void onPostExecute(byte[] imageData) {
        super.onPostExecute(imageData);
        if (imageData != null) {
            GlideApp.with(context)
                    .load(imageData)
                    .error(R.drawable.baseline_person_24) // 处理图片损坏加载失败场景
                    .into(holder.imageView);
        } else {
            GlideApp.with(context).load(R.drawable.baseline_person_24).into(holder.imageView);
        }
    }
}.execute(position);

3. 解决权限与存储访问限制

  • Android 6.0及以上:动态申请READ_EXTERNAL_STORAGE权限,确保具备媒体文件读取权限。
  • Android 10及以上:遵循Scoped Storage规则,优先使用MediaStore返回的Content URI,避免直接使用文件路径导致的访问限制。

4. 处理损坏的JPEG数据

日志中提示损坏的JPEG数据:标记0xc4前存在15161个多余字节,通过Glide的error()方法设置占位图,避免图片解析失败引发崩溃。

内容的提问来源于stack exchange,提问作者Mohamad Shamsian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:32:17