Android MediaPlayer不是';它不会播放声音,但它是';不要犯任何错误

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

我已经看过了所有关于这个问题的答案,但是没有一个有帮助。我的应用程序应该教摩尔斯电码。唯一不起作用的部分是Player.java文件,它应该接收一个莫尔斯“字母”对象,读取其代码,并播放一系列音调(作为.mp3s存储在res.raw文件夹中)。这段代码的相关部分是playSound(int-pfile,Context-pcontext)函数。这是:

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来释放播放机,或者至少在暂停活动中这样做

有一次,我的程序启动了几个玩家,没有发布(泄露),所以当我再次尝试运行时,它无法创建新的玩家。我不确定这对你是否是一样的,但是一部手机重新启动解决了我的问题,我的代码没有任何变化(我试图关闭我的应用程序和其他服务,但没有任何帮助)

重要的补充意见:

  • 您不需要预先创建异常对象,因为这会浪费内存。在抛出异常时,只需创建异常对象
e、 g

你的代码中也有一个bug

 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();