0

私はこの質問の変形に対して提案されたすべての回答を見てきましたが、どれも役に立ちませんでした。私のアプリはモールス信号を教えることになっています。動作しない唯一の部分は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

4 に答える 4

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

    });
}
于 2012-12-29T02:26:11.387 に答える
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//////
于 2012-12-29T02:26:31.590 に答える
0

まず、OnCompletionListener を使用してプレーヤーを解放するか、少なくともアクティビティ onPause でこれを行う必要があるというすべての提案を 2 番目に挙げます。

私のプログラムがいくつかのプレーヤーを起動してリリースしなかった(リークした)ことがありました。そのため、再度実行しようとすると、新しいプレーヤーを作成できませんでした。あなたにとって同じかどうかはわかりませんが、電話を再起動すると問題が解決し、コードは変更なしで機能しました(アプリや他のサービスを強制終了しようとしましたが、役に立ちませんでした)。

重要な補足コメント:

  • メモリの無駄なので、事前に例外オブジェクトを作成する必要はありません。例外をスローするときに例外オブジェクトを作成するだけです。

例えば

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

また、コードにバグがあります

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

またはより良い使用する必要があります

 while(!finished)
于 2012-12-29T04:33:46.863 に答える
0

悪い解決策ですが...しかし有用な解決策

MediaPlayer mp = MediaPlayer.create(context, file);
//write these after
mp.start();
mp.pause();
于 2018-10-05T13:02:38.133 に答える