为什么 MediaPlayer 在 android 中的应用重启状态下停止?
Why MediaPlayer stops on app restart state in android?
我制作了一个音板应用程序并且它可以工作但是当我在 phone 上按下主页按钮并且
我单击以恢复应用程序,当我按下声音按钮时它停止工作(崩溃)
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;
}
我的错误Logcat =
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.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)
您是否授予了所需的权限?检查它,请向存储等添加更多代码,或者如果问题是 activity 生命周期,只需添加此代码
@Override
public void onRestart()
{
super.onRestart();
recreate();
finish();
overridePendingTransition(0, 0);
startActivity(getIntent());
overridePendingTransition(0, 0);
}
当应用程序进入后台时,媒体播放器设置为 null,但当 activity 再次进入前台时(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()
方法中初始化和销毁。检查当应用程序进入后台时调用了哪个方法。学。这里有一个link到learn about activity lifecycle。
添加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();
// }
// });
}
}
我制作了一个音板应用程序并且它可以工作但是当我在 phone 上按下主页按钮并且 我单击以恢复应用程序,当我按下声音按钮时它停止工作(崩溃)
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;
}
我的错误Logcat =
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.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)
您是否授予了所需的权限?检查它,请向存储等添加更多代码,或者如果问题是 activity 生命周期,只需添加此代码
@Override
public void onRestart()
{
super.onRestart();
recreate();
finish();
overridePendingTransition(0, 0);
startActivity(getIntent());
overridePendingTransition(0, 0);
}
当应用程序进入后台时,媒体播放器设置为 null,但当 activity 再次进入前台时(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()
方法中初始化和销毁。检查当应用程序进入后台时调用了哪个方法。学。这里有一个link到learn about activity lifecycle。
添加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();
// }
// });
}
}