Java 如何在Android中使用音频恢复活动?

Java 如何在Android中使用音频恢复活动?,java,android,media-player,Java,Android,Media Player,我已经实现了媒体播放器。我只有一项活动。当我开始活动时,我的音乐开始播放,当我按下后退按钮时,音乐剪辑处于暂停状态,再次当我恢复活动时,音乐正常恢复。但在宋结束后,我尝试恢复我的申请后出现了错误。应用程序崩溃了,我在back-press方法(mp.pause();)中遇到异常 请看一下下面的代码,并建议我是否做错了什么 public class Audio_Activity extends Activity { private MediaPlayer mp; Button b

我已经实现了媒体播放器。我只有一项活动。当我开始活动时,我的音乐开始播放,当我按下后退按钮时,音乐剪辑处于暂停状态,再次当我恢复活动时,音乐正常恢复。但在宋结束后,我尝试恢复我的申请后出现了错误。应用程序崩溃了,我在back-press方法(
mp.pause();
)中遇到异常

请看一下下面的代码,并建议我是否做错了什么

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);
    }
}
这是我的原木猫

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

据我所知,问题在于onResume()中的mp.seekTo(posiotion)或onPause()方法中的mp.getCurrentPosition。由于未初始化媒体播放器,可能会出现该异常。根据听者的说法,当歌曲结束时,你让你的播放机停止并释放,在mp.seekTo(位置)线上的onResume中导致了该异常。删除OnCompletion()方法以及onResume和onpPause方法中的mp.release()行。 你还需要做另一件事。在代码中使用布尔值来了解mediaplayer是否已完成播放。更改onCreat,如下所示:

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

源代码中只有一行空白就足够了!我不确定你说的错误是在
onBackPressed
还是
onResume
中,但是试着把你的
mp.pause()
放在
onPause()
mp.start()
放在
onResume()
中,你有播放/暂停按钮吗?(你可以在任何按钮上播放/暂停歌曲?)是的,我已经完成了播放和暂停/恢复歌曲按钮。但在我尝试恢复应用程序后,又出现了一个错误@当歌曲结束时,它崩溃了为什么?致命的异常:android.media.MediaPlayer的main、java.lang.IllegalStateException和E/AndroidRuntime(5075):在com.audio\u demo.audio\u Activity.onKeyDown(audio\u Activity.java:205)。我的应用程序仍然没有正常运行。音乐已结束,按钮处于启用状态!!!!!07-09 12:36:43.748:E/MediaPlayer(7528):错误(-38,0)07-09 12:36:43.748:E/MediaPlayer(7528):错误(-38,0)谢谢你,穆罕默德。我已经成功地跑了。非常感谢你的合作。