【问题标题】:Unable to create media player (using url)无法创建媒体播放器(使用 url)
【发布时间】:2015-01-08 04:25:43
【问题描述】:

对于播放在线音乐,我在后台运行时遇到了异常。我无法消除问题。

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 行产生的异常。请看看那里出了什么问题。

提前谢谢...

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    您不需要编写自己的 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 权限:

    &lt;uses-permission android:name="android.permission.INTERNET"/&gt;

    【讨论】:

    • 谢谢,我忘了说互联网权限,我的代码现在运行得很好,但是为什么你简化了代码?
    • 我简化了它,因为您不需要自己的 AsyncTask,prepareAsync 将处理后台加载。剩下的只是点击侦听器和其他方法,我不需要演示如何让它为您工作。
    • 谢谢,任何你知道的免费服务器我可以在哪里上传我的mp3,像virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3这样的服务,在那里我可以得到我自己的mp3的url
    • Google 云端硬盘。另一件值得注意的事情是,如果您要处理大量音乐文件的播放,请考虑使用服务来处理播放方法。
    • 我试过谷歌驱动器,但它只能选择下载,然后我尝试了 soundcloud,它加载页面然后启动音乐但没有像virginmegastore.me/Library/Music/这样的服务CD_001214/Tracks/Track1.mp3 ,提供这些服务的任何其他替代方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多