Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多个音频片段_Android_Audio - Fatal编程技术网

Android 多个音频片段

Android 多个音频片段,android,audio,Android,Audio,作为一个完全的新手,我无法理解这个问题。一个带有活动的应用程序,两个片段,每个片段包含15行,每个行有两个文本视图和一个按钮(用于播放音频片段)。成功启动后,我注意到,如果我不播放音频,它工作正常,我可以轻松导航到任何地方、任何片段或活动,但如果我播放音频,然后尝试移动到其他片段或活动,应用程序就会崩溃。开始时启动的活动仅带有两个按钮来导航到片段。这个应用程序有什么问题?我只添加了第一个片段和一些行。。请建议 package com.misty.multiaudioexperiments;

作为一个完全的新手,我无法理解这个问题。一个带有活动的应用程序,两个片段,每个片段包含15行,每个行有两个文本视图和一个按钮(用于播放音频片段)。成功启动后,我注意到,如果我不播放音频,它工作正常,我可以轻松导航到任何地方、任何片段或活动,但如果我播放音频,然后尝试移动到其他片段或活动,应用程序就会崩溃。开始时启动的活动仅带有两个按钮来导航到片段。这个应用程序有什么问题?我只添加了第一个片段和一些行。。请建议

  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引用
  • 每次播放音频时,mp引用都将无效
  • 案例1:

    如果您在没有播放任何音频的情况下留下片段,则不会对实例进行更改,因此不会出现任何异常

    案例2:

    如果在播放一些音频后留下片段,mp实例将设置为null,因此当您尝试对null实例调用
    mp.reset()
    时,将导致异常

    解决方案

    用if块环绕出口检查:-

    if(mp != null){
         mp.reset();
         mp.release();
         mp = null;
    }
    
    作为最佳实践,请在两个片段的
    onStop()
    方法中执行此检查,并将其从
    onClick()


    希望这有助于

    您得到异常,因为当您尝试退出片段时,mp实例为空

  • 创建片段的新实例时,将实例化mp引用
  • 每次播放音频时,mp引用都将无效
  • 案例1:

    如果您在没有播放任何音频的情况下留下片段,则不会对实例进行更改,因此不会出现任何异常

    案例2:

    如果在播放一些音频后留下片段,mp实例将设置为null,因此当您尝试对null实例调用
    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();
        }