Android MediaPlayer没有播放声音,但它没有丢失任何错误

时间:2012-12-29 02:15:44

标签: android media-player android-mediaplayer

我已经查看了这个问题变体的所有建议答案,但没有一个有帮助。我的应用程序应该教莫尔斯电码。唯一不起作用的部分是Player.java文件,该文件应该采用莫尔斯“字母”对象,读取其代码,并播放一系列音调(存储在res.raw文件夹中为.mp3s)。该代码的相关位是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);
            }
        }
    }
}
}

对于任何糟糕的编码感到抱歉,我仍然只是一个剧本。

编辑这是调用播放器类的代码,@ Geobits

    player player = new player();
    letter Letter = morse_alphabet.hardLetters.get(0);//Letter has a String name property of "b" and a int[] code property of {1, 0, 0, 0}
    try {
    player.play(Letter, context);//context =main_activity.this
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

4 个答案:

答案 0 :(得分:0)

尝试改变你的playSound功能,不要忘记打开音量

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

    });
}

答案 1 :(得分:0)

您应该使用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//////

答案 2 :(得分:0)

首先,我会提出你应该使用OnCompletionListener来释放你的播放器的所有建议,或者至少在你的onPause活动中这样做。

一旦我的程序启动了很少的玩家并且没有释放(泄露),我就发生了这种情况,所以当我再次尝试再次运行时,它无法创建新玩家。我不确定你是否一样,但手机重启解决了我的问题,我的代码没有任何变化(我试图杀死我的应用程序和其他服务,但它没有帮助)。

重要的一面评论:

  • 您不需要提前创建异常对象,因为这会浪费内存。只需在抛出异常时创建异常对象。

e.g。

 throw(new Exception("Unsupported command")); // Also you should provide a descriptive message

您的代码中还有一个错误

 while(finished = false) // it should be ==

或更好,你应该使用

 while(!finished)

答案 3 :(得分:0)

一个不好的解决方案,...但有用的解决方案

MediaPlayer mp = MediaPlayer.create(context, file);
//write these after
mp.start();
mp.pause();