从资产文件夹中读取音乐

时间:2017-05-13 06:30:26

标签: java android

我的项目是用户可以设置为铃声的音乐列表。 我的所有音乐都位于原始状态且工作正常,我的铃声名称也是原始“zeallist”中的文字。 我的问题是如何把我的音乐放在资产文件夹中。

以下是我从原始播放音乐的代码:

  public ArrayList<SongInfo> getAllSong(Context context) {
    ArrayList<SongInfo> listSong = new ArrayList<SongInfo>();
    RingtonesSharedPreferences pref = new RingtonesSharedPreferences(
            context);
    Field[] fields = R.raw.class.getFields();
    for (int i = 0; i < fields.length - 1; i++) {
        SongInfo info = new SongInfo();
        try {
            String name = fields[i].getName();           
            if (!name.equals("ringtones")) {   
                info.setFileName(name + ".mp3");
                info.setFavorite(pref.getString(info.getFileName()));
                int audioResource = R.raw.class.getField(name).getInt(name);
                info.setAudioResource(audioResource);
            }
            // info.setName(name);
        } catch (Exception e) {

        }
        listSong.add(info);
    }
    InputStream inputStream = context.getResources().openRawResource(
            R.raw.zeallist);
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            inputStream));   
    try {
        String line;
        int i = 0;
        while ((line = reader.readLine()) != null) {
            listSong.get(i).setName(line);
            i++;
        }
    } catch (Exception e) {
        // TODO: handle exception
    } finally {
        try {
            reader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return listSong;
}

如何更改我的代码的这一部分以从资产中读取它们并返回我的listsong?

3 个答案:

答案 0 :(得分:0)

右键单击res文件夹并创建名为raw的新文件夹。现在复制粘贴其中的几个.MP3文件。请查看这些链接以便更好地理解。

link1

link2

来自Assest文件夹

public void playBeep() {
    try {
        if (mp.isPlaying()) {
            mp.stop();
            mp.release();
            mp = new MediaPlayer();
        }

        AssetFileDescriptor descriptor = getAssets().openFd("mysong.mp3");
        mp.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
        descriptor.close();

        mp.prepare();
        mp.setVolume(1f, 1f);
        mp.setLooping(true);
        mp.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

答案 1 :(得分:0)

您可以使用AssetManager

从资产中读取文件
AssetManager assetManager = getAssets();
String[] files = assetManager.list("");

请注意,此文件是String数组。因此,在迭代之前,不要忘记为数组的每个元素初始化新文件。

答案 2 :(得分:0)

核心部分我已经完成了。你需要自己做的一些细节

  public ArrayList<SongInfo> getAllSong(Context context) throws IOException {
        ArrayList<SongInfo> listSong = new ArrayList<SongInfo>();
        RingtonesSharedPreferences pref = new RingtonesSharedPreferences(context);
            String[] files = context.getAssets().list("Your songs path");
            for (int i = 0; i < files.length - 1; i++) {
                SongInfo info = new SongInfo();
                    String name = files[i];
                    if (!name.equals("ringtones")) {
                        info.setFileName(name + ".mp3");
                        info.setFavorite(pref.getString(info.getFileName()));
                    /*    int audioResource = R.raw.class.getField(name).getInt(name);
                        info.setAudioResource(audioResource);*/  //fileName is enough to you
                    }
                    // info.setName(name);
                listSong.add(info);
            }
            InputStream inputStream = context.getAssets().open("Your zeallist path");
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    inputStream));
            try {
                String line;
                int i = 0;
                while ((line = reader.readLine()) != null) {
                    listSong.get(i).setName(line);
                    i++;
                }
            } catch (Exception e) {
                // TODO: handle exception
            } finally {
                try {
                    reader.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return listSong;
    }

当你想播放相应的音乐时,你可以这样做

  public void play(MediaPlayer mediaPlayer, Context context, String musicName) throws IOException {
        AssetFileDescriptor assetFileDescriptor = context.getAssets().openFd(musicName);
        mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(),
                assetFileDescriptor.getStartOffset(),
                assetFileDescriptor.getLength());
        mediaPlayer.prepare();
        mediaPlayer.start();
    }

希望这能解决您的问题。