如何从sdcard文件夹中读取音频文件

时间:2014-07-01 15:20:44

标签: android audio

这似乎是一项非常简单的任务,但我无法让它发挥作用。我读过其他问题的解决方案无济于事。

我正在使用ADT并使用虚拟设备运行我的代码(sdcard配置为200mb)。

在我的项目目录中,我创建了一个名为sdcard的文件夹,该文件夹现在位于res文件夹下。在sdcard文件夹中,我创建了另一个名为audio的文件夹,并将音频文件复制到该文件夹​​。所以结构看起来像这样,projectFolder / sdcard / audio / sound.mp3 ..注意,我没有从代码中添加这些文件夹和文件! (如果重要的话)。

现在我想在点击按钮(按钮工作)时播放此声音。我编写以下代码:

String path = Environment.getExternalStorageDirectory().getAbsolutePath();
MediaPlayer mPlayer = new MediaPlayer();

try {
mPlayer.setDataSource(path+"/audio/sound.mp3"); // The ADT tells me that i have to surround 
mPlayer.prepare();                              // these two statements with try catch. why? 
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} //Some more exceptions below.

mPlayer.start();

当我运行这个时,我得到一个IOException错误(这是我的捕获异常之一)。

那么我做错了什么?当我将声音添加到res / raw并使用该方式播放声音时,它可以工作。

logcat的

07-01 16:05:07.430: I/MainActivity(661): MEDIA_MOUNTED True!!!!
07-01 16:05:07.430: I/MainActivity(661): Complete path = /storage/sdcard/audio/sound.mp3
07-01 16:05:07.570: E/MediaPlayer(661): error (1, -2147483648)
07-01 16:05:07.580: W/System.err(661): java.io.IOException: Prepare failed.: status=0x1
07-01 16:05:07.590: W/System.err(661):  at android.media.MediaPlayer.prepare(Native Method)
07-01 16:05:07.600: W/System.err(661):  at com.example.acceptedonphone.MainActivity.startSome(MainActivity.java:47)
07-01 16:05:07.600: W/System.err(661):  at java.lang.reflect.Method.invokeNative(Native Method)
07-01 16:05:07.600: W/System.err(661):  at java.lang.reflect.Method.invoke(Method.java:515)
07-01 16:05:07.620: W/System.err(661):  at android.view.View$1.onClick(View.java:3818)
07-01 16:05:07.620: W/System.err(661):  at android.view.View.performClick(View.java:4438)
07-01 16:05:07.620: W/System.err(661):  at android.view.View$PerformClick.run(View.java:18422)
07-01 16:05:07.620: W/System.err(661):  at android.os.Handler.handleCallback(Handler.java:733)
07-01 16:05:07.630: W/System.err(661):  at android.os.Handler.dispatchMessage(Handler.java:95)
07-01 16:05:07.630: W/System.err(661):  at android.os.Looper.loop(Looper.java:136)
07-01 16:05:07.630: W/System.err(661):  at android.app.ActivityThread.main(ActivityThread.java:5017)
07-01 16:05:07.630: W/System.err(661):  at java.lang.reflect.Method.invokeNative(Native Method)
07-01 16:05:07.630: W/System.err(661):  at java.lang.reflect.Method.invoke(Method.java:515)
07-01 16:05:07.640: W/System.err(661):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-01 16:05:07.640: W/System.err(661):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-01 16:05:07.640: W/System.err(661):  at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:0)

尝试使用Environment.getExternalStorageDirectory()方法:

String path = Environment.getExternalStorageDirectory();

 MediaPlayer mPlayer = new MediaPlayer();    
    try {
    mPlayer.setDataSource(path+"/audio/sound.mp3"); 
    mPlayer.prepare();                              
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    }     
    mPlayer.start();

或使用路径/mnt/sdcard/audio/sound.mp3,它也适用于我:

String path = "/mnt/sdcard/"
MediaPlayer mPlayer = new MediaPlayer();    
try {
mPlayer.setDataSource(path+"/audio/sound.mp3"); 
mPlayer.prepare();                              
} catch (IllegalArgumentException e) {
    e.printStackTrace();
}     
mPlayer.start();

*请确保.mp3文件位于/ mnt / sdcard / audio /

答案 1 :(得分:0)

您可能在清单中忘记了以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

“QCMediaPlayer媒体播放器不存在”这一消息非常具有误导性。

答案 2 :(得分:0)

此代码对我有用,可能对您有所帮助......

final String MEDIA_PATH = newEnvironment().getExternalStorageDirectory().getPath();
 File home = new File(MEDIA_PATH);
 if (home.listFiles(new FileExtensionFilter()).length > 0) 
{
  for (File file : home.listFiles(new FileExtensionFilter())) 
{
   HashMap<String, String> song = new HashMap<String, String>();
      song.put("songTitle", file.getName().substring(0(file.getName().length() - 4)));
                song.put("songPath", file.getPath());
// Adding each song to SongList
        songsList.add(song);
            }
        }

`