2016-09-30 5 views
0

Hallo ich baue Online-Radio-Streaming-App. Ich erhalte java.lang.IllegalStateException Fehler, wenn ich Play-Taste drücke. Die Hauptaktivität sieht folgendermaßen aus.java.lang.IllegalStateException für Media Player

package com.radioawaz.simerpreetjassal.radioawaz; 

import android.app.Activity; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnBufferingUpdateListener; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ProgressBar; 

import java.io.IOException; 

public class MainActivity extends Activity implements OnClickListener { 

    private ProgressBar playSeekBar; 

    private Button buttonPlay; 

    private Button buttonStopPlay; 

    private MediaPlayer player; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     initializeUIElements(); 

     initializeMediaPlayer(); 
    } 

    private void initializeUIElements() { 

     playSeekBar = (ProgressBar) findViewById(R.id.progressBar1); 
     playSeekBar.setMax(100); 
     playSeekBar.setVisibility(View.INVISIBLE); 

     buttonPlay = (Button) findViewById(R.id.buttonPlay); 
     buttonPlay.setOnClickListener(this); 

     buttonStopPlay = (Button) findViewById(R.id.buttonStopPlay); 
     buttonStopPlay.setEnabled(false); 
     buttonStopPlay.setOnClickListener(this); 

    } 

    public void onClick(View v) { 
     if (v == buttonPlay) { 
      startPlaying(); 
     } else if (v == buttonStopPlay) { 
      stopPlaying(); 
     } 
    } 

    private void startPlaying() { 
     buttonStopPlay.setEnabled(true); 
     buttonPlay.setEnabled(false); 

     playSeekBar.setVisibility(View.VISIBLE); 

     player.prepareAsync(); 

     player.setOnPreparedListener(new OnPreparedListener() { 

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

    } 

    private void stopPlaying() { 
     if (player.isPlaying()) { 
      player.stop(); 
      player.release(); 
      initializeMediaPlayer(); 
     } 

     buttonPlay.setEnabled(true); 
     buttonStopPlay.setEnabled(false); 
     playSeekBar.setVisibility(View.INVISIBLE); 
    } 

    private void initializeMediaPlayer() { 
     player = new MediaPlayer(); 
     try { 
      player.setDataSource("http://streaming.shoutcast.com/Radioawazca?lang=en-ca"); 
      player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() { 

      public void onBufferingUpdate(MediaPlayer mp, int percent) { 
       playSeekBar.setSecondaryProgress(percent); 
       Log.i("Buffering", "" + percent); 
      } 
     }); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (player.isPlaying()) { 
      player.stop(); 
     } 
    } 
} 

erorr Log Katze

09-29 20:51:51.278 7852-7852/com.radioawaz.simerpreetjassal.radioawaz E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: com.radioawaz.simerpreetjassal.radioawaz, PID: 7852 
                         java.lang.IllegalStateException 
                          at android.media.MediaPlayer.prepareAsync(Native Method) 
                          at com.radioawaz.simerpreetjassal.radioawaz.MainActivity.startPlaying(MainActivity.java:67) 
                          at com.radioawaz.simerpreetjassal.radioawaz.MainActivity.onClick(MainActivity.java:55) 
                          at android.view.View.performClick(View.java:5198) 
                          at android.view.View$PerformClick.run(View.java:21147) 
                          at android.os.Handler.handleCallback(Handler.java:739) 
                          at android.os.Handler.dispatchMessage(Handler.java:95) 
                          at android.os.Looper.loop(Looper.java:148) 
                          at android.app.ActivityThread.main(ActivityThread.java:5417) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
09-29 20:51:52.978 7852-7852/com.radioawaz.simerpreetjassal.radioawaz I/Process: Sending signal. PID: 7852 SIG: 9 

Hallo, Ich bin den Aufbau der Online-Radio-Streaming-App. Ich erhalte java.lang.IllegalStateException Fehler, wenn ich Play-Taste drücke. Die Hauptaktivität sieht folgendermaßen aus.

+0

versuchen Ausführung 'setOnPreparedListener()' vor 'prepareAsync()' – nandsito

Antwort

0

Bitte fügen Sie <uses-permission android:name="android.permission.INTERNET"/> in Ihrer Datei AndroidManifest.xml hinzu.

0

Mit Blick auf der Dokumentation gibt es zwei mögliche Probleme:

  1. Den Mediaplayer das INTERNET Erlaubnis erfordert, wenn sie mit einem vernetzten Strom verwendet (https://developer.android.com/reference/android/media/MediaPlayer.html#Permissions), aber das Verhalten sollte das nicht der Fall sein, ist nicht dokumentiert.
  2. Der Code in der Theorie sollte funktionieren, jedoch würde ein Fehler den MediaPlayer in den error Zustand versetzen, der es einen IllegalStateException werfen würde. Fügen Sie einen ErrorListener über https://developer.android.com/reference/android/media/MediaPlayer.html#setOnErrorListener(android.media.MediaPlayer.OnErrorListener) hinzu, bevor Sie Aktionen für das MediaPlayer-Objekt ausführen.

Wichtige Ausschnitt aus der Dokumentation:

Im Allgemeinen können einige Wiedergabesteuerungsoperation aus verschiedenen Gründen fehlschlagen, wie nicht unterstützten Audio/Video-Format, schlecht verschachtelte Audio/Video, Auflösung zu hoch, Streaming-Timeout und dergleichen. Daher ist die Meldung und Wiederherstellung von Fehlern unter diesen Umständen ein wichtiges Anliegen. Manchmal kann aufgrund von Programmierfehlern auch ein Wiedergabesteuervorgang in einem ungültigen Zustand aufgerufen werden. Unter all diesen Fehlerbedingungen ruft die interne Player-Engine eine vom Benutzer bereitgestellte OnErrorListener.onError() -Methode auf, wenn zuvor ein OnErrorListener über setOnErrorListener (android.media.MediaPlayer.OnErrorListener) registriert wurde.

0

löschen Ihre player.prepareAsync(), und fügen Sie dann player.prepare() in player.prepareAsync(), wie folgt aus: Hoffnung kann Ihnen helfen,

private void initializeMediaPlayer() { 
    player = new MediaPlayer(); 
    try { 
     player.setDataSource("http://streaming.shoutcast.com/Radioawazca?lang=en-ca"); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.prepare(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    player.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { 

     public void onBufferingUpdate(MediaPlayer mp, int percent) { 
      playSeekBar.setSecondaryProgress(percent); 
      Log.i("Buffering", "" + percent); 
     } 
    }); 
} 
+0

Dies spricht ausdrücklich gegen das, was in der Dokumentation steht. Es besagt, dass gestreamte Ressourcen "prepareAsync" verwenden müssen, da Daten möglicherweise nicht sofort verfügbar sind. – Kiskae