【问题标题】:MediaMetadataRetriever : app crashes when trying to retrieve album art from mp3 using urlMediaMetadataRetriever:尝试使用 url 从 mp3 检索专辑封面时应用程序崩溃
【发布时间】:2018-12-22 08:35:42
【问题描述】:

我在这里想要完成的是,当我调用这个方法时:

public void setAlbumArt(int index) {
    android.media.MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    mmr.setDataSource(this, Uri.parse(fullsongpath.get(index).Path));

    byte [] data = mmr.getEmbeddedPicture();
    //albumArt is an Imageview object

    // convert the byte array to a bitmap
    if (data != null) {
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        albumArt.setImageBitmap(bitmap); //associated cover art in bitmap
        albumArt.setAdjustViewBounds(true);
        albumArt.setLayoutParams(new LinearLayout.LayoutParams(500, 500));
    } else {
        albumArt.setImageResource(R.mipmap.default_album_art); //any default cover resourse folder
        albumArt.setAdjustViewBounds(true);
        albumArt.setLayoutParams(new LinearLayout.LayoutParams(500,500 ));
    }
}

我的应用程序崩溃,引发错误

java.lang.IllegalArgumentException

这是专辑Art ImageView

<ImageView
    android:id="@+id/albumArt"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_gravity="center_horizontal"
    android:src="@mipmap/default_album_art" />

fullsongpath 是一个持有该对象的 ArrayList:

public class SongInfo {

    public  String Path;
    public  String song_name;
    public  String album_name;
    public  String artist_name;

    public  SongInfo(String Path,String song_name,String album_name,String artist_name){
      this.Path=Path;
      this.song_name=song_name;
      this.album_name=album_name;
      this.artist_name=artist_name;
    }
}

路径是 mp3 文件的 URL

我真的不知道是什么导致了这个问题,希望您能提供帮助,不胜感激。

【问题讨论】:

  • MediaMetadataRetriever::setDataSource 抛出IllegalArgumentException 如果Stringnull ...我猜.. 它是null?在发布此类问题之前,您应该真正查看文档和源代码,因为通常崩溃是另一个问题的征兆。

标签: java android mediametadataretriever


【解决方案1】:

试试这样,

new Thread(new Runnable() {
              public void run() {
                MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();

                metaRetriever.setDataSource(model.getPostImage(), new HashMap<String, String>());
                // get mp3 info
                byte[] art = metaRetriever.getEmbeddedPicture();
                final Bitmap bm2 = BitmapFactory.decodeByteArray(art, 0, art.length);
                metaRetriever.release();

                holder.postImg.post(new Runnable() {
                  public void run() {
                    holder.postImg.setImageBitmap(bm2);
                  }
                });
              }
            }).start();

【讨论】:

    【解决方案2】:

    不知道您是如何填充 PATH 的,但我怀疑您使用了 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI没有专辑封面

    在这种情况下,您需要使用MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI

    【讨论】:

      猜你喜欢
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 2011-10-22
      • 2017-03-23
      • 2010-11-10
      • 2014-01-29
      相关资源
      最近更新 更多