音乐播放器

来源:互联网 发布:数据库实例不可用 编辑:程序博客网 时间:2024/04/29 18:04
step1:设置界面,这里不作详细说明,界面就如上面说示


step2:为各按键设置点击时间,这里采用多个按键触发同一个函数,所以这里采用了switch的选择方式
我们需要把mp3文件放置在sd卡里面
public void mediaplay(View view){
switch (view.getId()) {
case R.id.palybutton:
String filename = et_name.getText().toString();
//文件路径
File audio = new File(Environment.getExternalStorageDirectory(), filename);
if(audio.exists()){
//获取文件的路径
path = audio.getAbsolutePath();
play(0);
}else{
path = null;
Toast.makeText(this, "文件不存在", 1).show();
}
break;

case R.id.pasuebutton:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();//暂停
pause = true;
//将button的内容更改
((Button)view).setText(R.string.continues);
}else{
if(pause){
mediaPlayer.start();//继续播放
pause = false;
//将button的内容更改
((Button)view).setText(R.string.pasuebutton);
}
}
break;
case R.id.resetbutton:
if(mediaPlayer.isPlaying()){
mediaPlayer.seekTo(0);//从当前位置开始播放,即从0开始播放
}else{
if(path!=null){
play(0);
}
}
break;
case R.id.stopbutton:
if(mediaPlayer.isPlaying())
{
mediaPlayer.stop();
}
}
}


step3:
我们需要一个播放功能的函数,建立函数供上面的点击事件的调用
private void play(int position) {
try {
mediaPlayer.reset();//将各项参数恢复到初始到初始状态
//把播放文件的路径传进去
mediaPlayer.setDataSource(path);
//播放器缓冲
mediaPlayer.prepare();
//监听缓冲
mediaPlayer.setOnPreparedListener(new preparedListener(position));

} catch (Exception e) {
e.printStackTrace();
}

}

private final class preparedListener implements OnPreparedListener{

private int position;
public preparedListener(int position) {
this.position = position;
}

@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
if(position>0) mediaPlayer.seekTo(position);
}

}


step4:按需,我们可以设置在其他应用程序来占用的时候我们将播放器暂停,当播放器被重新启动的时候我们又可以继续播放
这是我们利用的是activity的生命周期来对播放器进行播放保存和还原的
@Override
//当程序被其他activity盖过之后就会自动被调用此方法
protected void onPause() {
if(mediaPlayer.isPlaying()){
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
super.onPause();
}

@Override
//当盖过的程序结束后播放器的activity又重新被激活的时候就会自动调用此方法
protected void onResume() {
if(position>0&&path!=null){
play(position);
}
super.onResume();
}

step5:在这里又产生了一个问题,如果我们只需要在电话来临的时候暂停这个播放器的服务,其他程序不需要暂停的话我们就可以这样的设置,前面的暂停服务就不需要了,我们可以重新来定义
在onCreate方法里面,我们就通过系统服务来获得一个TelephonyManager 的对象
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);

然后按需我们需要创建一个PhoneStateListener的对象,在这里创建了一个内部类
private final class MyPhoneListener extends PhoneStateListener{
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING://电话来了
if(mediaPlayer.isPlaying()){
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}

break;

case TelephonyManager.CALL_STATE_IDLE:
if(position>0&&path!=null){
play(position);
}
break;
}
}

}

因为我们利用了电话监听的服务,所以我们需要在manifest里面设置可以访问电话的权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>









完整的工程:
public class MainActivity extends Activity {
private EditText et_name;
private MediaPlayer mediaPlayer;
private String path;
private int position;
private boolean pause;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) this.findViewById(R.id.et_filename);
mediaPlayer = new MediaPlayer();
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
}

private final class MyPhoneListener extends PhoneStateListener{
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING://电话来了
if(mediaPlayer.isPlaying()){
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if(position>0&&path!=null){
play(position);
}
break;
}
}
}
// @Override
// protected void onPause() {
// if(mediaPlayer.isPlaying()){
// position = mediaPlayer.getCurrentPosition();
// mediaPlayer.stop();
// }
// super.onPause();
// }
//
// @Override
// protected void onResume() {
// if(position>0&&path!=null){
// play(position);
// }
// super.onResume();
// }
public void mediaplay(View view){
switch (view.getId()) {
case R.id.palybutton:
String filename = et_name.getText().toString();
File audio = new File(Environment.getExternalStorageDirectory(), filename);
if(audio.exists()){
path = audio.getAbsolutePath();
play(0);
}else{
path = null;
Toast.makeText(this, "文件不存在", 1).show();
}
break;
case R.id.pasuebutton:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();//暂停
pause = true;
((Button)view).setText(R.string.continues);
}else{
if(pause){
mediaPlayer.start();//继续播放
pause = false;
((Button)view).setText(R.string.pasuebutton);
}
}
break;
case R.id.resetbutton:
if(mediaPlayer.isPlaying()){
mediaPlayer.seekTo(0);//从当前位置开始播放,即从0开始播放
}else{
if(path!=null){
play(0);
}
}
break;
case R.id.stopbutton:
if(mediaPlayer.isPlaying())
{
mediaPlayer.stop();
}
}
}
private void play(int position) {
try {
mediaPlayer.reset();//将各项参数恢复到初始到初始状态
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new preparedListener(position));
} catch (Exception e) {
e.printStackTrace();
}
}
private final class preparedListener implements OnPreparedListener{
private int position;
public preparedListener(int position) {
this.position = position;
}
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
if(position>0) mediaPlayer.seekTo(position);
}
}
}





0 0