0

URLから曲をダウンロードし、メディアプレーヤーを使用してサービスで再生する小さなアプリをプログラミングしています。作業に必要なものはすべて揃っています。ただし、曲の再生を開始すると、停止ボタンと一時停止ボタンが機能せず、もう一度再生を押すと、曲の2番目のコピーの再生が開始されます。何が悪いのかはわかっていると確信しています。修正方法がわかりません。

public class Player extends IntentService {
    public Player() {
        super("Player");
    }
    MediaPlayer mp;

    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        Uri uri = intent.getData();
        mp = MediaPlayer.create(this, uri);

        if(extras != null)
        {
            if(extras.getString("action").equals("play"))
            {
                mp.start();
            }
            else if(extras.getString("action").equals("pause"))
            {
                mp.pause();
            }
            else if(extras.getString("action").equals("stop"))
            {
                if (mp != null) {
                    mp.stop();
                    mp.release();
                }
            }
        }
    }
}

私のボタンの1つのコードの例:

    play.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            intent.putExtra("action", "play");
            startService(intent);
        }});

ボタンを押してインテントを送信するたびに、メディアプレーヤーの別のインスタンスが作成されるため、そのコピーは再生されないため、一時停止または再生されず、再生を押すと別のコピーが生成されると思います。初めてプレイを押したときにのみプレーヤーが作成されるように設定しようとしましたが、うまくいきませんでした。また、「作成」のような別のアクションを作成して、メインアクティビティが最初にファイルをダウンロードしたときに送信しようとしましたが、それも機能しませんでした。両方ともクラッシュしました。おそらく私はそれらを間違ってしました。コードまたはLogCatのコピーがないことをお詫び申し上げます。プレーヤーを一度だけ作成する方法について誰か提案がありますか?または、ファイルのURIをonCreateに渡しますか?

編集:これを投稿してから、再生ボタンの応答を変更してみました。今です:

protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();

    if(extras != null)
    {
        if(extras.getString("action").equals("play"))
        {
            if (mp != null) {
                mp.start();
            }
            else {
                Uri uri = intent.getData();
                    mp = MediaPlayer.create(this, uri);                 
                mp.start();
            }
        }

Log呼び出しを使用して、クラッシュしている場所を特定しました。LogCatで.create呼び出しに失敗し、次のように表示されます。

09-22 22:58:24.566:E / AndroidRuntime(1446):致命的な例外:IntentService [Player] 09-22 22:58:24.566:E / AndroidRuntime(1446):java.lang.NullPointerException 09-22 22:58 :24.566:E / AndroidRuntime(1446):android.media.MediaPlayer.setDataSource(MediaPlayer.java:868)09-22 22:58:24.566:E / AndroidRuntime(1446):android.media.MediaPlayer.setDataSource( MediaPlayer.java:854)09-22 22:58:24.566:E / AndroidRuntime(1446):android.media.MediaPlayer.create(MediaPlayer.java:788)09-22 22:58:24.566:E / AndroidRuntime( 1446):android.media.MediaPlayer.create(MediaPlayer.java:769)09-22 22:58:24.566:E / AndroidRuntime(1446):com.example.mp3player.Player.onHandleIntent(Player.java:36) )09-22 22:58:24.566:E / AndroidRuntime(1446):android.app.IntentService $ ServiceHandler.handleMessage(IntentService.java:65)09-22 22:58:24.566:E / AndroidRuntime(1446):android.os.Handler.dispatchMessage(Handler.java:99)09-22 22:58:24.566:E / AndroidRuntime(1446):android.os.Looper.loop(Looper.java) :137)09-22 22:58:24.566:E / AndroidRuntime(1446):android.os.HandlerThread.run(HandlerThread.java:60)

どんな助けでも大歓迎です!

4

1 に答える 1

0

Squonk のアドバイスは、プレーヤーを作成するときに最初の NPE を取り除くのに役立ちましたが、それでも同じ問題がありました。mp をローカル変数のように扱っていたため、変更が持続しませんでした。public staticmp の変数宣言に修飾子を追加することで、これを解決しました。これで、mp のすべての出現箇所が同じ変数になり、変更が持続します!

于 2012-09-23T16:15:04.143 に答える