使用媒体播放器

时间:2018-04-27 04:48:42

标签: java android service android-mediaplayer

我一直在制作音频流应用,但我需要澄清各种问题。首先,我正在使用绑定服务播放音频文件,我有一个play-pause按钮,可以打开和关闭播放器。 这些是我的代码中的问题:

  1. 每次按下播放按钮时,媒体播放器都会被实例化,但这不是什么原因,因为我还需要在需要时暂停播放。

  2. 播放非常慢。 mediaplayer需要花费大量时间来准备和流式传输。

  3. 如果用户大力切换playpause按钮,有时媒体播放器会被初始化两次。

  4. 这里是代码:

    音乐播放器活动

    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();
                }
            }
        }
    

0 个答案:

没有答案
相关问题