2015-03-19 49 views
0

我尝试播放流媒体音乐背景和,我用下面的音乐服务类:Android的MediaPlayer的准备失败:状态=与流媒体音乐为0x1

public class MusicService extends Service implements 
     OnErrorListener, MediaPlayer.OnCompletionListener { 

    private static final int NOTIFICATION_ID = 1; 
    private final IBinder mBinder = new ServiceBinder(); 
    MediaPlayer mPlayer; 
    private int length = 0; 
    private Notification mNotification; 

    public MusicService() { 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     mPlayer.stop(); 
    } 

    public class ServiceBinder extends Binder { 
     public MusicService getService() { 
      return MusicService.this; 
     } 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return mBinder; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     mPlayer = new MediaPlayer(); 
     mPlayer.setOnCompletionListener(this); 
     mPlayer.setOnErrorListener(this); 

     if (mPlayer != null) { 
      mPlayer.setLooping(true); 
      mPlayer.setVolume(100, 100); 
     } 

     mPlayer.setOnErrorListener(new OnErrorListener() { 

      public boolean onError(MediaPlayer mp, int what, int extra) { 

       onError(mPlayer, what, extra); 
       return true; 
      } 
     }); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // mPlayer.start(); 
     return START_STICKY; 

    } 

    public void startMusic(String path) { 
     Toast.makeText(this, "pause music", Toast.LENGTH_SHORT).show(); 
     if (mPlayer.isPlaying()) { 
      mPlayer.release(); 
     } 
     try { 
      SongController s = (SongController) DBControllerFactory.getController("queue", this); 
      Log.d("MusicService", Config.SERVICE_ROOT_URL + "uploads/" + ((Song) s.select()[s.getTotalRows() - 1]).getFile() + ".mp3"); 
      mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mPlayer.setDataSource(Config.SERVICE_ROOT_URL + "uploads/" + ((Song) s.select()[s.getTotalRows() - 1]).getFile() + ".mp3"); 
      mPlayer.prepare(); /////error at here 
      mPlayer.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void pauseMusic() { 
     Toast.makeText(this, "pause music", Toast.LENGTH_SHORT).show(); 
     if (mPlayer.isPlaying()) { 
      mPlayer.pause(); 
      length = mPlayer.getCurrentPosition(); 
     } 
    } 

    public void resumeMusic() { 
     Toast.makeText(this, "resume music", Toast.LENGTH_SHORT).show(); 
     if (mPlayer.isPlaying() == false) { 
      mPlayer.seekTo(length); 
      mPlayer.start(); 
     } 
    } 

    public void stopMusic() { 
     //setUpAsForeground("test"); 
     Toast.makeText(this, "stop music", Toast.LENGTH_SHORT).show(); 
     mPlayer.stop(); 
     mPlayer.release(); 
     mPlayer = null; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mPlayer != null) { 
      try { 
       mPlayer.stop(); 
       mPlayer.release(); 
      } finally { 
       mPlayer = null; 
      } 
     } 

    } 

    public boolean onError(MediaPlayer mp, int what, int extra) { 

     Toast.makeText(this, "music player failed", Toast.LENGTH_SHORT).show(); 
     if (mPlayer != null) { 
      try { 
       mPlayer.stop(); 
       mPlayer.release(); 
      } finally { 
       mPlayer = null; 
      } 
     } 
     return false; 
    } 

    void setUpAsForeground(String text) { 
     Intent openIntent = new Intent(getApplicationContext(), MainScreenActivity.class); 
     openIntent.putExtra("action", "opendrawer"); 
     PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 
       0, 
       openIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     mNotification = new Notification(); 
     mNotification.tickerText = text; 
     mNotification.icon = R.drawable.ic_launcher; 
     mNotification.flags |= Notification.FLAG_ONGOING_EVENT; 
     mNotification.setLatestEventInfo(getApplicationContext(), 
       getResources().getString(R.string.app_name), text, pi); 
     startForeground(NOTIFICATION_ID, mNotification); 
    } 
} 

当第一次的音乐播放时,它工作正常,但第二次它给了以下错误:

java.io.IOException: Prepare failed.: status=0x1 
W/System.err﹕ at android.media.MediaPlayer._prepare(Native Method) 
W/System.err﹕ at android.media.MediaPlayer.prepare(MediaPlayer.java:1125) 
...... 

,但如果我删除设备我的应用程序的缓存它再次工作正常。所以我认为这是与缓存有关的问题,但我无法确定问题谁能帮助我吗?

回答

0

开始尝试

if (mpObject.isPlaying()) 
      { 
       mpObject.stop(); 
       mpObject.reset(); 
       mpObject.release(); 
      } 
0

我认为这是在你的try catch块加载的文件有问题之前重置媒体播放器。和BTW你在哪里使用这些方法: 1.startMusic 2.pauseMusic 3.resumeMusic 4.stopMusic

我认为第二次媒体播放器不获取源文件播放和mediaplayer.prepare在尝试catch块没有被调用。 \

尝试将设置源文件的行记录到mediaplayer中播放。让我们知道您在登录猫中获得了什么。

我希望它能帮助你。如果您需要帮助,请随时回复。

+0

Thaks回复...!我已经尝试过记录并获取正确的源路径,正如我第一次播放它时所说的那样,但在此之后它不起作用,即使我关闭了应用程序并重新开始了应用程序,但它在我删除应用程序缓存时仍然有效。 – vedraiyni 2015-03-19 14:29:53

+0

借助你在这里的小解释,我猜想有一个媒体播放器没有获得释放的问题。或者如果它确实如此,我认为它应该使用相同的音频源文件再次创建。 所以现在你需要做一些工作。 1.您必须发布,重置并销毁mediaplayer实例 2.使用源重新创建mediaplayer实例 3.再次启动 – 2015-03-20 05:56:34

+0

问题:正如您所说的那样,即使关闭应用程序并关注应用程序,它也不起作用再次,但它的作品,如果我删除应用程序的缓存“,,,, 记住,你在服务工作,所以你必须明确地销毁它0r停止并再次启动它。因为在其他情况下,服务将继续运行,您的onDestroy方法是不会打电话 – 2015-03-20 06:01:13

0

我认为this是你的解决方案。请让我知道如果这对你有帮助。如果它也不适合你,那么你需要分享你的SongController类的源代码

相关问题