Android 多个音频片段
作为一个完全的新手,我无法理解这个问题。一个带有活动的应用程序,两个片段,每个片段包含15行,每个行有两个文本视图和一个按钮(用于播放音频片段)。成功启动后,我注意到,如果我不播放音频,它工作正常,我可以轻松导航到任何地方、任何片段或活动,但如果我播放音频,然后尝试移动到其他片段或活动,应用程序就会崩溃。开始时启动的活动仅带有两个按钮来导航到片段。这个应用程序有什么问题?我只添加了第一个片段和一些行。。请建议Android 多个音频片段,android,audio,Android,Audio,作为一个完全的新手,我无法理解这个问题。一个带有活动的应用程序,两个片段,每个片段包含15行,每个行有两个文本视图和一个按钮(用于播放音频片段)。成功启动后,我注意到,如果我不播放音频,它工作正常,我可以轻松导航到任何地方、任何片段或活动,但如果我播放音频,然后尝试移动到其他片段或活动,应用程序就会崩溃。开始时启动的活动仅带有两个按钮来导航到片段。这个应用程序有什么问题?我只添加了第一个片段和一些行。。请建议 package com.misty.multiaudioexperiments;
package com.misty.multiaudioexperiments;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.content.Intent;
import android.media.MediaPlayer;
import android.widget.Button;
public class FragmentOne extends Fragment {
MediaPlayer mp = new MediaPlayer();
@Nullable
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
//return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_fragment_one, container, false);
final Button buttonInFragmentOneToPlayAudioMenInEnglishVar = (Button)view.findViewById(R.id.buttonInFragmentOneToPlayAudioMenInEnglishId);
final Button buttonInFragmentOneToPlayAudioPencilInEnglishVar = (Button)view.findViewById(R.id.buttonInFragmentOneToPlayAudioPencilInEnglishId);
final Button buttonInFragmentOneToPlayAudioPilotInEnglishVar = (Button)view.findViewById(R.id.buttonInFragmentOneToPlayAudioPilotInEnglishId);
final Button buttonInFragmentOneToPlayAudioRunInEnglishVar = (Button)view.findViewById(R.id.buttonInFragmentOneToPlayAudioRunInEnglishId);
final Button buttonInFragmentOneToPlayAudioShoeInEnglishVar = (Button)view.findViewById(R.id.buttonInFragmentOneToPlayAudioShoeInEnglishId);
final Button buttonInFragmentOneForTransitionToContentsVar = (Button)view.findViewById(R.id.buttonInFragmentOneForTransitionToContentsId);
final Button buttonInFragmentOneForTransitionToNextFragmentVar = (Button)view.findViewById(R.id.buttonInFragmentOneForTransitionToNextFragmentId);
buttonInFragmentOneToPlayAudioMenInEnglishVar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp != null) {
if(mp.isPlaying()){
mp.stop();
mp.release();
}
}
mp = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.men);
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mp.release();
mp = null;
}
});
}
});
buttonInFragmentOneToPlayAudioPencilInEnglishVar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp != null) {
if(mp.isPlaying()){
mp.stop();
mp.release();
}
}
mp = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.pencil);
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mp.release();
mp = null;
}
});
}
});
buttonInFragmentOneToPlayAudioPilotInEnglishVar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp != null) {
if(mp.isPlaying()){
mp.stop();
mp.release();
}
}
mp = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.pilot);
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mp.release();
mp = null;
}
});
}
});
buttonInFragmentOneToPlayAudioRunInEnglishVar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp != null) {
if(mp.isPlaying()){
mp.stop();
mp.release();
}
}
mp = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.run);
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mp.release();
mp = null;
}
});
}
});
buttonInFragmentOneToPlayAudioShoeInEnglishVar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp != null) {
if(mp.isPlaying()){
mp.stop();
mp.release();
}
}
mp = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.shoe);
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mp.release();
mp = null;
}
});
}
});
buttonInFragmentOneForTransitionToContentsVar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new Intent(getActivity(), MainActivity.class);
startActivity(intent1);
mp.reset();
mp.release();
mp = null;
}
});
//THIS BUTTON TAKES TO THE NEXT OR FRAGMENT TWO PAGE STOPPING MEDIAPLAYER IF PLAYING
buttonInFragmentOneForTransitionToNextFragmentVar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragmentContainer, new FragmentTwo());
ft.commit();
mp.reset();
mp.release();
mp = null;
}
});
return view;
}
}
您将获得异常,因为当您尝试退出片段时,mp实例为null
mp.reset()
时,将导致异常
解决方案
用if块环绕出口检查:-
if(mp != null){
mp.reset();
mp.release();
mp = null;
}
作为最佳实践,请在两个片段的onStop()
方法中执行此检查,并将其从onClick()
希望这有助于您得到异常,因为当您尝试退出片段时,mp实例为空
mp.reset()
时,将导致异常
解决方案
用if块环绕出口检查:-
if(mp != null){
mp.reset();
mp.release();
mp = null;
}
作为最佳实践,请在两个片段的onStop()
方法中执行此检查,并将其从onClick()
希望这有帮助你能发布崩溃日志吗?我试图复制日志(错误)消息并粘贴到这里,但说很长。。如何添加?只需复制与错误相关的日志,而不是全部。2019-12-22 16:55:45.453 9494-9523/com.misty.multiaudioexperiments E/EGLCodeCommon:GoldfishAddressSpaceHostMemoryLocator:ioctl_ping设备类型=5失败,ret=-1 2019-12-22 16:56:06.078 9494-9494/com.misty.multiaudioexperiments E/AndroidRuntime:致命异常:主进程:com.misty.multiaudioexperiments,PID:9494 java.lang.nullpointer异常:尝试调用虚拟方法'void android.media.MediaPlayer.reset()'在com.misty.multiaudiolaborations.fragment2$16.onClick(fragment2.java:696)上的空对象引用上,您能点击蓝色高亮显示的错误并在文章中告诉发生了什么行吗?你能张贴崩溃的日志猫吗?我试图复制logcat(错误)消息并粘贴到这里,但说它很长。。如何添加?只需复制与错误相关的日志,而不是全部。2019-12-22 16:55:45.453 9494-9523/com.misty.multiaudioexperiments E/EGLCodeCommon:GoldfishAddressSpaceHostMemoryLocator:ioctl_ping设备类型=5失败,ret=-1 2019-12-22 16:56:06.078 9494-9494/com.misty.multiaudioexperiments E/AndroidRuntime:致命异常:主进程:com.misty.multiaudioexperiments,PID:9494 java.lang.nullpointer异常:尝试调用虚拟方法'void android.media.MediaPlayer.reset()在com.misty.multiaudioexperiments.FragmentTwo$16.onClick(FragmentTwo.java:696)上的空对象引用上,您能单击蓝色突出显示的错误并在您的帖子中指出该错误发生在哪一行吗?我按照您的要求添加了“if block”。。现在看来它确实崩溃了。但是请告诉我在哪里以及如何使用onStop()方法。从未使用过它。.onStop()是片段的生命周期方法,所以为了在片段中使用它,您只需使用@override覆盖它。因此,您可以将其粘贴到片段类中:-
@Override public void onStop(){if(mp!=null){mp.reset();mp.release();mp.setOnCompletionListener(null)mp=null;}super.onStop();}
您还可以发布日志猫的最新堆栈跟踪吗?很抱歉输入错误。我想说:“我按照你的要求添加了‘if块’。现在它似乎没有崩溃。”。虽然我没有添加onStop()方法,但它没有崩溃。我使用的onStop()方法:return view;}@Override public void onStop(){if(mp!=null){mp.reset();mp.release();mp=null;}super.onStop();}}}我按照您的要求添加了“if块”。。现在看来它确实崩溃了。但是请告诉我在哪里以及如何使用onStop()方法。从未使用过它。.onStop()是片段的生命周期方法,所以为了在片段中使用它,您只需使用@override覆盖它。因此,您可以将其粘贴到片段类中:-@Override public void onStop(){if(mp!=null){mp.reset();mp.release();mp.setOnCompletionListener(null)mp=null;}super.onStop();}
if(mp != null){
mp.reset();
mp.release();
mp = null;
}
@Override
public void onStop() {
if(mp != null){
mp.reset();
mp.release();
mp = null;
}
super.onStop();
}