使用光标读取Asset文件夹中的mp3文件

时间:2018-10-27 14:08:46

标签: java android kotlin assets mediastore

我知道这可能是一个愚蠢的问题,但是我是Android开发的新手,经过一个小时的搜索,我找不到解决方法。我正在尝试开发一个音乐应用,可以从下面的教程中获得帮助。

https://www.sitepoint.com/a-step-by-step-guide-to-building-an-android-audio-player-app/

在本教程中,通过Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;从设备读取的mp3文件。但是,我只想阅读项目中的歌曲。当我搜索时,将mp3文件放入项目中的最佳位置是资产文件夹中。

Right place for putting mp3 files in an android project

教程中的代码通过光标获取mp3数据

    private void loadAudio() {
    ContentResolver contentResolver = getContentResolver();

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
    String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
    Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);

    if (cursor != null && cursor.getCount() > 0) {
        audioList = new ArrayList<>();
        while (cursor.moveToNext()) {
            String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            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));

            // Save to audioList
            audioList.add(new Audio(data, title, album, artist));
        }
    }
    cursor.close();
}

我尝试对其进行修改以从资产文件夹中获取它,但我不知道。我试图将uri更改为file:///android_asset/RELATIVEPATH,但是在这种情况下,游标返回null。我可以使用以下代码在Asset中获取文件,但是在那种情况下,我无法获取音频数据;

    private void listFiles() {

        Resources res = getResources(); //if you are in an activity
        AssetManager am = res.getAssets();
    String fileList[] = new String[0];
    try {
        fileList = am.list("Content");
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (fileList != null)
            {
 }
                audioList = new ArrayList<>();
                for ( int i = 0;i<fileList.length;i++)
                {
                     File file = new File(fileList[i]);
                     if ((file.getName()).endsWith(".mp3")) {
                         String data = file.getName();
                         Audio audio = new Audio(file.getName(),data,data,data);
                         audioList.add(audio);
                         Log.d("Hata",file.getPath());
                      Log.i("Hata", "getEpubFilesFromFileManager: " + ".." + file.getName() +"Path"+ file.getPath());
                     }
                }
            }

在调试MediaStore.Audio.Media.DATA时返回文件路径。我也尝试在第二个功能中使用file.getPath(),但是没有用。所以我的问题是,从资产文件夹迭代时如何使用光标?

编辑::我正在获取文件的AssetFileDescriptor,然后在Mediaplayer中,我使用AssetFileDescriptor而不是URL进行播放。这可行,但是我有两个问题;

  • 因为我在应用程序中喜欢100首歌曲,这是否会将歌曲写为ram中的缓存?

  • 我无法通过这种方法获得时长或标题信息。

     File file = new File(fileList[i]);
                 if ((file.getName()).endsWith(".mp3")) {
                     String data = file.getName();
                     try {
                         AssetFileDescriptor descriptor =     am.openFd("Contents/"+data);
    
                         Audio audio = new      Audio(descriptor,data,data,data,data);
                     audioList.add(audio);
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
    
                     Log.d("Hata",file.getPath());
                  //Log.i("Hata", "getEpubFilesFromFileManager: " + ".." + file.getName() +"Path"+ file.getPath());
                 }
    

1 个答案:

答案 0 :(得分:0)

  

我尝试对其进行修改以从资产文件夹中获取它,但我不知道

不能。 MediaStore对应用程序assets/目录的内容一无所知。

  

我可以使用以下代码在Asset中获取文件,但在这种情况下,我无法获取音频数据

正确。我不知道MediaStore用任何方式为您获取该数据。您可以使用从MediaMetadataRetriever获得的FileDescriptor来尝试AssetManager

但是,对于您而言,在开发计算机上获取该数据并将其包含在您的应用程序中将更为有效,而不是必须在运行时尝试从媒体文件中获取它们。有无数的媒体播放器可以告诉您媒体文件的标题,专辑和艺术家。收集这些信息并将其放入您的应用中:

  • 作为字符串资源
  • 作为包含所有数据的XML资源
  • 作为assets/中包含所有数据的JSON文件
  • 作为Java / Kotlin代码(例如Java static字段)
  • 等等。