如何在Android的音频恢复活动? [英] How to resume activity with audio in Android?

查看:114
本文介绍了如何在Android的音频恢复活动?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经实现媒体播放器。我只有一个活动。当我开始的活动,我的音乐开始播放时,我preSS后退按钮音乐剪辑处于暂停状态,而当我再次恢复我的活动,音乐恢复正常。但有错误后,我尝试恢复我的应用程序后,歌曲结束了。该应用程序崩溃,并且我得到例外 IllegalStateException异常在后台preSS法( mp.pause(); )。

请低于code看看,并建议如果我做错了什么。

 公共类Audio_Activity扩展活动
{
    私人MediaPlayer的熔点;
    按钮btnStartStop;    INT长;
    共享preferences preFS;
    ImageView的imgVw;    公共无效的onCreate(捆绑savedInstanceState)
    {
        super.onCreate(savedInstanceState);        的setContentView(R.layout.audio);
        在里面();
        imgVw.setImageResource(R.raw.teddy_two);        preFS = preferenceManager.getDefaultShared preferences(本);        MP = MediaPlayer.create(Audio_Activity.this,R.raw.ennamo_yadho);
        Log.e(在Mediya播放器,播放乐曲);
        Log.e(当前,位置 - >中+长度);
        mp.setLooping(假);
        mp.start();
        btnChapter.setEnabled(假);        mp.setOnCompletionListener(新MediaPlayer.OnCompletionListener()
        {
            @覆盖
            公共无效onCompletion(MediaPlayer的MP)
            {
                // TODO自动生成方法存根
                mp.stop();
                mp.release();
                btnChapter.setEnabled(真);
                的System.out.println(音乐是在和按钮使!!!!!!);
            }
        });
    }     @覆盖
        公共无效onConfigurationChanged(配置NEWCONFIG){
            super.onConfigurationChanged(NEWCONFIG);            //检查屏幕的方向
            如果(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
                Toast.makeText(这一点,风景,Toast.LENGTH_SHORT).show();
            }否则如果(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
                Toast.makeText(这一点,肖像,Toast.LENGTH_SHORT).show();
            }
        }     @覆盖
     公共无效的onPause()
     {
          super.onStop();          共享preferences。编辑prefsEdit = prefs.edit();          INT位置= mp.getCurrentPosition();
          prefsEdit.putInt(mediaPosition位置);
          prefsEdit.commit();
        }     @覆盖
        保护无效onResume()
        {
            super.onResume();
            的System.out.println(活动是恢复!!!);                  INT位置= prefs.getInt(mediaPosition,0);
                  mp.seekTo(位置);
        }    @覆盖
    公共布尔的onkeydown(INT键code,KeyEvent的事件)
    {
        如果((键code == KeyEvent.KEY code_BACK))
        {
            如果(熔点!= NULL)
            {
                F(mp.isPlaying())
                {
                    mp.pause();
                }
            }
            完();
            返回true;
        }
        返回super.onKeyDown(键code,事件);
    }
}

下面是我的日志猫

  11月7日至九日:52:01.057:我/的System.out(6854):音乐已经结束,巴顿是使!!!!!!
11月7日至9日:52:03.297:D / AndroidRuntime(6854):关闭VM
11月7日至9日:52:03.297:W / dalvikvm(6854):主题ID = 1:螺纹未捕获的异常退出(组= 0x40a71930)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):致命异常:主要
11月7日至9日:52:03.339:E / AndroidRuntime(6854):java.lang.IllegalStateException
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.media.MediaPlayer.isPlaying(本机方法)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在com.audio_demo.Audio_Activity.onKeyDown(Audio_Activity.java:203)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.view.KeyEvent.dispatch(KeyEvent.java:2609)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.app.Activity.dispatchKeyEvent(Activity.java:2375)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchKeyEvent(PhoneWindow.java:1847)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3701)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3651)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.view.ViewRootImpl $ ViewRootHandler.handleMessage(ViewRootImpl.java:2818)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.os.Handler.dispatchMessage(Handler.java:99)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.os.Looper.loop(Looper.java:137)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在android.app.ActivityThread.main(ActivityThread.java:5041)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在java.lang.reflect.Method.invokeNative(本机方法)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在java.lang.reflect.Method.invoke(Method.java:511)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11月7日至9日:52:03.339:E / AndroidRuntime(6854):在dalvik.system.NativeStart.main(本机方法)
11月7日至9日:52:28.787:I /流程(6854):发送信号。 PID:6854 SIG:9


解决方案

据我了解的问题是关于mp.seekTo(posiotion)在onResume()或mp.getCurrentPosition中的onPause()方法。该异常不能因为没有初始化的媒体播放器。根据听者当歌曲完成后,您让您的播放器停止,释放,在onResume在线mp.seekTo(位置)引起的异常。在OnCompletion删除mp.release()线()方法,并在onResume和onpPause方法。
有你需要做的另一件事。使用您code布尔值,以了解您的媒体播放器是否播放完毕或没有。更改onCreat象下面这样:

 公共无效的onCreate(捆绑savedInstanceState)
    {
        super.onCreate(savedInstanceState);        的setContentView(R.layout.audio);
        在里面();
        imgVw.setImageResource(R.raw.teddy_two);        preFS = preferenceManager.getDefaultShared preferences(本);        MP = MediaPlayer.create(Audio_Activity.this,R.raw.ennamo_yadho);
        Log.e(在Mediya播放器,播放乐曲);
        Log.e(当前,位置 - >中+长度);
        mp.setLooping(假);
        mp.start();
        prefsEdit.putInt(mediaplaying,真正的);
        prefsEdit.commit();
        btnChapter.setEnabled(假);    mp.setOnCompletionListener(新MediaPlayer.OnCompletionListener()
    {
        @覆盖
        公共无效onCompletion(MediaPlayer的MP)
        {
            // TODO自动生成方法存根
            mp.stop();
            prefsEdit.putInt(mediaplaying,FALSE);
            prefsEdit.commit();
            btnChapter.setEnabled(真);
            的System.out.println(音乐是在和按钮使!!!!!!);
        }
    });     @覆盖
     公共无效的onPause()
     {
          super.onStop();          共享preferences。编辑prefsEdit = prefs.edit();
          布尔IsPlaying模块= prefs.getBoolean(mediaplaying,FALSE);
          如果(IsPlaying模块){
              INT位置= mp.getCurrentPosition();
              prefsEdit.putInt(mediaPosition位置);
              prefsEdit.commit();
          }
        }     @覆盖
        保护无效onResume()
        {
            super.onResume();
            的System.out.println(活动是恢复!!!);
            布尔IsPlaying模块= prefs.getBoolean(mediaplaying,FALSE);
            如果(IsPlaying模块){
                INT位置= prefs.getInt(mediaPosition,0);
                mp.seekTo(位置);
            }
        }

I have implemented media player. I have only one Activity. When I'm starting the activity, my music starts to play and when I press the back button the music clip is in pause state, and again when I resume my activity, the music resumes properly. But there is error after I try to resume my Application after song got over. The app crashed, and I'm getting exception for IllegalStateException in back-press method( mp.pause();).

Please have a look at below code and suggest if I am doing something wrong.

public class Audio_Activity extends Activity 
{
    private  MediaPlayer mp;
    Button btnStartStop ;

    int length;
    SharedPreferences prefs;
    ImageView imgVw;

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

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

Here is my Log Cat

07-09 11:52:01.057: I/System.out(6854): Music is over and Button is enable !!!!!!
07-09 11:52:03.297: D/AndroidRuntime(6854): Shutting down VM
07-09 11:52:03.297: W/dalvikvm(6854): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-09 11:52:03.339: E/AndroidRuntime(6854): FATAL EXCEPTION: main
07-09 11:52:03.339: E/AndroidRuntime(6854): java.lang.IllegalStateException
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.media.MediaPlayer.isPlaying(Native Method)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at com.audio_demo.Audio_Activity.onKeyDown(Audio_Activity.java:203)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.view.KeyEvent.dispatch(KeyEvent.java:2609)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.app.Activity.dispatchKeyEvent(Activity.java:2375)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1847)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3701)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3651)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2818)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.os.Looper.loop(Looper.java:137)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at android.app.ActivityThread.main(ActivityThread.java:5041)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at java.lang.reflect.Method.invokeNative(Native Method)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at java.lang.reflect.Method.invoke(Method.java:511)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-09 11:52:03.339: E/AndroidRuntime(6854):     at dalvik.system.NativeStart.main(Native Method)
07-09 11:52:28.787: I/Process(6854): Sending signal. PID: 6854 SIG: 9

解决方案

As I Understand the problem is about mp.seekTo(posiotion) in onResume() or mp.getCurrentPosition in onPause() method. That exception can because of not initializing the media player. According to the listener when the song finished you make your player stop and released and in onResume on line mp.seekTo(position) caused that exception. Remove mp.release() line in OnCompletion() method and in onResume and onpPause methods. There's another thing you need to do. use a boolean value in your code to understand whether your mediaplayer finished playing or not. Change your onCreat like below:

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();
        prefsEdit.putInt("mediaplaying", true);
        prefsEdit.commit();
        btnChapter.setEnabled(false);

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

     @Override
     public void onPause()
     {
          super.onStop();

          SharedPreferences. Editor prefsEdit = prefs.edit();
          boolean isPlaying=prefs.getBoolean("mediaplaying",false);
          if(isPlaying){
              int position = mp.getCurrentPosition();
              prefsEdit.putInt("mediaPosition", position);
              prefsEdit.commit();
          }
        }

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

这篇关于如何在Android的音频恢复活动?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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