Android:应用程序在关闭并重新打开后崩溃

Android: App crashes after closing and reopening

当用户关闭应用程序然后再次尝试打开时,应用程序崩溃。 class,由于某种原因,导致了麻烦:

public class PageFragment_Bon extends Fragment implements View.OnClickListener{

public static final String ARG_PAGE = "ARG_PAGE";

private int mPage;
private Button start, stop, replay;
private MediaPlayer mediaPlayer;
int [] filer = new int[18];


public static PageFragment_Bon newInstance(int page) {
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, page);
    PageFragment_Bon fragment = new PageFragment_Bon();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPage = getArguments().getInt(ARG_PAGE);
       }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_boenner, container, false);

    start = (Button) view.findViewById(R.id.start);
    start.setOnClickListener(this);

    stop = (Button) view.findViewById(R.id.stop);
    stop.setOnClickListener(this);

    replay = (Button) view.findViewById(R.id.replay);
    replay.setOnClickListener(this);

    filer[2] = R.raw.takbira;
    filer[4] = R.raw.alfatiha;
    filer[14] = R.raw.tashahhud;
    filer[15] = R.raw.salat;
    filer[16] = R.raw.assalam;

    if(filer[mPage] != 0){
        start.setVisibility(View.VISIBLE);
        stop.setVisibility(View.VISIBLE);
        replay.setVisibility(View.VISIBLE);
    }

    return view;
}

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

    if(mediaPlayer != null)
    {
        mediaPlayer.stop();
        mediaPlayer.reset();
        mediaPlayer.release();
    }

}

@Override
public void onClick(View v) {

    if(mediaPlayer == null)
        mediaPlayer = MediaPlayer.create(getActivity().getBaseContext(), filer[mPage]);//add this line

    if(v == start){
            try {
                mediaPlayer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
    }

    else if(v == stop){
        mediaPlayer.pause();
    }

    else if(v == replay){
        mediaPlayer.seekTo(0);
        mediaPlayer.start();
    }
}


@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if(!isVisibleToUser){

        if(mediaPlayer!=null) {
            if (mediaPlayer.isPlaying()) {
                try {
                    mediaPlayer.pause();
                    mediaPlayer.seekTo(0);

                } catch (Exception e) {
                    e.printStackTrace();
                }
                }
            }
        }

    }
}

这是我在 logcat 中得到的:

05-07 13:56:06.726 31550-31550/com.app.hudhud.myapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: com.app.hudhud.myapp, PID: 31550
                                                                  java.lang.RuntimeException: Unable to resume activity {com.app.hudhud.myapp/com.app.hudhud.myapp.Bon}: java.lang.IllegalStateException
                                                                      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4156)
                                                                      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250)
                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1839)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                      at android.os.Looper.loop(Looper.java:158)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                   Caused by: java.lang.IllegalStateException
                                                                      at android.media.MediaPlayer._start(Native Method)
                                                                      at android.media.MediaPlayer.start(MediaPlayer.java:1425)
                                                                      at com.app.hudhud.myapp.PageFragment_Bon.onResume(PageFragment_Bon.java:148)
                                                                      at android.support.v4.app.Fragment.performResume(Fragment.java:2235)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1346)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
                                                                      at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:2898)
                                                                      at android.support.v4.app.FragmentController.dispatchResume(FragmentController.java:223)
                                                                      at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:509)
                                                                      at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:498)
                                                                      at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:172)
                                                                      at android.app.Activity.performResume(Activity.java:7016)
                                                                      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4145)
                                                                      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250) 
                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1839) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                      at android.os.Looper.loop(Looper.java:158) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:7229) 
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

为什么会这样?我错过了什么吗?

注意

Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer._start(Native Method)

当应用程序关闭时,我认为,MediaPlayer 的状态没有得到正确处理。重新启动应用程序时,媒体播放器的状态不同,不支持开始播放。

我认为,当您关闭应用程序时,会调用 onPause() ,您会释放 MediaPlayer 实例。但是当您重新启动应用程序时(也许您从任务管理器的后台启动应用程序),没有初始化的 MediaPlayer 并且您尝试播放媒体。