无法创建媒体播放器(使用url) [英] Unable to create media player (using url)

查看:119
本文介绍了无法创建媒体播放器(使用url)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于播放在线音乐,我在后台执行异常操作.我无法消除问题.

For playing online music I am getting the exception in do in background. I am unable to remove the problem.

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

The link is correct. I have mentioned the exception generated on line 89. Please see what is been wrong at there.

预先感谢...

推荐答案

您无需编写自己的AsyncTask即可解决此问题,MediaPlayer类已经具有一个PrepareAsync方法,该方法将为你.

You don't need to write your own AsyncTask to handle this, the MediaPlayer class already has a PrepareAsync method, which will handle background loading for you.

尝试这样的事情:

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

    }
}

为了我自己,我还简化了一些代码.

I've also simplified some of the code for my own sake.

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

Also, don't forget to include the INTERNET permission in the manifest:

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

这篇关于无法创建媒体播放器(使用url)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆