2015-01-08 17 views
6

Per la riproduzione di musica online sto ottenendo l'eccezione nel fare in background. Non riesco a rimuovere il problema.Impossibile creare il lettore multimediale (usando l'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) 

Questo è il codice:

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

Il collegamento è corretto. Ho menzionato l'eccezione generata sulla riga 89. Si prega di vedere cosa c'è di sbagliato lì.

Grazie in anticipo ...

risposta

13

Non è necessario scrivere il proprio AsyncTask per gestire questa situazione, la classe MediaPlayer ha già il metodo PrepareAsync, che gestirà il caricamento in background per voi.

provare qualcosa di simile:

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(); 
       } 
      } 
     }); 

    } 
} 

Ho anche semplificata parte del codice per il mio bene.

Inoltre, non dimenticate di includere l'autorizzazione INTERNET nel manifesto:

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

+1

Grazie, ho dimenticato di menzionare il permesso internet, il mio codice ora funziona assolutamente bene, ma il motivo per cui hanno semplificato la codice? –

+0

L'ho semplificato perché non hai bisogno del tuo AsyncTask, prepareAsync gestirà il caricamento in background. Il resto era semplicemente click sugli ascoltatori e altri metodi che non avevo bisogno di dimostrare come farlo funzionare per te. –

+0

Grazie, qualsiasi server gratuito sai dove posso caricare il mio mp3, il servizio come questo http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3, dove posso ottenere l'url del mio mp3 –

Problemi correlati