android – 无法创建媒体播放器(使用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)

这是代码

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

链接是正确的.我已经提到了第89行产生的异常.请看那里出了什么问题.

提前致谢…

解决方法

您不需要编写自己的AsyncTask来处理这个问题,MediaPlayer类已经有一个PrepareAsync方法,它将为您处理后台加载.

尝试这样的事情:

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

    }
}

我也为了自己的缘故简化了一些代码.

另外,不要忘记在清单中包含INTERNET权限:

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...