【问题标题】:Android: Retrieve music file information from raw folderAndroid:从原始文件夹中检索音乐文件信息
【发布时间】:2014-06-22 18:25:26
【问题描述】:

我正在尝试在我的原始文件夹中检索有关音乐文件的信息。我需要检索持续时间、标题、艺术家等。我了解如何检索存储在外部存储中的音乐文件的此信息,但我不知道如何检索原始文件夹中的音乐文件。帮助和链接将不胜感激!

【问题讨论】:

    标签: android cursor uri android-mediaplayer android-contentresolver


    【解决方案1】:

    搜索并尝试以下示例后,我没有成功。当我设置 MediaMetadataRetriever 的源时,@Jignesh Shaw 的解决方案给了我一个 IllegalArgumentException,而@Hanz Kratz 的解决方案只能提取歌曲的持续时间(如他所述)

    然而,在这两者之间,我受到了启发,想出了一个可行的解决方案。

    Uri mediaPath = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.song_name);
    MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    mmr.setDataSource(this, mediaPath);
    

    然后可以像两个用户所说的那样提取信息

    String sponsorTitle = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
    String sponsorArtist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
    //and so on...
    

    我不知道为什么这可以完美运行,但@Hanz Kratz 的解决方案却不行。如果其他人偶然发现了这个线程,那么如果你发布你的发现会很好。谢谢大家!

    【讨论】:

      【解决方案2】:

      只需获取原始资产的FileDescriptor,然后使用MediaMetadataRetriever 提取持续时间等元数据。

          MediaMetadataRetriever mmr = new MediaMetadataRetriever();
          FileDescriptor fd = getResources().openRawResourceFd(R.raw.rocknroll).getFileDescriptor();
          mmr.setDataSource(fd);
          String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
      

      这在持续时间内可以正常工作,但不幸的是MediaMetadataRetriever 在艺术家、标题等方面存在问题...与一些 MP3 文件:Android MediaMetadataRetriever returns null values from most keys

      【讨论】:

      • 感谢您的帮助。你把我推向了正确的方向(正确答案见我的编辑)
      • 太棒了!不过,您应该从问题中提取答案,将其作为答案发布并接受。自我回答关于 SO 的问题并接受它们是完全可以的。
      【解决方案3】:

      这可能会有所帮助:-

      String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
       String[] projection = { MediaStore.Audio.Media._ID,
               MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE,
               MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DISPLAY_NAME,
               MediaStore.Audio.Media.DURATION};
      
       cursor = this.managedQuery(
               MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection,null, null);
      
       private List<String> songs = new ArrayList<String>();
      
       while(cursor.moveToNext()){
           songs.add(cursor.getString(0) + "||" + cursor.getString(1) + "||" +
                   cursor.getString(2) + "||" + cursor.getString(3) + "||" +
                   cursor.getString(4) + "||" + cursor.getString(5));
       }
      

      【讨论】:

      • 感谢您的尝试,但这不是我想要的。如问题中所述,我已经知道如何从位于外部存储中的文件中检索信息。我正在尝试检索有关原始文件夹中文件的信息
      【解决方案4】:

      像这样加载资源的路径:

      String mediaPath = Uri.parse("android.resource://<your-package-name>/raw/filename").getPath();
      

      确保不附加文件扩展名。例如使用“文件名”而不是“文件名.mp3”

      然后您可以像这样访问 ID3 标签(假设您使用的是 mp3 文件):

      MediaMetadataRetriever mmr = new MediaMetadataRetriever();
      mmr.setDataSource(mediaPath);
      
      String albumName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
      

      等等..

      希望这会有所帮助!

      【讨论】:

      • 感谢您的帮助,您的回答将我推向了正确的方向(正确答案请参见编辑)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2012-08-29
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      相关资源
      最近更新 更多