【问题标题】:Read mp3 files inside Asset folder with Cursor使用光标读取 Asset 文件夹中的 mp3 文件
【发布时间】:2018-10-27 14:08:45
【问题描述】:

我知道这可能是一个愚蠢的问题,但我是 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,然后在媒体播放器中,我使用 AssetFileDescriptor 而不是 url 播放它。这可行,但我有两个问题;

  • 这是否将歌曲作为缓存写入内存,因为我在应用中有 100 首歌曲?

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

     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());
                 }
    

【问题讨论】:

    标签: java android kotlin assets mediastore


    【解决方案1】:

    我尝试修改它以从资产文件夹中获取它,但我无法弄清楚

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

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

    正确。我不知道MediaStore 有什么方法可以为您获取这些数据。您可以尝试MediaMetadataRetriever,使用从AssetManager 获得的FileDescriptor

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

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

    【讨论】:

    • 对不起,我不明白“在您的开发机器上获取数据并将其包含在您的应用程序中”的部分。
    • @EmreÖnder:您说这些 MP3 文件是您应用中的资产。因此,它们是您的开发机器上的文件,位于项目的 assets/ 目录中。您可以使用媒体播放器查看这些文件并查看标题、专辑和艺术家。然后,您可以使用我在项目符号中概述的一些技术将该信息输入到您的应用程序中。无需在运行时查找该信息。
    • 啊我明白了。不过我会调查一下,我认为这不是一个好方法
    • @EmreÖnderL 在处理时间和电池消耗方面,这样做对用户来说会更有效。毕竟,在应用程序安装副本的整个生命周期内,数据都不会改变。
    猜你喜欢
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2023-03-24
    • 2010-12-11
    • 2011-05-02
    相关资源
    最近更新 更多