繁体   English   中英

非法状态异常媒体播放器

[英]Illegal state exception media player

我的活动中有一个按钮。 单击按钮时,我正在调用finish() ,问题是我在调用完成时收到Illegal state exception 请帮忙。

import java.io.IOException;

import android.app.Activity;
import android.app.ProgressDialog;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.MediaController;
import android.widget.MediaController.MediaPlayerControl;

import com.mds.perfumastic.R;
import com.mds.perfumastic.constants.Constants;

public class AudioPlayerActivity extends Activity implements
    OnPreparedListener , MediaPlayerControl{
    private Handler handler = new Handler();
    private final MediaPlayer mediaPlayer = new MediaPlayer();
    private MediaController mediaController;
    private ProgressDialog progressBar;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_audioplayer);
        progressBar =  new ProgressDialog(this);
        progressBar.setMessage("Playing...");
        progressBar.show();
        String audioUrl = getIntent().getStringExtra(Constants.INTENT_EXTRA_AUDIO_URL);
        mediaController = new MediaController(this);


        try {
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.reset();
            mediaPlayer.setDataSource(audioUrl);
            mediaPlayer.prepare();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    @Override
    public void onPause() {
        super.onPause();
        progressBar.dismiss();
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
    }

    // --MediaPlayerControl
            // methods----------------------------------------------------
            public void start() {
                mediaPlayer.start();
            }

            public void pause() {
                mediaPlayer.pause();
            }

            public int getDuration() {
                return mediaPlayer.getDuration();
            }

            public int getCurrentPosition() {
                return mediaPlayer.getCurrentPosition();
            }

            public void seekTo(int i) {
                mediaPlayer.seekTo(i);
            }

            public boolean isPlaying() {
                return mediaPlayer.isPlaying();
            }

            public int getBufferPercentage() {
                return 0;
            }

            public boolean canPause() {
                return true;
            }

            public boolean canSeekBackward() {
                return true;
            }

            public boolean canSeekForward() {
                return true;
            }

            // --------------------------------------------------------------------------------

            public void onPrepared(final MediaPlayer mediaPlayer) {
                Log.d("TAG", "onPrepared");
                progressBar.hide();
                mediaController.setMediaPlayer(this);
                mediaController.setAnchorView(findViewById(R.id.newView));
                mediaPlayer.start();

                handler.post(new Runnable() {
                    public void run() {
                        mediaController.setEnabled(true);
                        mediaController.show(mediaPlayer.getDuration());
                    }
                });
            }
            /** Use screen touches to toggle the video between playing and paused. */
            @Override
            public boolean onTouchEvent(MotionEvent ev) {
                if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                    } else {
                        mediaPlayer.start();
                        mediaController.show(mediaPlayer.getDuration());
                    }
                    return true;
                } else {
                    return false;
                }
            }
            public void onClick(View v) {
                if(v.getId() == R.id.btn_back) {

                    finish();
                }
            }

}

这是日志消息:

12-12 11:55:34.791: E/AndroidRuntime(1336): FATAL EXCEPTION: main
12-12 11:55:34.791: E/AndroidRuntime(1336): java.lang.IllegalStateException
12-12 11:55:34.791: E/AndroidRuntime(1336):     at android.media.MediaPlayer.getCurrentPosition(Native Method)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at com.mds.perfumastic.activites.AudioPlayerActivity.getCurrentPosition(AudioPlayerActivity.java:80)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at android.widget.MediaController.setProgress(MediaController.java:415)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at android.widget.MediaController.access$500(MediaController.java:71)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at android.widget.MediaController$3.handleMessage(MediaController.java:386)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at android.os.Looper.loop(Looper.java:137)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at android.app.ActivityThread.main(ActivityThread.java:4745)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at java.lang.reflect.Method.invokeNative(Native Method)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at java.lang.reflect.Method.invoke(Method.java:511)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-12 11:55:34.791: E/AndroidRuntime(1336):     at dalvik.system.NativeStart.main(Native Method)

导致此异常的一个可能原因是,即使您正在完成Activity并释放MediaPlayer对象, MediaController仍可能正在查询MediaPlayer对象的当前位置。 在执行mediaPlayer.stop()之前,尝试添加mediaController.hide mediaPlayer.stop()

由于您正在调用finish您可能还需要覆盖onDestroy ,因为onPause用于当Activity进入后台但仍处于活动状态时。

目前,我正在使用MediaPlayer class的项目中。 当应用程序进入onDestroyonBackPressed状态时,我遇到了与您相同的错误。 但是我已经调用了mp.release()方法来释放mediaplayer object. 但这还不够,我仍然遇到相同的错误。 错误归因于我在my Handler使用的getDuration()方法。 所以我只是在调用mp.release();之前添加removeCallbacks()方法mp.release();

mHandler.removeCallbacks(mUpdateTimeTask);

这里的mHandler是我的Handler对象,而mUpdateTimeTask是Runnable。

它为我工作! 这样,我就永远不会收到“ IllegalStateException”错误。 我希望此解决方案可以帮助其他人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM