在MediaPlayer-android中创建()失败
我试图播放一些基于按钮点击的音乐(wav格式)文件。我无法让MediaPlayer正常工作。每次我尝试实例化MediaPlayer类的对象时,它都会在create()上失败。在我发布代码之前,这里是我正在做的一个演示:在MediaPlayer-android中创建()失败,android,callback,media-player,Android,Callback,Media Player,我试图播放一些基于按钮点击的音乐(wav格式)文件。我无法让MediaPlayer正常工作。每次我尝试实例化MediaPlayer类的对象时,它都会在create()上失败。在我发布代码之前,这里是我正在做的一个演示: 1.包含两个按钮的布局文件。 2.这些按钮是为它们定义的读取和onClickListeners。 3.根据单击的按钮,将调用一个名为playAudioFile(View)的函数,该函数创建MediaPlayer实例并播放该文件。playAudioFile(视图)的代码如下:
1.包含两个按钮的布局文件。
2.这些按钮是为它们定义的读取和onClickListeners。
3.根据单击的按钮,将调用一个名为
playAudioFile(View)
的函数,该函数创建MediaPlayer实例并播放该文件。playAudioFile(视图)的代码如下:
public void playAudioFile(View v) {
/*Steps:
* 1. Take in id of the button.
* 2. Using id, identify what file needs to be played.
* 3. Play file.
*/
String path_to_file = null; //this is the path to the file.
if(b01.getId() == ((Button)v).getId()) {
Log.v(this.toString(), "Button 01 pressed.");
path_to_file = "/sdcard/audio/temp1.wav";
} else if(b02.getId() == ((Button)v).getId()) {
Log.v(this.toString(), "Button02 pressed.");
path_to_file = "/sdcard/audio/temp2.wav";
}
path_to_file = "file://" + path_to_file;
Uri streamUri = Uri.parse(path_to_file);
Log.v(this.toString(), "Path of file = " + path_to_file);
MediaPlayer mp = MediaPlayer.create(this, streamUri);
if(mp == null) {
Log.v(this.toString(), "Create() on MediaPlayer failed.");
}
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
try {
mp.start();
} catch (IllegalStateException e) {
e.printStackTrace();
Log.v(this.toString(), "Illegal state exception thrown in start.");
}
}
});
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.release();
}
});
}
我已经阅读了很多关于stackoverflow的帖子,详细介绍了上述问题的解决方案。我在综合了其中提出的所有建议后,遇到了这个问题。欢迎任何帮助
谢谢,斯利拉姆我不明白你为什么要这么做
MediaPlayer mp = MediaPlayer.create(this, streamUri);
这是我对我的播放器的实现,希望这能在某种程度上帮助您:
MediaPlayer mp = new MediaPlayer();
setContentView(R.layout.player);
Intent intent = getIntent();
String path = "";
System.out.println("My Scheme : "+intent.getData().toString().substring(8));
if (intent.getData().getScheme().equals("video")) {
path = intent.getData().toString().substring(8);
System.out.println("Path : "+path);
if(path.endsWith(".mp3")) {
setContentView(R.layout.musicplayer);
setContentView(R.layout.controls);
Log.e("MusicPlayer", "Playing: " + path);
try {
Notification notification = new Notification(
R.drawable.playbackstart, path, System.currentTimeMillis());
nm.notify(NOTIFY_ID, notification);
mp.reset();
mp.setDataSource(path);
mp.prepare();
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) {
System.out.println("Hi i am at the End");
}
});
}catch {expression}
我不明白你为什么要这么做
MediaPlayer mp = MediaPlayer.create(this, streamUri);
这是我对我的播放器的实现,希望这能在某种程度上帮助您:
MediaPlayer mp = new MediaPlayer();
setContentView(R.layout.player);
Intent intent = getIntent();
String path = "";
System.out.println("My Scheme : "+intent.getData().toString().substring(8));
if (intent.getData().getScheme().equals("video")) {
path = intent.getData().toString().substring(8);
System.out.println("Path : "+path);
if(path.endsWith(".mp3")) {
setContentView(R.layout.musicplayer);
setContentView(R.layout.controls);
Log.e("MusicPlayer", "Playing: " + path);
try {
Notification notification = new Notification(
R.drawable.playbackstart, path, System.currentTimeMillis());
nm.notify(NOTIFY_ID, notification);
mp.reset();
mp.setDataSource(path);
mp.prepare();
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) {
System.out.println("Hi i am at the End");
}
});
}catch {expression}
如果我没记错的话,就不能使用onPrepare,因为在MediaPlayer.create()中调用了mp.prepare()。最简单的代码可以是这样的:
MediaPlayer mp = MediaPlayer.create(this, streamUri);
mp.start();
如果您想要更详细的内容,可以尝试以下方法:
MediaPlayer mp = MediaPlayer.create(this, streamUri);
if(mp == null) {
Log.v(this.toString(), "Create() on MediaPlayer failed.");
} else {
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//here you should call the methods to release memory
mp.stop();
mp.release();
}
});
mp.start();
}
告诉我这是否对你有帮助
PD:如果您使用设备进行测试,而不是使用模拟器,效果会更好。有些类在那里不能正常工作(MediaPlayer无法在模拟器中复制视频),我不记得它是否支持音频。如果我没有错,您不能使用onPrepare,因为在MediaPlayer.create()中调用了mp.prepare()。最简单的代码可以是这样的:
MediaPlayer mp = MediaPlayer.create(this, streamUri);
mp.start();
如果您想要更详细的内容,可以尝试以下方法:
MediaPlayer mp = MediaPlayer.create(this, streamUri);
if(mp == null) {
Log.v(this.toString(), "Create() on MediaPlayer failed.");
} else {
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//here you should call the methods to release memory
mp.stop();
mp.release();
}
});
mp.start();
}
告诉我这是否对你有帮助
PD:如果您使用设备进行测试,而不是使用模拟器,效果会更好。有些类在那里不能正常工作(MediaPlayer无法在模拟器中复制视频),我不记得它是否支持音频。据我所知,您正在调用
MediaPlayer.create(…)
方法,它返回null
,这意味着创建MediaPlayer实例失败。根据这篇文章的公认答案,这是由于一个损坏的音频文件
我也有一个问题,声音被播放,但在极少数情况下create()方法也返回null。我在回合制游戏中使用声音,每次回合后都会播放声音。我总是调用create方法,启动播放器并在完成后释放它。这种情况每转一圈都会发生,就像每300转一圈一样,create方法返回null。。。所以在我的情况下,它一定是别的东西。在您的中,它可能与mp3文件的损坏有关。据我所知,您的问题是:您正在调用MediaPlayer.create(…)
方法,它返回null
,这意味着创建MediaPlayer实例失败。根据这篇文章的公认答案,这是由于一个损坏的音频文件
我也有一个问题,声音被播放,但在极少数情况下create()方法也返回null。我在回合制游戏中使用声音,每次回合后都会播放声音。我总是调用create方法,启动播放器并在完成后释放它。这种情况每转一圈都会发生,就像每300转一圈一样,create方法返回null。。。所以在我的情况下,它一定是别的东西。在您的中,这可能与mp3文件的损坏有关。我认为您之前添加了额外的\filepath@chirag:如果我在文件路径之前添加了一个额外的\项,那么mediaplayer是否应该在setDataSource()上没有失败?为什么在prepare()上?我会试试你的建议。@chirag:不,在文件路径之前删除“\”不会改变任何东西。谢谢这些评论能解决你的问题吗?@gian1200:不太能。。我不知道是什么问题。。但是我重新启动计算机的那一刻,一切都准备就绪了。我想你在添加额外的\之前filepath@chirag:如果我在文件路径之前添加了一个额外的\项,那么mediaplayer是否应该在setDataSource()上没有失败?为什么在prepare()上?我会试试你的建议。@chirag:不,在文件路径之前删除“\”不会改变任何东西。谢谢这些评论能解决你的问题吗?@gian1200:不太能。。我不知道是什么问题。。但是我重新启动电脑的那一刻,一切都准备就绪。@Sen:我有wav文件要播放,不是mp3。MediaPlayer也可以播放wav文件吗?@Sen:我之所以使用create()是因为文档本身这么说。链接:@Sriram:\u MediaPlayer也可以播放wav文件吗?是的请参考@Sriram:您是否尝试过我的实现。它也可以做你想做的事情。@Sen:我试过上面的代码。它在prepare()上失败。这也是我切换到create()的原因。我还缺什么吗?@Sen:我有wav文件要播放,不是mp3。MediaPlayer也可以播放wav文件吗?@Sen:我之所以使用create()是因为文档本身这么说。链接:@Sriram:\u MediaPlayer也可以播放wav文件吗?是的请参考@Sriram:您是否尝试过我的实现。它也可以做你想做的事情。@Sen:我试过上面的代码。它在prepare()上失败。这也是我切换到create()的原因。我还遗漏了什么吗?嘿,谢谢你的回答。我试过你在后台服务中说的话,但我在日志中看到这样一条消息:“在MediaPlayer上创建()失败。”
这意味着它仍然为空,那么我如何修复它?你的streamUri是什么?这是我的音乐流:音乐流我正在后台播放音乐嘿,谢谢你的回答。我试过你在后台服务中说的话,但我在日志中得到了这样一条信息: