【问题标题】:If home button is pressed without playing the audio, then the app crashes如果在没有播放音频的情况下按下主页按钮,则应用程序崩溃
【发布时间】:2016-08-24 21:45:02
【问题描述】:
如果我按下主页按钮而不播放音频。该应用程序崩溃了,但是当我播放音频并按下主页按钮时它可以完美运行。
这是我的代码:
@Override
protected void onPause()
{
Context context = getApplicationContext();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
if (!taskInfo.isEmpty()) {
ComponentName topActivity = taskInfo.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
play.pause();
but19.setBackgroundResource(R.drawable.play);
}
}
super.onPause();
}
@Override
public void onBackPressed(){
if(play!=null && (play.isPlaying())){
if(play.isPlaying())
play.stop();
play.release();
}
super.onBackPressed();
}
【问题讨论】:
标签:
android
audio
android-mediaplayer
activity-manager
【解决方案1】:
它的崩溃是因为当你暂停它时播放是空的,所以添加 chcek
在调用暂停状态之前。
将play.pause();改为
if( play!=null && play.isPlaying()){
play.pause();
}
完整代码:
@Override
protected void onPause()
{
Context context = getApplicationContext();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
if (!taskInfo.isEmpty()) {
ComponentName topActivity = taskInfo.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
if( play!=null && play.isPlaying()){
play.pause();
}
but19.setBackgroundResource(R.drawable.play);
}
}
super.onPause();
}
【解决方案2】:
问题出在onPause() 方法中。
您需要检查play 是否正在播放,然后像在onBackPressed() 中那样暂停它
最好也检查 null 以避免崩溃
【解决方案3】:
Media框架是一个非常严格的state machine,处理各种不同的状态真的很麻烦。
如果问题是NullPointerException,请添加空检查。
但即使它不为空,您将在生产中崩溃,因为 pause() 只允许在 {Started, Paused, PlaybackCompleted} 状态下调用,否则它会导致您的应用崩溃。
当音频正在播放时,它处于您的onPause() { play.pause() } 的正确状态。
请查看我的回答 here 以获得 MediaPlayer 的辅助包装器,它可以简化状态检查。
【解决方案4】:
如果您提供错误日志会更好。不过,也许我可以回答你的问题:
if(play!=null && (play.isPlaying()))
在上面的 if 中,当音频没有播放时,变量 play 可能为“null”,然后应用程序将尝试验证第二个表达式 (play.isPlaying()),因为 play 为 null,它会抛出一个NullPointerException.
在播放音频时,这两个表达式为真,因为 play 不为 null 并且正在播放音频,所以这可能是您的应用在播放音频时不会崩溃的原因。
我不知道我是否足够清楚,但我希望它有所帮助。
干杯