这似乎是一项非常简单的任务,但我无法让它发挥作用。我读过其他问题的解决方案无济于事。
我正在使用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)
答案 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);
}
}
`