2013-07-18 28 views
9

Ich habe mir verschiedene Webseiten angesehen, die eine Lösung für dieses Problem in meinem Code suchen. Es ist ein einfacher Audio-Player mit 3 Tasten: Wiedergabe, Pause und Stopp. Wiedergabe und Pause Arbeit ok und so stoppt aber sobald das Audio gestoppt wurde es wieder von vorne anfangen weigert, wirft einen Fehler:Android MediaPlayer Fehler (-38, 0) "stop called in state 0"

E/MediaPlayer: stop called in state 0 
E/MediaPlayer: error (-38, 0) 
E/MediaPlayer: Error (-38,0) 

Das ist mein MainActivity.java:

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 

import java.io.IOException; 

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener { 

    static Button playButton; 
    static Button pauseButton; 
    static Button stopButton; 
    static SeekBar seekBar; 
    private static MediaPlayer player; 
static Handler handler; 
static Uri audio; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild); 
    Uri audio = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.airbourne_runnin_wild); 
    try { 
     player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    playButton = (Button) findViewById(R.id.playButton); 
    pauseButton = (Button) findViewById(R.id.pauseButton); 
    stopButton = (Button) findViewById(R.id.stopButton); 
    seekBar = (SeekBar) findViewById(R.id.seekBar); 

    player.setOnPreparedListener(this); 

    handler = new Handler(); 

    seekBar.setMax(player.getDuration()); 

    playButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (!player.isPlaying()) { 
       try { 
        player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       player.start(); 
       updateSeekBar(); 
      } 
     } 
    }); 

    pauseButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (player.isPlaying()) { 
       player.pause(); 
      } 
     } 
    }); 

    stopButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (player.isPlaying()) { 
       player.stop(); 
       seekBar.setProgress(0); 
       seekBar.invalidate(); 
       try { 
        player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
      if (b) { 
       seekChanged(seekBar, i, b); 
      } 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }); 

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      player.stop(); 
      seekBar.setProgress(0); 
      //player.prepareAsync(); 
      seekBar.invalidate(); 
     } 
    }); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    playButton.setEnabled(true); 
} 

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    player.seekTo(progress); 
} 

public void updateSeekBar() { 
    seekBar.setProgress(player.getCurrentPosition()); 

    if (player.isPlaying()) { 
     Runnable notification = new Runnable() { 
      public void run() { 
       updateSeekBar(); 
      } 
     }; 
     handler.postDelayed(notification, 1500); 
    } 
} 
} 

Und activity_main. xml:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MainActivity"> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Play" 
      android:id="@+id/playButton" 
      android:layout_gravity="center_horizontal|top" 
      android:longClickable="false" 
      android:layout_weight="1" 
      android:layout_column="8" 
      android:enabled="false"/> 
</TableRow> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Pause" 
      android:id="@+id/pauseButton" 
      android:layout_gravity="center_horizontal|top" 
      android:layout_weight="1" 
      android:layout_column="8" 
      android:layout_span="7"/> 
</TableRow> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Stop" 
      android:id="@+id/stopButton" 
      android:layout_column="8" 
      android:layout_span="24" 
      android:layout_weight="1"/> 
</TableRow> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
</TableRow> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <SeekBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/seekBar" 
      android:layout_column="8" 
      android:layout_span="24" 
      android:layout_weight="1"/> 
</TableRow> 

Wenn jemand mir diesen Fehler beheben helfen könnte, es wäre sehr geschätzt. Ich habe bereits nach Lösungen gesucht und mehrere versucht, aber keiner schien richtig zu funktionieren.

EDIT: Ich änderte ein wenig des Codes:

Meine Frage nach wie vor über den Fehler ist, und das ist jetzt meine bearbeitet Code:

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 

import java.io.IOException; 

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener { 

static Button playButton; 
static Button pauseButton; 
static Button stopButton; 
static SeekBar seekBar; 
private static MediaPlayer player; 
static Handler handler; 
static Uri audio; 
static boolean canMakeCall = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    playButton = (Button) findViewById(R.id.playButton); 
    pauseButton = (Button) findViewById(R.id.pauseButton); 
    stopButton = (Button) findViewById(R.id.stopButton); 
    seekBar = (SeekBar) findViewById(R.id.seekBar); 

    if (canMakeCall = true) { 
     player.setOnPreparedListener(this); 

     handler = new Handler(); 

     seekBar.setMax(player.getDuration()); 

     playButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       if (!player.isPlaying()) { 
        player.start(); 
        updateSeekBar(); 
       } 
      } 
     }); 

     pauseButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       if (player.isPlaying()) { 
        player.pause(); 
       } 
      } 
     }); 

     stopButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       if (player.isPlaying()) { 
        player.stop(); 
        seekBar.setProgress(0); 
        seekBar.invalidate(); 
        try { 
         player.prepare(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 

     seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
       if (b) { 
        seekChanged(seekBar, i, b); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 

     player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mediaPlayer) { 
       mediaPlayer.stop(); 
       //player.stop(); 

       seekBar.setProgress(0); 
       //player.prepareAsync(); 
       seekBar.invalidate(); 
      } 
     }); 
    } 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    playButton.setEnabled(true); 
    canMakeCall = true; 
} 

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    player.seekTo(progress); 
} 

public void updateSeekBar() { 
    seekBar.setProgress(player.getCurrentPosition()); 

    if (player.isPlaying()) { 
     Runnable notification = new Runnable() { 
      public void run() { 
       updateSeekBar(); 
      } 
     }; 
     handler.postDelayed(notification, 1500); 
    } 
} 
} 

ich versucht habe, die Grundlagen immer arbeiten ohne auch eine Suchleiste, nur um sicherzustellen, dass kein Fehler verursacht wird, aber es liegt irgendwo in der Logik des Wiedergabe/Pause/Stopp-Codes, weil es denselben Fehler erzeugte, selbst wenn der Suchleistencode weggelassen wurde.

+0

möglich Duplikat [Android Mediaplayer Probleme: "Fehler (-38, 0)" und "im Zustand 1 genannte Stop"] (http : //stackoverflow.com/questions/11913108/android-mediaplayer-problems-error-38-0-and-stop-called-in-state-1) – rds

Antwort

8

Das Problem ist, sobald Sie es gestoppt haben, Sie wieder setDataSource. Sie haben dann prepare()

player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 
player.prepare(); 

Immer, wenn Sie setDataSource() rufen nennen Sie es prepare() wieder benötigen. Stellen Sie sich vor, Sie laden die Datei und machen sich bereit für die Wiedergabe.

Übrigens bemerke ich Sie verwechseln Telefon MediaPlayer.create() und rufen Sie auch setDataSource() mehrmals für die gleiche Datei. Das ist nicht nötig. Sobald der MediaPlayer erstellt und vorbereitet wurde (welcher Aufruf .create() für Sie tut), können Sie einfach .stop(), .pause(), .play() darauf aufrufen, es ist nicht nötig, die ganze Zeit neu zu setzen.

+0

Ich habe gerade den Code geändert, um die .setDataSource und die verknüpfte try ... catch-Anweisungen, aber der Code erzeugt immer noch den gleichen Fehler. Wenn ich Play drücke, fängt es an, gut zu spielen und die SeekBar bewegt sich gut, Pause funktioniert auch gut und dann höre ich es auf, aber die Suchleiste wird aus irgendeinem Grund nicht auf Null zurückgesetzt, das ist, wo die Fehler beginnen. – uberdum05

+0

Es ist schwierig zu sagen, was jetzt passiert, wenn Sie den Code geändert haben, und es stimmt nicht mit Ihrer Frage überein, und es gibt keinen StackTrace mit Zeilennummer, den Sie sehen können. Ich bin mir nicht sicher, ob es sich bei Ihrer Frage um Ihre Suchleiste oder um den ursprünglichen Fehler handelt, im falschen Zustand aufgerufen zu werden. Wenn ich du wäre, würde ich die Grundlagen ohne jede Suchfunktion arbeiten. –

+0

Bitte beachten Sie meine Änderungen oben, die Antwort dauerte auch eine Weile, weil der DNS-Server bei meiner Arbeit starb. – uberdum05

1

Ich behob dieses Problem durch Entfernen der player.stop(), die aufgerufen wurde, wenn der Player das Lied wegen player.setOnCompletionListener() beendete. Dies hat nun das Problem gelöst und der Player funktioniert einwandfrei.

0

Ich behob dieses Problem von `mediaPlayer.prepare(); Mein Problem ist, über Live-Radio-Streaming und ich erreichen dieses Problem wie unten Code:

if (!radioIsOpen) { 
       try { 
        mediaPlayer = new MediaPlayer(); 
        mediaPlayer 
          .setDataSource(URL); 
        mediaPlayer.prepare(); 
       } catch (Exception e) { 
       } 

       mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 

        public void onPrepared(MediaPlayer mp) { 
         mediaPlayer.start(); 
        } 
       }); 
       Toast.makeText(getBaseContext(), "Radio is opening...", 2).show(); 
      } else { 
       if (mediaPlayer.isPlaying()) { 
        mediaPlayer.stop(); 
        mediaPlayer.release(); 
        Toast.makeText(getBaseContext(), "Radio is closing...", 2).show(); 
       } 
      } 
Verwandte Themen