【问题标题】:MediaPlayer always null Can't create handler inside thread that has not called Looper.prepare()MediaPlayer 始终为 null 无法在未调用 Looper.prepare() 的线程内创建处理程序
【发布时间】:2014-10-02 02:01:43
【问题描述】:

我正在尝试使用从我的 api 获得的 json 中的 url 播放 mp3。但是当我点击播放音乐时,它无法播放并出现错误:(我尝试了越来越多但....零。请帮助。

这是我的源代码:

public void playRadioTrack(final RadioTrack radio) {
        new AsyncTask<Void, Integer, Void>() {
            private String maxDurationText;

            protected void onPreExecute() {
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        findViewById(R.id.imgButtonPlay).setVisibility(View.GONE);
                        findViewById(R.id.progressLoadingMedia).setVisibility(View.VISIBLE);
                        //((TextView) findViewById(R.id.txtRadioName)).setText(radio.getName());
                        ((TextView) findViewById(R.id.txtRadioName)).setText("Test thoi ma"); 
                    }
                });
            };

            @Override
            protected Void doInBackground(Void... params) {  
                if (mPlayer == null) {
                Uri uri = Uri.parse(radio.getAudioUrl()); 
                MediaPlayer mPlayer = MediaPlayer.create(ScreenHomeActivity.this, uri);
            }
            mPlayer.stop();
            mPlayer.reset();
            System.out.println(">>>> BUG >>>>" + radio.getAudioUrl());
            Uri uri = Uri.parse("http://admega.vn/anhsai.mp3");
            MediaPlayer mPlayer = MediaPlayer.create(ScreenHomeActivity.this, uri);
            mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {

                @Override
                public void onBufferingUpdate(MediaPlayer mp, int percent) {
                    publishProgress(mp.getDuration(), mp.getCurrentPosition(), percent);
                }
            });
            mPlayer.start(); 
            return null; 
        }

            protected void onProgressUpdate(Integer... values) {
                ((SeekBar) findViewById(R.id.seekBar)).setMax(values[0]);
                ((SeekBar) findViewById(R.id.seekBar)).setProgress(values[1]);
                ((SeekBar) findViewById(R.id.seekBar)).setSecondaryProgress(values[2] * values[0] / 100);
                int seconds = (int) (values[1] / 1000) % 60;
                int minutes = (int) ((values[1] / (1000 * 60)) % 60);
                ((TextView) findViewById(R.id.txtProgress)).setText(minutes + ":" + seconds);
                ((TextView) findViewById(R.id.txtProgress)).setText("");
            };

            protected void onPostExecute(Void result) {
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        findViewById(R.id.imgButtonPlay).setVisibility(View.VISIBLE);
                        findViewById(R.id.progressLoadingMedia).setVisibility(View.GONE);
                    }
                });
            };
        }.execute();

    }

如你所见。我的播放器总是返回 null 并出现错误,如下图所示。 图片在这里: http://i.stack.imgur.com/Uwsmx.png

我认为mp3文件有问题,但不是,我换了新的mp3,还是一样。

【问题讨论】:

  • 为什么要在 AsyncTask 中创建 MediaPlayer?
  • 仅供参考:onPostExecute 已经在 UI 线程上运行。无需明确指定。

标签: android media-player


【解决方案1】:

您正在一个非 Looper 准备的线程上创建它,在 doInBackground 方法中完全在您的代码中。

正如 MediaPlayer 文档所说:

为了接收与这些侦听器相关联的相应回调,应用程序需要在运行自己的 Looper 的线程上创建 MediaPlayer 对象(默认情况下,主 UI 线程运行 Looper)。

两个选项,在 onPreExecute 方法中创建 MediaPlayers,或者在 doInBackground 方法的第一行调用 Looper.prepare()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多