【问题标题】:Retrieve MetaData from audio file in Android从Android中的音频文件中检索元数据
【发布时间】:2018-03-24 21:00:50
【问题描述】:

我想在我的设备上检索歌曲的元数据(艺术家、专辑、路径、名称、长度)。这是我正在使用的代码。

 String selection = MediaStore.Audio.Media.InterfaceConsts.IsMusic + " != 0";

        String[] projection = {
                MediaStore.Audio.Media.InterfaceConsts.Artist,                  //artist
                MediaStore.Audio.Media.InterfaceConsts.Album,                   //album
                MediaStore.Audio.Media.InterfaceConsts.Data,                    //path
                MediaStore.Audio.Media.InterfaceConsts.DisplayName,             //title
                MediaStore.Audio.Media.InterfaceConsts.Duration
                };

        var cursor = myContentResolver.Query(
                MediaStore.Audio.Media.ExternalContentUri,
                projection,
                selection,
                null,
                null);


        while (cursor.MoveToNext())
        {
            string path = cursor.GetString(2); string name = cursor.GetString(3); string artist =  cursor.GetString(0); string album cursor.GetString(1); string duration = cursor.GetString(4);

        }

此代码的问题是歌曲的长度不正确。对于某些歌曲,它返回的时间比它应该的要短。所以我只使用一段代码来获取歌曲的长度。这是代码:

        MediaMetadataRetriever mmr = new MediaMetadataRetriever();
        mmr.SetDataSource(path);  //path is the path of the song file
        lenth = mmr.ExtractMetadata(MetadataKey.Duration);

但是这段代码还有另一个问题。对于某些歌曲,我在第 2 行得到一个例外:

Java.Lang.RuntimeException: setDataSource failed: status = 0x80000000

我还想说我在使用权限:

Manifest.Permission.ReadExternalStorage,
 Manifest.Permission.Internet

我正在为我的项目使用 Xamarin.Android。

【问题讨论】:

  • 您正在测试的 Android 版本是什么?根据这个post,异常可能是由文件路径引起的。
  • 我正在使用 Android 8.0 在我的三星 Galaxy S8+ 上进行测试。

标签: android audio xamarin.android metadata


【解决方案1】:

此代码有效

public List getAllAudioFromDevice(final Context context) {

    final List<MusicFilesModal> tempAudioList = new ArrayList<>();

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Audio.AudioColumns.DATA, MediaStore.Audio.AudioColumns.ALBUM,
            MediaStore.Audio.ArtistColumns.ARTIST,
            MediaStore.Audio.Media.DURATION};


    Cursor c = context.getContentResolver().query(uri, projection, null, null, null);

    if (c != null) {
        while (c.moveToNext()) {

            String path = c.getString(0);
            String album = c.getString(1);
            String artist = c.getString(2);
            String duration = c.getString(3);

            String title = path.substring(path.lastIndexOf("/") + 1);

            MusicFilesModal audioModel = new MusicFilesModal(path, title, artist, album, duration);

            //Log.e("Name :" + title, " Album :" + album);
            //Log.e("Path :" + path, " Artist :" + artist);

            Log.d("artistName_", artist);
            Log.d("albumName_", album);

            tempAudioList.add(audioModel);
        }
        c.close();
    }
    Log.d("tempAudioListSize_", tempAudioList.size() + "_");

    return tempAudioList;
}

【讨论】:

  • 请详细解释一下您的代码,谢谢。
  • 首先您必须创建一个数组列表,您可以在其中传递您的模态列表。然后您可以在字符串类型变量中获取媒体存储的路径。然后创建一个查询,您可以在其中添加数据详细信息,例如获取音频名称、艺术家姓名等,然后将查询传递给光标。然后创建 if statemnt 并在循环中获取所有数据(音频、名称、持续时间等)并获取变量中的所有数据并将这些变量提供给模态列表并将数据添加到模态列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2019-02-13
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2013-01-01
相关资源
最近更新 更多