web-dev-qa-db-ja.com

MediaPlayer:クライアント側でファイルを開くことができませんでした。エラー(-38,0)など

学習中Androidそして、ToggleButton(再生/一時停止)とButton(次へ)の2つのボタンを持つアクティビティを作成しました。循環させたい2つの曲があります。 Nextを押すと配列があります

int [] songs={R.raw.song1,R.raw.song2};

アクティビティのonClickを上書きしました。最初の曲は正常に再生されます。しかし、[次へ]を押すと、次のエラーが発生します。

サーバー側でファイルを開くことができませんでした

E/MediaPlayer(3107):状態4で呼び出され始めます

E/MediaPlayer(3107):エラー(-38、0)

E/MediaPlayer(3107):エラー(-38,0)

E/MediaPlayer(3107):エラー(1、-2147483648)

E/MediaPlayer(3107):エラー(1、-2147483648)

OnCreate(Bundle ...)では、

if(mp!=null) mp.release();
  mp=MediaPlayer.create(this, songs[count]);

これが私のonClick(View v)メソッドです:

public void onClick(View view) {    
    Log.v(TAG,"ID:"+view.getId());
    switch (view.getId()) {
    case R.id.playerbutton:  //ToggleButton
        if(state==0) {
            mp.start();
            state=1;
        }
        else if(state==1) {
            state=0;
            mp.pause();
        }   
    break;

    case R.id.next:  //Next button
        Log.v(TAG,"Next button pressed!");
        count=(count+1)%2;  //Have only two songs
        mp.reset();
        try {
            mp.setDataSource(this, Uri.parse("Android.resource://com.example.myfirstapp"+songs[count]));
            mp.setOnPreparedListener(this);
            mp.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        mp.start();
    break;
    }
}

基本的に、次のボタンを押すたびにこれを実行します。-resetmp(つまり、MediaPlayerオブジェクト)-次の曲を再生するための新しいデータソースを設定します-start mp

setOnPreparedListenerまたはprepareAsyncの使用については、 this SO question

どこが間違っているのですか?

10
Kedar Paranjape

データソースの設定が間違っていると思います。

次のように変更します。

mp.setDataSource(this, Uri.parse("Android.resource://com.example.myfirstapp/"+songs[count]));

パッケージ名の後の末尾のスラッシュに注意してください。

8
Ken Wolf