来电对播放音乐的影响

布局

<EditText
    android:id="@+id/mediaFileName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="gangstabop.mp3">

    <requestFocus />
</EditText>


<LinearLayout
    android:id="@+id/linearButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:id="@+id/playButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放" />

    <SeekBar
        android:id="@+id/playSeekBar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="3dp"
        android:layout_marginTop="5dp"
        android:layout_weight="1" />

    <Button
        android:id="@+id/replayButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="3dp"
        android:text="重播" />
</LinearLayout>

代码

package test.com.mp3;

import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {
    private MediaPlayer mediaPlayer;//媒体播放器
    private Button playButton;
    private Button replayButton;
    private boolean isCellPlay;/*在挂断电话的时候,用于判断是否为是来电时中断*/
    private boolean isSeekBarChanging;//互斥变量,防止进度条与定时器冲突。
    private int currentPosition;//当前音乐播放的进度
    private SeekBar seekBar;
    private Timer timer;
    private static final String TAG = "MediaActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化媒体播放器
        mediaPlayer = new MediaPlayer();

        //监听滚动条事件
        seekBar = (SeekBar) findViewById(R.id.playSeekBar);
        seekBar.setOnSeekBarChangeListener(new MySeekBar());

        // 监听[播放或暂停]事件
        playButton = (Button) findViewById(R.id.playButton);
        playButton.setOnClickListener(new PalyListener());

        //监听[重播]事件
        replayButton = (Button) findViewById(R.id.replayButton);
        replayButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mediaPlayer.reset();
                currentPosition = 0;
                play();
            }
        });

        //监听来电事件
        TelephonyManager phoneyMana = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        phoneyMana.listen(new myPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
    }

    /*销毁时释资源*/
    @Override
    protected void onDestroy() {
        mediaPlayer.release();
        timer.cancel();
        timer = null;
        mediaPlayer = null;
        super.onDestroy();
    }

    /*播放或暂停事件处理*/
    private class PalyListener implements View.OnClickListener {
        public void onClick(View v) {
            if (playButton.getText().toString().equals("暂停")) {
                currentPosition = mediaPlayer.getCurrentPosition();//记录播放的位置
                mediaPlayer.stop();//暂停状态
                playButton.setText("播放");
                timer.purge();//移除所有任务;
            } else {
                mediaPlayer.pause();
                play();
            }
        }
    }

    /*播放处理*/
    private void play() {
        try {
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音频类型
            mediaPlayer.setDataSource("http://file.kuyinyun.com/group1/M00/90/B7/rBBGdFPXJNeAM-nhABeMElAM6bY151.mp3");
            mediaPlayer.prepareAsync();//数据缓冲
                /*监听缓存 事件,在缓冲完毕后,开始播放*/
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                    playButton.setText("暂停");
                    seekBar.setMax(mediaPlayer.getDuration());
                    if (currentPosition > 0)
                        mp.seekTo(currentPosition);
                }
            });
            //监听播放时回调函数
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    if (!isSeekBarChanging) {
                        seekBar.setProgress(mediaPlayer.getCurrentPosition());
                    }
                }
            }, 0, 50);
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), "播放错误", Toast.LENGTH_LONG).show();
            e.printStackTrace();
            System.out.println(e);
        }
    }

    /*来电事件处理*/
    private class myPhoneStateListener extends PhoneStateListener {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
                case TelephonyManager.CALL_STATE_RINGING://来电,应当停止音乐
                    if (mediaPlayer.isPlaying() && playButton.getText().toString().equals("暂停")) {
                        currentPosition = mediaPlayer.getCurrentPosition();//记录播放的位置
                        mediaPlayer.stop();
                        isCellPlay = true;//标记这是属于来电时暂停的标记
                        playButton.setText("播放");
                        timer.purge();//移除定时器任务;
                    }
                    break;
                case TelephonyManager.CALL_STATE_IDLE://无电话状态
                    if (isCellPlay) {
                        isCellPlay = false;
                        mediaPlayer.reset();
                        play();
                    }
                    break;
            }
        }
    }

    /*进度条处理*/
    public class MySeekBar implements SeekBar.OnSeekBarChangeListener {

        public void onProgressChanged(SeekBar seekBar, int progress,
                                      boolean fromUser) {
            // fromUser判断是用户改变的滑块的值
            if (fromUser) {//<span style="color:#ff0000;"> 注意点</span>
                try {
                    if (!mediaPlayer.isPlaying()) {
                        try {
                            mediaPlayer.reset();
                            mediaPlayer.setDataSource("http://file.kuyinyun.com/group1/M00/90/B7/rBBGdFPXJNeAM-nhABeMElAM6bY151.mp3");
                            mediaPlayer.prepareAsync();
                            // mPlayer.prepare();
                            mediaPlayer.start();
                        } catch (IllegalStateException | IOException e) {
                            e.printStackTrace();
                        }
                    }
                    mediaPlayer.seekTo(seekBar.getProgress());
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                }
            }
        }

        /*滚动时,应当暂停后台定时器*/
        public void onStartTrackingTouch(SeekBar seekBar) {
            isSeekBarChanging = true;
        }

        /*滑动结束后,重新设置值*/
        public void onStopTrackingTouch(SeekBar seekBar) {
            isSeekBarChanging = false;
            mediaPlayer.seekTo(seekBar.getProgress());
        }
    }
}

猜你喜欢

转载自blog.csdn.net/TTHHVV/article/details/81779860