MediaStore - 通过绝对路径获取歌曲的类型

时间:2017-06-03 19:22:24

标签: android

我使用下一个功能来获取基本元数据(如专辑,艺术家,标题,曲目编号..) 一首歌,但我无法获得更多,例如一首歌的流派。没有像“ MediaStore.Audio.Media.GENRE ”这样的常量

private void getMetadaFromMediaStore(String path) {
        String[] projection = { "*" };
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String selection = MediaStore.Audio.Media.DATA + "=?";
        String[] selectionArgs = { path };
        Cursor cursor = mContentResolver.query(uri, projection, selection, selectionArgs, null);
        if (cursor != null) {
            try {
                if (cursor.moveToFirst()) {
                    do {
                        String title = cursor.getString(
                                cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                        String album = cursor.getString(
                                cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                        String artist = cursor.getString(
                                cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                        //...

                    } while (cursor.moveToNext());
                }
            } finally {
                cursor.close();
            }
        }
    }

如何使用歌曲的绝对路径MediaStore获取更多元数据?

1 个答案:

答案 0 :(得分:0)

Android中的MediaMetaDataRetriever类具有许多有利于音频文件的功能。它的包名是“android.media.MediaMetadataRetriever”它能够给出这样的文件的预定义信息,如:

歌曲艺术家 歌曲的专辑名称 专辑歌曲艺术 歌曲的流派 歌曲的作曲家和它有更多的选择。

MediaMetadataRetriever metaRetriver;
metaRetriver = new MediaMetadataRetriever();
metaRetriver.setDataSource("/sdcard/audio.mp3");

上面的代码表示如何创建MediaMetadataRetriever类的对象以及如何设置数据源。 如此代码音频文件的绝对路径,它是sd-card中的文件集。

byte [] art; art = metaRetriver.getEmbeddedPicture(); 以上代码用于从音频文件中以字节格式获取专辑封面。

位图songImage = BitmapFactory.decodeByteArray(art,0,art.length); 上面的代码用于将字节形式的元数据转换为Bitmap格式,因此可以很容易地在定义显示它的ImageView上进行设置。

所有代码

ImageView album_art;
TextView album, artist, genre;

MediaMetadataRetriever metaRetriver;
byte[] art;

@Override 
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    getInit(); 

    // Ablum_art retrieval code // 

    metaRetriver = new MediaMetadataRetriever();
    metaRetriver.setDataSource("/sdcard/audio.mp3");
    try { 
        art = metaRetriver.getEmbeddedPicture();
        Bitmap songImage = BitmapFactory
                .decodeByteArray(art, 0, art.length);
        album_art.setImageBitmap(songImage);
        album.setText(metaRetriver
                .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
        artist.setText(metaRetriver
                .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
        genre.setText(metaRetriver
                .extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE));
    } catch (Exception e) {
        album_art.setBackgroundColor(Color.GRAY);
        album.setText("Unknown Album");
        artist.setText("Unknown Artist");
        genre.setText("Unknown Genre");
    } 

} 

// Fetch Id's form xml  

public void getInit() { 

    album_art = (ImageView) findViewById(R.id.album_art);
    album = (TextView) findViewById(R.id.Album);
    artist = (TextView) findViewById(R.id.artist_name);
    genre = (TextView) findViewById(R.id.genre);

} 

main.xml中

<? xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<TextView
    android:id="@+id/album_art_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="60dp"
    android:text="Album Art"
    android:textSize="18dp" />

<ImageView
    android:id="@+id/album_art"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_alignParentRight="true"
    android:layout_centerHorizontal="true"
    android:layout_marginRight="10dp" />

<TextView
    android:id="@+id/album_name_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/album_art_text"
    android:layout_below="@+id/album_art"
    android:layout_marginTop="24dp"
    android:text="Album Name :"
    android:textSize="18dp" />

<TextView
    android:id="@+id/artist_name_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/album_name_text"
    android:layout_below="@+id/album_name_text"
    android:layout_marginTop="43dp"
    android:text="Artist Name :"
    android:textSize="18dp" />

<TextView
    android:id="@+id/genre_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/artist_name_text"
    android:layout_below="@+id/artist_name_text"
    android:layout_marginTop="39dp"
    android:text="Genre :"
    android:textSize="18dp" />

<TextView
    android:id="@+id/genre"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/genre_text"
    android:layout_alignBottom="@+id/genre_text"
    android:layout_toRightOf="@+id/album_art_text"
    android:text="null"
    android:textSize="18dp" />


<TextView
    android:id="@+id/Album"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/artist_name_text"
    android:layout_alignLeft="@+id/album_art"
    android:text="null"
    android:textSize="18dp" />

<TextView
    android:id="@+id/artist_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/genre_text"
    android:layout_alignLeft="@+id/Album"
    android:text="null"
    android:textSize="18dp" />

</RelativeLayout>