音乐播放器专辑图获取失败:向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
相关产品推荐
相关产品推荐

