2015-01-08 12 views
6

Do odtwarzania muzyki online uzyskuję wyjątek w tle w tle. Nie mogę usunąć problemu.Nie można utworzyć odtwarzacza multimedialnego (przy użyciu adresu URL)

01-08 09:42:05.199: E/MediaPlayer(16257): Unable to to create media player 
01-08 09:42:05.209: W/System.err(16257): java.io.IOException: setDataSource failed.: status=0x80000000 
01-08 09:42:05.229: W/System.err(16257): at android.media.MediaPlayer._setDataSource(Native Method) 
01-08 09:42:05.229: W/System.err(16257): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1000) 
01-08 09:42:05.229: W/System.err(16257): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:960) 
01-08 09:42:05.229: W/System.err(16257): at com.example.audioplayer.MainActivity$Player.doInBackground(MainActivity.java:89) 
01-08 09:42:05.229: W/System.err(16257): at com.example.audioplayer.MainActivity$Player.doInBackground(MainActivity.java:1) 
01-08 09:42:05.229: W/System.err(16257): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
01-08 09:42:05.229: W/System.err(16257): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
01-08 09:42:05.229: W/System.err(16257): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
01-08 09:42:05.229: W/System.err(16257): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
01-08 09:42:05.239: W/System.err(16257): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
01-08 09:42:05.239: W/System.err(16257): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
01-08 09:42:05.239: W/System.err(16257): at java.lang.Thread.run(Thread.java:856) 
01-08 09:42:05.389: D/Prepared(16257): //false 
01-08 09:42:05.389: E/MediaPlayer(16257): start called in state 1 
01-08 09:42:05.389: E/MediaPlayer(16257): error (-38, 0) 
01-08 09:42:05.449: E/MediaPlayer(16257): Error (-38,0) 

Jest to kod:

public class MainActivity extends Activity { 
private Button btn; 
/** 
* help to toggle between play and pause. 
*/ 
private boolean playPause; 
private MediaPlayer mediaPlayer; 
/** 
* remain false till media is not completed, inside OnCompletionListener make it true. 
*/ 
private boolean intialStage = true; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
btn = (Button) findViewById(R.id.button1); 
mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
btn.setOnClickListener(pausePlay); 

} 

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

private OnClickListener pausePlay = new OnClickListener() { 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    // TODO Auto-generated method stub 

    if (!playPause) { 
     btn.setBackgroundResource(R.drawable.button_pause); 
     if (intialStage) 
      new Player() 
        .execute("http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3"); 
     else { 
      if (!mediaPlayer.isPlaying()) 
       mediaPlayer.start(); 
     } 
     playPause = true; 
    } else { 
     btn.setBackgroundResource(R.drawable.button_play); 
     if (mediaPlayer.isPlaying()) 
      mediaPlayer.pause(); 
     playPause = false; 
    } 
} 
}; 
/** 
* preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread. 
* @author piyush 
* 
*/ 

class Player extends AsyncTask<String, Void, Boolean> { 
private ProgressDialog progress; 

@Override 
protected Boolean doInBackground(String... params) { 
    // TODO Auto-generated method stub 
    Boolean prepared; 
    try { 

     mediaPlayer.setDataSource(params[0]);//line 89 

     mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       // TODO Auto-generated method stub 
       intialStage = true; 
       playPause=false; 
       btn.setBackgroundResource(R.drawable.button_play); 
       mediaPlayer.stop(); 
       mediaPlayer.reset(); 
      } 
     }); 
     mediaPlayer.prepare(); 
     prepared = true; 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     Log.d("IllegarArgument", e.getMessage()); 
     prepared = false; 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     prepared = false; 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     prepared = false; 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     prepared = false; 
     e.printStackTrace(); 
    } 
    return prepared; 
} 

@Override 
protected void onPostExecute(Boolean result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    if (progress.isShowing()) { 
     progress.cancel(); 
    } 
    Log.d("Prepared", "//" + result); 
    mediaPlayer.start(); 

    intialStage = false; 
} 

public Player() { 
    progress = new ProgressDialog(MainActivity.this); 
} 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
    this.progress.setMessage("Buffering..."); 
    this.progress.show(); 

} 
} 

@Override 
protected void onPause() { 
// TODO Auto-generated method stub 
super.onPause(); 
if (mediaPlayer != null) { 
    mediaPlayer.reset(); 
    mediaPlayer.release(); 
    mediaPlayer = null; 
} 
} 
} 

Link jest poprawny. Wspomniałem o wyjątku wygenerowanym w linii 89. Proszę zobaczyć, co tam było nie tak.

góry dzięki ...

Odpowiedz

13

Nie trzeba pisać własne AsyncTask obsłużyć to klasa MediaPlayer ma już PrepareAsync metodę, która będzie obsługiwać ładowanie tła dla Ciebie.

spróbować czegoś takiego:

package com.mypackage.test; 

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

import java.io.IOException; 

public class MainActivity extends Activity { 

    private Button btn; 
    private MediaPlayer mediaPlayer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn = (Button) findViewById(R.id.button1); 

     setVolumeControlStream(AudioManager.STREAM_MUSIC); 
     mediaPlayer = new MediaPlayer(); 
     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     try { 
      mediaPlayer.setDataSource("http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3"); 
      mediaPlayer.prepareAsync(); 
      mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) { 
        mediaPlayer.start(); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mediaPlayer.isPlaying()) { 
        mediaPlayer.pause(); 
       } else { 
        mediaPlayer.start(); 
       } 
      } 
     }); 

    } 
} 

Ja również uprościć niektóre kodu dla mojego własnego dobra.

Ponadto, nie zapomnij dołączyć pozwolenie Internet w manifeście:

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

+1

Dzięki, I zapomnieć o pozwolenie internetowego, mój kod działa teraz absolutnie w porządku, ale dlaczego zostały uproszczone kod? –

+0

Uprościliśmy to, ponieważ nie potrzebujesz własnego AsyncTask, readyAsync będzie obsługiwać ładowanie w tle. Resztę stanowili słuchacze kliknięć i inne metody, których nie potrzebowałem, aby pokazać, jak to działa. –

+0

Dzięki, każdy darmowy serwer, wiesz gdzie mogę wgrać mój mp3, usługa taka jak ta http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3, gdzie mogę uzyskać adres URL mojego mp3 –

Powiązane problemy