2013-02-22 12 views
6

Przepraszam, mój angielski, ale jestem z Brazylii i użyłem google translator.Prawidłowa metoda korzystania z MediaPlayer w Androidzie

Cóż, walczę w tej aplikacji, gdzie próbuję zrobić streaming radia online, działa dobrze w wersji 2.2, ale wersja 4.0 nie działa. Brak błędu, po prostu nie działa. Poniżej znajduje się mój kod.

Doceniam każdą pomoc.

package com.radiomiriam; 
import java.io.IOException; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Toast; 

public class Main extends Activity { 
public String url = "http://69.64.48.96:9880"; 
public MediaPlayer player = new MediaPlayer(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    play(); 
} 

@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; 
} 

public void stop(){ 
    Toast.makeText(getApplicationContext(), "Finalizando...", Toast.LENGTH_SHORT).show(); 
    if(player.isPlaying()){ 
     player.stop(); 
    } 
} 

public void play(){ 
    if(player.isPlaying()){ 
     Toast.makeText(getApplicationContext(), "Já está em execução!", Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(getApplicationContext(), "Preparando...", Toast.LENGTH_SHORT).show(); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 
     try { 
      player.setDataSource(url); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      player.prepare(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     player.start(); 
    } 
} 

public void onClick(View v) { 
    final int id = v.getId(); 
    switch (id) { 
    case R.id.btnPlay: 
     play(); 
     break; 
    case R.id.btnStop: 
     stop(); 
     break; 
    } 
} 
} 

Witam, przepraszam mój upór, ale nadal nie znalazłem rozwiązania mojego problemu i nie wiem jak go rozwiązać, to po raz kolejny z prośbą o pomoc, aby rozwiązać ten problem.

Aplikacja działa w wersjach 2.x i 3.x, ale nie w wersji 4.x. Poniżej znajduje się link do pobrania projektu, na który możesz rzucić okiem i mi pomóc.

http://nsi.inf.br/RadioMiriam.rar (usunięty)

+0

Spróbuj zmienić 'w.printStackTrace();' na 'Log.e ("SomeTagName" e.getMessage() , e); 'i zobacz czy błędy pojawią się w logcat. – petey

+0

Co umieściłem w SomeTagName? –

+0

Użyłem dziennika, ale nie zwraca żadnego błędu w debugowaniu, po prostu nie gra. –

Odpowiedz

7

i pobraniu projekt i faktycznie zwraca błąd Kod: E/MediaPlayer (1976): błąd (-38, 0)

Jest to spowodowane uruchomieniem mediaplayer przed jego przygotowaniem.

Dokonałem kilku zmian i zaczęło działać.Należy:

  1. Set onPrepared słuchacz na MediaPlayer (tj onCreate)

    player.setOnPreparedListener(new OnPreparedListener() { 
        @Override 
        public void onPrepared(MediaPlayer mp) { 
         mp.start(); 
        } 
    }); 
    
  2. Usuń player.start() z metody play()

  3. zestaw źródło danych w ten sposób (w swojej metody play())

    player.setDataSource(this, Uri.parse("http://69.64.48.96:9880/")); 
    

Działa na moim HTC Sensation z systemem Android 4.0.3

Jeśli potrzebujesz pomocy, daj mi znać.

EDIT: Zapomniałem, ja też usunięte

player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 

Jest zbędny

+0

Chcę Ci podziękować. Dziękujemy za pobranie i przetestowanie projektu, który dotychczas nie rozwiązał problemu, a teraz dzięki Twojej sugestii działało idealnie. Jeszcze raz dziękuję. –

+0

Chciałbym oddać głos w sprawie reputacji, ale nie mogę, ponieważ mam tylko 14 punktów. Ale kiedy dojdziesz, to zrobię. –

2

prepare() wywołanie jest prawdopodobnie blokuje wątku UI (który android 4.0 nienawidzi go, gdy to zrobisz)

Będziesz potrzebować do pracy w wątku tła niczym asynctask. Oto anonimowa wersja implementacji AsyncTask, aby uruchomić w tle play().

public void onClick(View v) { 
    final int id = v.getId(); 
    switch (id) { 
    case R.id.btnPlay: 
     new AsyncTask<Void, Void, Void>(){ 
      @Override 
      protected Void doInBackground(Void... voids) { 
       play(); 
       return null; 
      } 
     }.execute(); 
     break; 
    case R.id.btnStop: 
     stop(); 
     break; 
    } 
} 

Trzeba będzie przeczytać trochę o MediaPlayer's states (gry, przygotowania, zatrzymał się, etc), aby dowiedzieć się, dlaczego dzwoni przygotować zablokuje wątek UI (

uzyskać więcej informacji na AsyncTasks

+0

Niestety jestem początkujący w tym języku i nie rozumiem, jak dostosować go do mojego kodu, czy możesz mi pomóc? Jestem tutaj z wątpliwościami "protected Void doInBackground (Void. .. voids) {". usprawiedliwia nieznajomości –

+0

@EdersondosSantos sprawdzić ten artykuł/doc na [asynctask] (http://developer.android.com/reference/android/os/AsyncTask.html) – petey

+0

Niestety ja nie bardzo rozumiem, jak używać AsyncTask , pomóż mi dostosować go w moim kodzie, musisz zobaczyć inne pliki do tego? Proszę jestem dwa dni w poszukiwaniu rozwiązania i AsyncTask wydaje się być właściwym rozwiązaniem, ale próbowałem wiele razy bez powodzenia. –

0

Nie ustawiłeś żadnego połączenia pomiędzy przyciskami w pliku .xml a kodem.Na metodę onClick nigdy nie jest wywoływana, nawet jeśli naciskasz przyciski.

Zastąp swoją metodę onCreate następującą wersją:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button playButton = (Button) findViewById(R.id.btnPlay); 
    playButton.setOnClickListener(this); 
    Button stopButton = (Button) findViewById(R.id.btnStop); 
    stopButton.setOnClickListener(this); 
    play(); 
} 
+0

Właściwie przyciski działają, zrobiłem połączenie poprzez tag android: onclick = "onClick" w układzie xml –

0

Zawsze jest lepiej w Androidzie, aby wykonać pracę na wątku w tle w postaci IO.

Dotyczy to również MediaPlayer. ale w przypadku MediaPlayer masz już metodę prepareAsync(), aby przygotować MediaPlayer w tle dla ciebie.

Dobrym sposobem na to jest tak:

package com.radiomiriam; 
import java.io.IOException; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Toast; 

public class Main extends Activity implements OnPreparedListener{ 
public String url = "http://69.64.48.96:9880"; 
public MediaPlayer player = new MediaPlayer(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    play(); 
} 

@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; 
} 

public void stop(){ 
    Toast.makeText(getApplicationContext(), "Finalizando...", Toast.LENGTH_SHORT).show(); 
    if(player.isPlaying()){ 
     player.stop(); 
    } 
} 

public void play(){ 
    if(player.isPlaying()){ 
     Toast.makeText(getApplicationContext(), "J? est? em execuç?o!", Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(getApplicationContext(), "Preparando...", Toast.LENGTH_SHORT).show(); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 
     try { 
      player.setDataSource(url); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      player.setOnPreparedListener(this); 
      player.prepareAsync(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
@Override 
public void onPrepared(MediaPlayer mp) { 
    // TODO Auto-generated method stub 
    mp.start(); 
} 
public void onClick(View v) { 
    final int id = v.getId(); 
    switch (id) { 
    case R.id.btnPlay: 
     play(); 
     break; 
    case R.id.btnStop: 
     stop(); 
     break; 
    } 
} 
} 

Ponadto zawsze jest dobra praktyka, aby przeczytać dokumentacje, więc tutaj jest link do MediaPlayer API: MediaPlayer

+0

Witaj Mr.Me, wypróbowałem twój kod, ale niestety to nie działało dobrze . Naprawdę nie wiem, co się dzieje. –

Powiązane problemy