Как воспроизводить звук непрерывно во время изменения ориентации в Android

Я разработал приложение, такое как медиаплеер, чтобы использовать его для воспроизведения аудиофайла из источника, но возникает проблема, когда я изменяю книжную ориентацию на кнопку пейзажа, а другой виджет не работает, а другой - когда я снова меняю альбомную ориентацию на портретную, так что та же самая проблема и кнопка панель поиска не работает

мой код здесь

public class Aarati_Activity extends Fragment
{
    private ImageButton btnplay;
    private SeekBar seekbar;
    MediaPlayer mp;
    private ImageButton btnstop;
    private int finalTime = 0;
    private int startTime = 0;
    private int oneTimeOnly = 0;
    Handler handler=new Handler();

    public Aarati_Activity() {}

    int audiocurrent;
    int audiomax;
    private int mp_progress;    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.activity_aarti_fragment, container, false);

        btnplay=(ImageButton)v.findViewById(R.id.btnplay);
        btnstop=(ImageButton)v.findViewById(R.id.btnstop);
        seekbar=(SeekBar)v.findViewById(R.id.seekbar);
        seekbar.setClickable(true);

        seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

                seekchange();
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
            }
        });



        mp = MediaPlayer.create(getActivity(), R.raw.arti);
        audiomax=mp.getDuration();
        audiocurrent=mp.getCurrentPosition();

        btnstop.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) {
                if(mp.isPlaying())
                {
                        mp.stop();
                        Toast.makeText(getActivity(), "Stop",Toast.LENGTH_LONG).show();
                        btnplay.setImageResource(R.drawable.ic_action_play);

                        try
                        {
                            mp.prepare();
                        } catch (IllegalStateException e) {

                            e.printStackTrace();

                        } catch (IOException e) {

                            e.printStackTrace();
                        }


                }
                    else
                    {
                        Toast.makeText(getActivity(),"Aarti Currently not playing",Toast.LENGTH_SHORT).show();
                    }

            }
        });


        btnplay.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                if(mp.isPlaying())
                {
                    mp.pause();
                    btnplay.setImageResource(R.drawable.ic_action_play);
                    Toast.makeText(getActivity(), "Pause",Toast.LENGTH_SHORT).show();
                    finalTime = mp.getDuration();
                    startTime = mp.getCurrentPosition();
                    if(oneTimeOnly == 0)

                       {
                         seekbar.setMax((int) finalTime);
                         oneTimeOnly = 1;
                       } 
                    seekbar.setProgress((int)startTime);

                    handler.postDelayed(UpdateSongTime,100);

                }
                else
                {   btnplay.setImageResource(R.drawable.ic_action_pause);
                    mp.start();
                    Toast.makeText(getActivity(), "Play",Toast.LENGTH_SHORT).show();
                    finalTime = mp.getDuration();
                    startTime = mp.getCurrentPosition();
                    if(oneTimeOnly == 0)

                      {
                         seekbar.setMax((int) finalTime);
                         oneTimeOnly = 1;
                      } 
                        seekbar.setProgress((int)startTime);

                        handler.postDelayed(UpdateSongTime,100);
                }
            }
        });

        return v;

    }   
    @SuppressLint("NewApi")
    public void seekchange()
       {
           mp_progress=seekbar.getProgress();
           mp.seekTo(mp_progress);
       }

  private Runnable UpdateSongTime = new Runnable() 
    {
     public void run()
        {
         startTime = mp.getCurrentPosition();
         seekbar.setProgress((int)startTime);
         handler.postDelayed(this, 100);
        }
    };
}

2 ответа

Вы должны использовать Сервис для воспроизведения песни. Это позволит вам играть песню, даже если приложение находится в фоновом режиме.

По сути, с точки зрения MVC (Model-View-Controller) Activity - это Controller, иерархия представлений - это View, а View и Controller воссоздаются при каждом изменении ориентации. Между тем, воспроизведение песни принадлежит модели.

Обратите внимание, что у действия есть методы onSaveInstanceState(Bundle) и onCreate (Bundle), и если пакет, переданный в onCreate(), не равен NULL, он содержит информацию, ранее сохраненную в onSaveInstanceState (). И есть также onRetainNonConfigurationInstance (). Когда экран переворачивается, старое действие уничтожается и создается новое действие, и эти методы позволяют старому действию передавать важные данные новому.

Даже после того, как вы создадите сервис, вы должны помнить об этом MVC.

Другие вопросы по тегам