【问题标题】:How can I play the mp3 file from Environment.DIRECTORY_DOWNLOADS如何从 Environment.DIRECTORY_DOWNLOADS 播放 mp3 文件
【发布时间】:2020-04-07 01:10:33
【问题描述】:

我从一个 Url 下载了 mp3 文件,并通过以下代码将其保存在 Environment.DIRECTORY_DOWNLOADS 中:

request.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_DOWNLOADS,"d1.mp3");

我检查了文件可以正确下载。现在我想播放这个 d1.mp3 文件,但是当我按下播放按钮时,它并没有开始播放音乐!看起来我在使用“setDataSource”时遇到了问题。如果您检查我的代码并告诉我哪里出错了,我将不胜感激。

private void initMediaPlayer()
{
    String PATH_TO_FILE = Environment.DIRECTORY_DOWNLOADS + "/d1.mp3";
    mp = new  MediaPlayer();

    try {
        mp.setDataSource(PATH_TO_FILE);
        mp.prepare();
        Toast.makeText(this, PATH_TO_FILE, Toast.LENGTH_LONG).show();
        stateMediaPlayer = stateMP_NotStarter;
        textState.setText("- IDLE -");
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
        stateMediaPlayer = stateMP_Error;
        textState.setText("- ERROR!!! -");
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
        stateMediaPlayer = stateMP_Error;
        textState.setText("- ERROR!!! -");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
        stateMediaPlayer = stateMP_Error;
        textState.setText("- ERROR!!! -");
    }

}

public void play(View view) {
    initMediaPlayer();
    mp.start();           
}

【问题讨论】:

  • PATH_TO_FILE 的值是多少?

标签: java android android-studio audio media-player


【解决方案1】:

您应该使用getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)(用于应用下载)或Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) 作为下载文件的完整路径。

【讨论】:

  • 亲爱的 Andriy, 感谢您的回复。不幸的是,问题仍然存在。正如你所说的下载我改变了代码: request.setDestinationInExternalFilesDir(MainActivity.this, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath(),"d1.mp3");为了创建媒体播放器,我使用了以下代码: mp = new MediaPlayer(); String PATH_TO_FILE = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/d1.mp3"; mp = MediaPlayer.create(MainActivity.this, Uri.parse(PATH_TO_FILE));
  • 你应该改变这个:String PATH_TO_FILE = Environment.DIRECTORY_DOWNLOADS + "/d1.mp3"; line to String PATH_TO_FILE = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + "/d1.mp3"; not for download.
  • 文件存储在设备存储中,路径如下:Android/data/"package name"/files/storage/emulated/0/Download/d1.mp3 好像是MediaPlayer中mp3文件的地址.create 还是找不到这个文件。
  • 所以尝试(用于测试)只是硬编码String PATH_TO_FILE = "Android/data/"package name"/files/storage/emulated/0/Download/d1.mp3"。如果这有效,则打印到记录此String PATH_TO_FILE = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + "/d1.mp3" 行(类似于Log.d("TEST", "PATH_TO_FILE = " +PATH_TO_FILE));
  • 感谢您的回复。正如你所说,我也使用直接地址来下载文件或读取文件,但没有用。我使用了 MediaPlayer.create 和 setDataSource 这两种方法,但它们都不起作用。通过使用 Mediaplayer.create 立即停止但 setDataSource 没有反应。我真的很困惑,因为我检查了代码以使用直接地址显示文件存在,但显示不存在!好像看不到文件!同样在 Manifest 中,我允许 READ_EXTERNAL_STORAGE。我应该放我的整个项目吗?
【解决方案2】:

我知道为时已晚,但我遇到了同样的问题,我通过在您的代码中添加一行来解决它 设置数据源后

mp.setDataSource(PATH_TO_FILE);

添加 PrepareAsync

mp.prepareAsync();

这解决了我的问题

【讨论】:

    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多