簡體   English   中英

為什么 MediaPlayer 在 android 中的應用程序重新啟動 state 時停止?

[英]Why MediaPlayer stops on app restart state in android?

我制作了一個音板應用程序,它可以工作,但是當我按下手機上的主頁按鈕並單擊以恢復應用程序時,當我按下按鈕發出聲音時它停止工作(崩潰)

private MediaPlayer mp;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mp = MediaPlayer.create(this, R.raw.iaminevitable);

        iaminevitable = (Button) findViewById(R.id.iaminevitable);
        iaminevitable.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mp.start();
            }
        });

 @Override
    protected void onStop() {
        super.onStop();
        if (mp != null) {
            mp.reset();
            mp.release();
            mp = null;
        }

我的錯誤日志 =

Process: soundboard.test, PID: 5429
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
        at soundboard.test.MainActivity$6.onClick(MainActivity.java:96)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5293)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

您是否授予了所需的權限? 檢查它,請在存儲等中添加更多代碼,或者如果問題是活動生命周期,只需添加此代碼

@Override
public void onRestart()
{
    super.onRestart();
     recreate();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

當應用程序進入后台時,媒體播放器設置為 null,但當活動再次進入前台時不會重新創建(不調用onCreate() )。 您應該在生命周期的配對回調中處理對象的初始化和銷毀,例如

  • onCreate()onDestroy()

  • onStart()onStop()

  • onResume()onPause()

您應該了解音頻文件所需的activity lifecycle和權限。
如果我是你,我會使用以下權限。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />  

onCreate()中,您應該在onDestroy()方法中初始化和銷毀。 檢查當應用程序進入后台時調用哪個方法。 學。 這是了解活動生命周期的鏈接。

添加 onResume 方法如下

 @Override
        protected void onResume() {
            super.onResume();
            if (mp != null) {
                //if want to start again when open app
                mp.start();

                //play when click button
    //            iaminevitable.setOnClickListener(new View.OnClickListener() {
    //                @Override
    //                public void onClick(View view) {
    //                    mp.start();
    //                }
    //            });
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM