Потоковое аудио с медиа-проигрывателем - PullRequest
0 голосов
/ 27 апреля 2018

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

  1. Медиаплеер запускается каждый раз, когда я нажимаю кнопку воспроизведения, но это не то, потому что мне также необходимо приостановить воспроизведение при необходимости.

  2. Воспроизведение очень медленное. mediaplayer подготовка и передача занимает много времени.

  3. Иногда медиаплеер инициализируется дважды, если пользователь энергично нажимает кнопку playpause.

Вот код:

Активность музыкального проигрывателя

btn_play_pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!playPause) {
                    btn_play_pause.setImageResource(R.drawable.pause_button);
                    if (initialStage) {
                        musicService.play();
                        Toast.makeText(MusicPlayerActivity.this, "Playing started", Toast.LENGTH_SHORT).show();
                    }
                    playPause = true;
                } else {
                    btn_play_pause.setImageResource(R.drawable.play_button);
                    Toast.makeText(MusicPlayerActivity.this, "Playing paused", Toast.LENGTH_SHORT).show();
                    playPause = false;
                    musicService.pause();
                }
            }

        });
    }

Музыкальный сервис

 public class MusicService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener{
        private final IBinder mBinder = new MusicService.AudioBinder();
        private MediaPlayer mediaPlayer;
        private AudioManager audioManager;
        private AudioManager.OnAudioFocusChangeListener audioFocusChangeListener;
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            Toast.makeText(this, "Network Error", Toast.LENGTH_LONG).show();
            mediaPlayer.reset();
            return false;

        }
      @Override
    public void onPrepared(MediaPlayer mp) {
        try {
            mp.setDataSource(stream_source);
            mp.prepareAsync();
           mp.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
        @Override
        public void onBufferingUpdate(MediaPlayer mp, int percent) {
            mediaPlayer =  mp;
        }

        @Override
        public void onCompletion(MediaPlayer mp) {
            mediaPlayer = mp;
        }


        public class AudioBinder extends Binder {
            public MusicService getService() {
                //Return this instance of RadioBinder so clients can call public methods
                return MusicService.this;
            }
        }

        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return mBinder;
        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            if (intent != null && intent.getAction() != null) {
                switch (intent.getAction()) {
                    case Constants.ACTION_STOP_AUDIO_SERVICE:
                        hideNotification();
                        Intent i = new Intent(this, MainActivity.class);
                        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        i.addFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP);
                        i.putExtra("close_activity",true);
                        this.startActivity(i);
                        break;
                    case Constants.ACTION_STREAM_PLAY_PAUSE:
                        if (isPlaying()) {
                            pause();
                            showNotification();
                            stopForeground(false); // stop making it a foreground service but leave the notification there
                        } else {
                            play();
                            showNotification();
                        }
                        break;
                    default:
                        break;
                }
            }

            return START_STICKY;
        }

        @Override
        public void onCreate() {
            setUpAudioManager();
  mediaPlayer = new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

        }


        public void play() {     
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.setOnErrorListener(this);
            showNotification();
        }

        public void pause() {
            if(mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
                audioManager.abandonAudioFocus(audioFocusChangeListener);
            }
            showNotification();
        }


        public boolean isPlaying() {
            return mediaPlayer != null && (mediaPlayer.isPlaying());
        }

        @Override
        public boolean stopService(Intent name) {
            if (mediaPlayer != null){
                mediaPlayer.release();
                mediaPlayer = null;
            }
            return super.stopService(name);
        }
        public void hideNotification() {
            stopForeground(true);
        }

        @Override
        public void onDestroy() {
            if(mediaPlayer!= null){
                mediaPlayer.release();
            }
            super.onDestroy();
        }
        public void releaseTrack(){
            if(mediaPlayer!= null){
                mediaPlayer.release();
            }
        }
    }
...