我需要从SD卡播放声音。我有方法必须这样做,但它不起作用。
当我使用这种方法时:
public class AudioPlayService extends Service
{
MediaPlayer mMediaPlayer;
..............
public void soundplay(String adr)
{
mMediaPlayer = new MediaPlayer();
try
{
if (mMediaPlayer.isPlaying())
{
mMediaPlayer.reset();
}
mMediaPlayer.setDataSource(adr);
mMediaPlayer.prepare();
} catch (IOException e)
{
}
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
mp.release();
mp = null;
}
});
}
String adr - 它是在sd上提交文件的绝对路径。
然后我称之为:
AudioPlayService s = new AudioPlayService();
s.soundplay(iA.getSdDir() + "Files/Numbers/0.mp3");
我得到一个错误的:
12-09 13:04:13.829: E/MediaPlayer(16997): error (1, -2147483648)
12-09 13:04:13.829: E/MediaPlayer(16997): start called in state 0
12-09 13:04:13.829: E/MediaPlayer(16997): error (-38, 0)
12-09 13:04:13.839: E/MediaPlayer(16997): Error (-38,0)
答案 0 :(得分:0)
player.start()
放入try,catch块。因为如果玩家没有准备你的歌曲,你仍然在调用start method.start方法只在回放准备好后调用,
意味着准备就是成功。另一件事就是当你的玩家不再玩时你必须释放媒体播放器。否则就会有很多玩家对象在后面运行。
答案 1 :(得分:0)
出于某种原因,您的setDataSource()
或Prepare()
失败了。因此,在异常之后,start()
正在给出错误,因为播放器未处于准备状态。在catch块中添加print语句以了解异常是什么。并将start()
移到try catch块中。
mMediaPlayer = new MediaPlayer();
try
{
if (mMediaPlayer.isPlaying())
{
mMediaPlayer.reset();
}
mMediaPlayer.setDataSource(adr);
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (IOException e)
{
e.printStackTrace();
}
答案 2 :(得分:0)
我自己尝试了你的代码:
当我只放"sdcard/1.mp3"
您确保路径正确
s.soundplay(iA.getSdDir() + "Files/Numbers/0.mp3");
注意:
如果您尝试制作方法soundplay
以便停止以前的音频并播放新的音频文件,那么更好的方法是not
在该方法中执行此操作
mMediaPlayer = new MediaPlayer();
将它放在构造函数中。
否则每次调用s.soundplay(path)
时,您都会听到以前的音频和新音频。即,上一个不会停止