メディアプレーヤーが状態0で呼び出されました、エラー(-38,0)


105

私は現在、インターネットラジオ局をストリーミングするシンプルなアプリを設計しようとしています。ステーションのURLがあり、メディアプレーヤーを次のように設定しています

    MediaPlayer mediaPlayer = new MediaPlayer();
    try {
        mediaPlayer.setDataSource(URL);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.start();

エミュレートしてもプログラムはクラッシュしませんが、何も再生されず、次のエラーが発生します。

start called in state 0

そしてその真下に

Error (-38,0)

これが何を意味するのか誰か知っていますか?

これらの状態エラーについて少し読みましたが、自分のプロジェクトに該当するものは見つかりませんでした。




@SmashCodeでは、私の回答がまったく役に立たないため、別の回答を承認済みとしてマークしてください。
tidbeck

回答:


119

リスナーを使用mediaPlayer.start()してonPreparedメソッドを呼び出す必要があります。呼び出しているため、このエラーが発生していますmediaPlayer.start()準備された状態になる前に。

これを行う方法は次のとおりです。

mp.setDataSource(url); 
mp.setOnPreparedListener(this);
mp.prepareAsync();

public void onPrepared(MediaPlayer player) {
    player.start();
}

すぐに開始したくない場合はどうなりますか?プレーヤーを初期化して1分ほど待っても、初めて再生しようとすると、onPrepared
Elliptica

1
あなたは前にそれを準備し、あなたがそれを準備したことを覚えています。並行して、それを実行するかどうかを思い出そうとします。両方が準備されて実行したい場合は、開始します。
VictorPaléologue18年

33

エラー-38は状態エラーを意味するようです(エラーメッセージが示すとおり)。たとえばを呼び出すstart()と、曲の準備が整う前に、またはを呼び出すときにpause()、曲がまったく再生されていなくてもです。

この問題を修正するには、メソッドを呼び出す前にmediaPlayerの状態を確認してください。例えば:

if(mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
}

さらに、MediaPlayerはイベントメッセージを送信しています。準備済みイベントが必要ない場合でも(このイベントが発生する前に再生を開始しないことをお勧めします)、コールバックリスナーを設定する必要があります。これはまたのために当てはまりOnErrorListenerOnCompletionListenerOnPreparedListenerおよびOnSeekCompletedListener(あなたが求めるメソッドを呼び出す場合)。

リスナーは簡単に接続できます

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        // Do something. For example: playButton.setEnabled(true);
    }
});

プレーヤーを再生していないときにpause()を呼び出すことが私のケース
でした

無効な状態でmediaPlayer.isPlaying()を呼び出すと、メディアプレーヤーがエラー状態になります。状態を維持するための明示的な列挙型を維持する方が良い。
Madeyedexter 2016

14

メディアプレーヤーが現在の位置(MediaPlayer.getCurrentPosition())を取得しようとしたときに、準備された状態にないときにこのエラーが発生しました。その状態を追跡し、onPreparedListenerが呼び出された後にgetCurrentPosition()メソッドのみを呼び出すことで、これを回避しました。


その理由から、どうやってそれを理解しましたか?
AdamMc331 2016年

9

これは私のコードであり、テストされて正常に動作しています:

package com.example.com.mak.mediaplayer;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final MediaPlayer mpp = MediaPlayer.create(this, R.raw.red); //mp3 file in res/raw folder

    Button btnplay = (Button) findViewById(R.id.btnplay); //Play
    btnplay.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View vone) {
        mpp.start();
      }
    });

    Button btnpause = (Button) findViewById(R.id.btnpause); //Pause
    btnpause.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View vtwo) {
        if (mpp.isPlaying()) {
          mpp.pause();
          mpp.seekTo(0);
        }
      }
    });
  }
}

4

私はコードの下でテストしました。正常に動作しています

public class test extends Activity implements OnErrorListener, OnPreparedListener {

private MediaPlayer player;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    player = new MediaPlayer();
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        player.setDataSource("http://www.hubharp.com/web_sound/BachGavotte.mp3");
        player.setOnErrorListener(this);
        player.setOnPreparedListener(this);
        player.prepareAsync();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }       
}
@Override
public void onDestroy() {
    super.onDestroy();
    player.release();
    player = null;
}
@Override
public void onPrepared(MediaPlayer play) {
    play.start();
}
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
    return false;
}
}

SetAudioStreamType(..)使用および更新SetAudioAttributes(...)
Pierre

4

数日前に同じ問題が発生しました。私のオーディオMe​​diaPlayerは、処理能力の高いデバイスで正常に動作しますが、遅いデバイスの場合、メディアプレーヤーがしばらく再生せず、Lo​​gCatから、間違った状態で呼び出されたという不満がたくさんありました。したがって、以下のようにOnPreparedListener()のonPrepared()メソッドにstart()pause()、... への呼び出しを置くことを呼び出すことで解決しました。

mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    ........
                    mediaPlayer.start();
                    ....
                    songControlBtn.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (mediaPlayer.isPlaying()) {
                                mediaPlayer.pause();

                            } else {
                                mediaPlayer.start();

                            }
                        }
                    });

                    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            ............

                        }
                    });
                }
            });

また、不要になったメディアプレーヤーを解放してみてください。たとえば、オーディオやビデオをバックグラウンドで再生したくない場合は、onPause()mediaPlayer.release()を呼び出す必要があります。


3

Androidがデコードできない方法でファイルがエンコードされる場合があります。一部のmp4ファイルでも再生できません。別のファイル形式(.3gpはほとんどの場合再生されます)を試してみてください。


46
インターネットラジオ局にファイル形式の変更を依頼することはできません。
SmashCode、2012年

「このビデオを再生できません」というポップアップが表示されますか?どのように対処しますか?エラーをキャッチしますが、関係なくこのモーダルを取得します。メディアのソースはパブリックAPIから取得されるため、ソースを制御できません。「このビデオを再生できません」モーダルを防ぐ方法を誰かが知っているなら、私は感謝します。
Krafty 14

エラーリスナーを設定してみましたか?MediaPlayer mp = new MediaPlayer(){@Override public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener listener){//ここで何かを行う..}}; mp.setDataSource(..
Rukmal Dias、2014


0

MediaPlayerインスタンスの現在の状態では許可されていない操作を行ったため、ログにこのメッセージが表示されます。

したがって、それらをキャッチするために常にエラーハンドラを登録する必要があります(@tidbeckが提案したとおり)。

最初に、MediaPlayerクラスのドキュメントを見て、状態の意味を理解することをお勧めします。参照:http : //developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram

ここでのあなたの間違いはよくある間違いの1つであり、他の人がここで書いたものですが、一般的には、どのメソッドがどの状態で呼び出すのに有効であるかについてのドキュメントを見てみましょう。 http://developer.android.com/ reference / android / media / MediaPlayer.html#Valid_and_Invalid_States

私の例では、mediaPlayer.CurrentPositionメディアプレーヤーがこのプロパティを呼び出すことが許可されていない状態のときに呼び出したのはメソッドです。


0

再生する前に毎回MediaPlayerの新しいオブジェクトを作成し、その後解放することにより、エラー(-19,0)と(-38,0)の両方を解決しました。

前 :

void play(int resourceID) {
if (getActivity() != null) {

     //Using the same object - Problem persists
    player = MediaPlayer.create(getActivity(), resourceID);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            player.release();
        }
    });

    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

}

}

後:

void play(int resourceID) {

if (getActivity() != null) {

    //Problem Solved
    //Creating new MediaPlayer object every time and releasing it after completion
    final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            player.release();
        }
    });

    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

}

}


0
  if(length>0)
        {
            mediaPlayer = new MediaPlayer();
            Log.d("length",""+length);
            try {
                mediaPlayer.setDataSource(getApplication(),Uri.parse(uri));
            } catch(IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mediaPlayer.seekTo(length);
                    mediaPlayer.start();

                }
            });
            mediaPlayer.prepareAsync();

0

それは非常に不満でした。だから、私は私のために働く解決策を得ました。

try {
                        if (mediaPlayer != null) {
                            mediaPlayer.release();
                            mediaPlayer = null;

                        }
                        mediaPlayer = new MediaPlayer();
                        mediaPlayer.setDataSource(file.getAbsolutePath());
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mediaPlayer) {
                                mediaPlayer.start();
                                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                                    @Override
                                    public void onCompletion(MediaPlayer mediaPlayer) {
                                        mediaPlayer.stop();
                                        mediaPlayer.release();
                                        mediaPlayer = null;
                                    }
                                });
                            }
                        });
                        mediaPlayer.prepare();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }


0

私もonPreparedListenerで試したこのエラーが発生しましたが、それでもこのエラーが発生しました。最後に、Androidマニフェストxmlでインターネットの許可を忘れたため、エラーが私のせいだという解決策を得ました。:)

<uses-permission android:name="android.permission.INTERNET" />

メディアプレーヤーのサンプルコーディングを使用しました。StreamService.java メソッドで使用しました
onCreate

String url = "http://s17.myradiostream.com:11474/";
mediaPlayer = new MediaPlayer();            
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();

-1

私は直前に同じ問題に遭遇しました、1階の友達は正しかった、start()間違った時にを呼び出した、prepare()またはprepareSync()このメソッドでリスナーを設定する必要がありmediaPlayer.setOnPreparedListener(this)ます。準備する前に、このコールバック呼び出しでstart()。問題が解決する場合があります。私はすでに試しました。


もっと具体的に教えていただけますか?
Karthik AMR

申し訳ありませんが、私は英語が母国語ではなく、私もそれが得意ではありません...しかし、同じ質問を持つ他の人たちを助けたいだけです。
peerless2012

-1

私はAndroidプログラミングの新人で、これと同じエラーが発生しました。そのため、mp.createmediaPlayer = MediaPlayer.create(getApplicationContext()、Settings.System.DEFAULT_RINGTONE_URI)を再定義するだけです。それは本当の方法ではないかもしれませんが、私にとってはうまくいきました:

try {
  mp = MediaPlayer.create(getApplicationContext(), Settings.System.DEFAULT_RINGTONE_URI);
} catch (Exception e) {
  e.printStackTrace();
}

mp.start();

-2
mp = new MediaPlayer();
AssetFileDescriptor afd = mContext.getAssets().openFd(fileName);
mp.reset();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp.prepare();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  public void onPrepared(MediaPlayer mp) {
    mp.start();
  }
});

mp.prepareAsync();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.