0

我创建了一个包含媒体播放器的活动。当我开始活动时,音乐开始播放。但是当歌曲完成并且当我点击模拟器上的后退按钮时,它显示错误(IllegellStateException)。

这是我的代码。

先谢谢了。

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.audio);
    init();
    imgVw.setImageResource(R.raw.teddy_two);

    prefs = PreferenceManager.getDefaultSharedPreferences(this);

    mp=MediaPlayer.create(Audio_Activity.this,R.raw.ennamo_yadho);
    Log.e("Song is playing","in  Mediya Player ");
    Log.e("Current ","Position -> " + length);
    mp.setLooping(false);
    mp.start();
    btnChapter.setEnabled(false);

    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
    {
        @Override
        public void onCompletion(MediaPlayer mp) 
        {
            // TODO Auto-generated method stub
            mp.stop();
            mp.release();
            btnChapter.setEnabled(true);
            System.out.println("Music is over and Button is enable !!!!!!");
        }
    });

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onPause()
    {
        super.onStop();
        SharedPreferences. Editor prefsEdit = prefs.edit();

        int position = mp.getCurrentPosition();
        prefsEdit.putInt("mediaPosition", position);
        prefsEdit.commit();
    }

    @Override
    protected void onResume() 
    {
        super.onResume();
        System.out.println("Activity is Resume !!!");
        int position = prefs.getInt("mediaPosition", 0);
        mp.seekTo(position);
        mp.start();
    }

    #Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) 
        { 
            if(mp!= null)
            {
                mp.pause();
            }
            //finish();
         return true;
     }
     return super.onKeyDown(keyCode, event);
 }

}

4

6 回答 6

4

finish();Activity类中使用停止Activity并返回

于 2013-07-09T12:23:25.860 回答
1

尝试这个

MediaPlayer player;


public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(), "service started", 100).show();
    if(player.isPlaying())
        player.stop();

    else
        player.start();
    return super.onStartCommand(intent, flags, startId);}
于 2013-07-09T12:28:36.750 回答
0

你在onPause()上得到(IllegelStateException ) 。

要解决这个问题,你需要把,

mp = null;

后,

mp.stop();
mp.release();

因为当您检查mp!=null时 MediaPlayer 已经发布但不是null。所以,如果条件正确并转到mp.pause()mp已经发布,这就是你得到错误的原因。

您还需要在onCompletion()中更改MediaPlayer实例的名称。

public void onCompletion(MediaPlayer mp)

因为它用于stop()release()的 onCompletion() mp。因此,将mp更改为other(like: mp1)

检查这对你有帮助。

于 2013-07-09T12:51:22.557 回答
0
if(mp!= null)
{

   mp.pause();
}

上面的代码片段if ((keyCode == KeyEvent.KEYCODE_BACK))似乎是问题所在。您应该检查播放器是否正在播放。如果它正在播放,则只应调用暂停。

于 2013-07-09T12:19:17.143 回答
0

我认为问题出在这里:

@Override
public void onPause()
{
   super.onPause();//should be onPause and not onStop

   SharedPreferences. Editor prefsEdit = prefs.edit();

   int position = mp.getCurrentPosition();
   prefsEdit.putInt("mediaPosition", position);
   prefsEdit.commit();
}

欲了解更多信息,请阅读此处

于 2013-07-09T12:19:25.397 回答
0

这是 onStop() 的一个实现,它将草稿笔记的内容保存到持久存储中:

@Override

protected void onStop() {
    super.onStop();  // Always call the superclass method first

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}

尽管该onPause()方法在之前被调用过onStop(),但您应该使用它onStop()来执行更大、更占用 CPU 的关闭操作,例如将信息写入数据库。

来自android开发者页面:http: //developer.android.com/training/basics/activity-lifecycle/stopping.html

于 2013-07-09T12:21:06.967 回答