您的位置:首页 > 移动开发 > Android开发

android学习之利用MediaPlayer制作音乐播放器

2014-11-11 17:02 519 查看
使用步骤:

 1.先创建MediaPlayer对象

 2.利用setDataSource()方法,将要播放的文件(歌曲)路径给MediaPlayer对象。

 3.利用prepare()方法,进行缓冲(准备阶段)

 4.调用setOnPreparedListener()方法,进行监听是否缓冲好。

 5.当缓冲好,调用start()方法开始播放。

其它方法:

  reset()方法:使得MediaPlayer对象所有参数回到初始状态

  isPlaying()方法:判断是否播放

  start()方法:播放

  seekTo(int position)方法:从哪个地方播放 (postion是播放的位置)

  stop()方法:停止

  pause()方法:暂停

代码部分

Activity部分

package com.example.mp3_strudy_ysq;

import java.io.File;

import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{
private Button start_btn;
private Button pause_btn;
private Button reset_btn;
private Button stop_btn;
private EditText file_path;
private MediaPlayer mediaPlayer;
private String path;//文件路径
private boolean pause;//暂停标志:true.暂停,false.没有暂停
private int position;//当来电话了,播放文件的位置记录
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 初始化个UI组件
* */
start_btn=(Button) findViewById(R.id.start_btn);
pause_btn=(Button) findViewById(R.id.pause_btn);
reset_btn=(Button) findViewById(R.id.reset_btn);
stop_btn=(Button) findViewById(R.id.stop_btn);
file_path=(EditText) findViewById(R.id.file_path);
/**
* 绑定监听
* */
start_btn.setOnClickListener(this);
pause_btn.setOnClickListener(this);
reset_btn.setOnClickListener(this);
stop_btn.setOnClickListener(this);
/**
* 创建MediaPlayer对象
* */
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);
position = 0;
}
break;
}
}
}

@Override
protected void onDestroy() {
System.out.println("执行了我!");
mediaPlayer.release();
mediaPlayer = null;
super.onDestroy();
}

@Override
public void onClick(View v) {
switch (v.getId()) {

case R.id.start_btn:
/**
* 播放
* 第一步:获取输入文件地址,并判断文件是否存在
* 第二步:当文件存在,将文件路径传入到mediaPlayer对象,并进行缓冲文件(准备文件)
* 第三步:设置缓冲(文件准备)监听
* 第四步:当缓冲成功,播放文件
* */
String fileName=file_path.getText().toString();
File file=new File(Environment.getExternalStorageDirectory(), fileName);
if(file.exists()){
//文件存在
path=file.getAbsolutePath();//获取文件绝对路径
play(0);
}else{
path=null;
Toast.makeText(MainActivity.this,R.string.filenoexist,Toast.LENGTH_SHORT).show();
}
break;

case R.id.pause_btn:
/**
* 暂停
* 1.先判断,是否在播放
* 2.当在播放,就执行暂停,并将按钮文本信息改为:继续,标志pause=true.
* 3.不在播放,判断是否是暂停状态(根据标志pause判断),是就继续播放,并将按钮文本信息改为:暂停,标志pause=false
* */
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
pause=true;
pause_btn.setText(R.string.continues);
}else{
if(pause){
mediaPlayer.start();
pause=false;
pause_btn.setText(R.string.pause);
}
}
break;
case R.id.reset_btn:
/**
* 重播
* 1.判先判断,是否在播放
* 2.当在播放,就执行从开始播放
* 3.当不在播放,就判断播放文件路径是否存在,存在就直接播放
* */
if(mediaPlayer.isPlaying()){
mediaPlayer.seekTo(0);
}else{
if(path!=null){
play(0);
}
}
break;
case R.id.stop_btn:
/**
* 停止
* 1.判先判断,是否在播放
* 2.当在播放,就执行停止
* */
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
break;
default:
break;
}

}
public void play(int postion){
try {
mediaPlayer.reset();//将各项数据恢复到初始状态
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();//设置缓冲文件
//设置准备监听
mediaPlayer.setOnPreparedListener(new onPrepared(postion));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class onPrepared implements OnPreparedListener{
private int position;
public onPrepared(int position){
this.position=position;
}

@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();//播放文件
if(position>0)mediaPlayer.seekTo(position);//设置从哪播放

}

}
}

layout的xml配置
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/request"
/>
<EditText
android:id="@+id/file_path"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:id="@+id/start_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start"
/>
<Button
android:id="@+id/pause_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pause"
/>
<Button
android:id="@+id/reset_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reset"
/>
<Button
android:id="@+id/stop_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stop"
/>
</LinearLayout>
</LinearLayout>

权限添加

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: