Android MediaPlayer不是';它不会播放声音,但它是';不要犯任何错误
我已经看过了所有关于这个问题的答案,但是没有一个有帮助。我的应用程序应该教摩尔斯电码。唯一不起作用的部分是Player.java文件,它应该接收一个莫尔斯“字母”对象,读取其代码,并播放一系列音调(作为.mp3s存储在res.raw文件夹中)。这段代码的相关部分是playSound(int-pfile,Context-pcontext)函数。这是:Android MediaPlayer不是';它不会播放声音,但它是';不要犯任何错误,android,media-player,android-mediaplayer,Android,Media Player,Android Mediaplayer,我已经看过了所有关于这个问题的答案,但是没有一个有帮助。我的应用程序应该教摩尔斯电码。唯一不起作用的部分是Player.java文件,它应该接收一个莫尔斯“字母”对象,读取其代码,并播放一系列音调(作为.mp3s存储在res.raw文件夹中)。这段代码的相关部分是playSound(int-pfile,Context-pcontext)函数。这是: package com.ewg.morseCode; import java.io.IOException; import com.ewg.mor
package com.ewg.morseCode;
import java.io.IOException;
import com.ewg.morseCode.morse_alphabet.letter;
import android.app.Activity;
import android.content.Context;
import android.media.MediaPlayer;
public class Player extends Activity{
public static boolean finished = false;
public static class player{
public int dit;
public int dah;
public player(){
this.dit = R.raw.morse_dit;
this.dah = R.raw.morse_dah;
}
//////PERTINENT BIT//////
private void playSound(int pfile, Context pcontext){
final int file = pfile;
final Context context = pcontext;
MediaPlayer mp =MediaPlayer.create(context, file);
mp.start();
while(mp.isPlaying()){
}
mp.reset();
mp.release();
mp = null;
}
//////END PERTINENT BIT//////
public void pause(int dur){
finished = false;
CountDownTimer timer1 = new CountDownTimer(dur, dur){
public void onTick(long blah){
}
public void onFinish(){
finished = true;
}
}.start();
while(finished = false){
}
}
public void play(letter x, Context context) throws Exception{
Exception e = new Exception();
for(int i = 0; i< x.code.length-1; i++){
switch(x.code[i]){
case 0:
playSound(dit, context);
pause(49);
break;
case 1:
playSound(dah, context);
pause(49);
break;
default:
throw(e);
}
}
}
}
}
试着像这样改变你的播放声音功能,别忘了打开音量
private void playSound(int pfile, Context pcontext){
final int file = pfile;
final Context context = pcontext;
MediaPlayer mp = MediaPlayer.create(context, file);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.release();
}
});
}
您可能应该使用一个
OnCompletionListener
,而不是一个空的while循环。它可能不会解决你的问题,但肯定不会伤害你,而且是更合适的方法
//////PERTINENT BIT//////
private void playSound(int pfile, Context pcontext)
{
final int file = pfile;
final Context context = pcontext;
MediaPlayer mp =MediaPlayer.create(context, file);
mp.start();
mp.setOnCompletionListener(this);
}
public void onCompletion(MediaPlayer mp)
{
mp.release();
}
//////END PERTINENT BIT//////
首先,我支持所有建议,您应该使用OnCompletionListener来释放播放机,或者至少在暂停活动中这样做 有一次,我的程序启动了几个玩家,没有发布(泄露),所以当我再次尝试运行时,它无法创建新的玩家。我不确定这对你是否是一样的,但是一部手机重新启动解决了我的问题,我的代码没有任何变化(我试图关闭我的应用程序和其他服务,但没有任何帮助) 重要的补充意见:
- 您不需要预先创建异常对象,因为这会浪费内存。在抛出异常时,只需创建异常对象
while(finished = false) // it should be ==
或者你最好用
while(!finished)
一个糟糕的解决方案,。。。但这是一个有用的解决方案
MediaPlayer mp = MediaPlayer.create(context, file);
//write these after
mp.start();
mp.pause();
请不要乞求或告诉我们您的问题有多紧急;这里的事情对他们来说并不比其他人更紧急。如果你的问题如此紧急,请雇人立即放下一切,解决你的问题。当我们谈到这个问题时,没必要在这里大喊大叫。我们都很擅长阅读,你不需要大喊大叫就能引起我们的注意。这很烦人,也很粗鲁,只会让你的问题更难理解。他们发明了Shift键,因为适当的大小写可以使文本更具可读性;让你的问题更难阅读会让答案更慢。我很抱歉,我不是想大喊大叫,我只是一时糊涂,担心高中会不及格(因为这是我的高中项目,定于1月8日)。我不能雇用任何人,因为我非常贫穷,目前无家可归。如果我冒犯了你,我很抱歉。谢谢。我听从了你的建议,虽然没有解决问题,但我还是很感谢你的建议。再看看,有没有理由将
player
类包装在另一个player
类中,该类从活动扩展而来?你裁剪的Player
还有更多代码吗,还是这样?如果是这样,那么我看不出有任何理由在这里使用活动
类,也没有理由将玩家
作为内部类。无论哪种方式,查看实际调用play()
的代码都可能会有所帮助。我这样做是为了帮助自己,因为我在组织方面有困难。这是一个独立于主_activity.java文件的.java文件。调用play的代码如下:player=newplayer();字母=莫尔斯字母表。硬字母。get(0);试试{player.play(morse_alphabet.hardwletters.get(2),context);}catch(异常e){//TODO自动生成的catch块e.printStackTrace();}//Letter的String name属性为“b”,int[]code属性为{1,0,0}//context=main_activity,我将把它作为我原始问题的编辑发布。谢谢你指出错误,我犯了很多这样粗心的错误。我还不太擅长调试自己的代码。至于重启手机,我没有使用真正的设备,因为我买不起。我使用的是AVD,运行的是安卓2.2,并且支持声音播放。我的电脑和AVD上的音量都达到了最大值。我建议从Android SDK示例运行ApiDemos开始,看看音频示例是否有效;确保AVD配置正确。然后,在用建议的修改对代码进行更正后,请尝试您的代码。我检查了它,AVD工作正常。我尝试了所有的建议;还是不行。我将尝试使用.wav和.ogg文件,看看这是否有帮助。谢谢。我的AVD和电脑上的最大音量。
while(!finished)
MediaPlayer mp = MediaPlayer.create(context, file);
//write these after
mp.start();
mp.pause();