1.创建程序
创建一个名为MusicPlayer的应用程序,指定包名为cn.itcast.musicplayer,设计用户交互界面,具体代码如下:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_inputpath"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Music\a.mp3"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tv_play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="3dp"
android:drawableTop="@drawable/play"
android:gravity="center"
android:text="播放"
/>
<TextView
android:id="@+id/tv_pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="3dp"
android:drawableTop="@drawable/pause"
android:gravity="center"
android:text="暂停"
/>
</LinearLayout>
</LinearLayout>
在上述代码中,添加一个EditText控件用于输入音频文件名称,添加一个LinearLayout布局,在该布局中放置了两个TextView控件用于实现播放、暂停的单击事件。TextView中的android:derawabletop属性用于设置文字上方的图片。
2.创建服务类
下面创建一个Service类,指定名称MusicService,该类用于实现音乐的播放和暂停功能,具体代码如下:
package com.czt.musicplayer;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
public class MusicService extends Service {
private static final String TAG = "MusicService";
public MediaPlayer mediaPlayer;
class MyBinder extends Binder{
//播放音乐
public void play(String path) {
try{
if (mediaPlayer == null){
//创建一个MediaPlayer播放器
mediaPlayer = new MediaPlayer();
//指定参数为音频文件
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//指定播放的路径
mediaPlayer.setDataSource(path);
//准备播放
mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
}else {
int position = getCurrentProgress();
mediaPlayer.seekTo(position);
try {
mediaPlayer.prepare();
}catch (Exception e){
e.printStackTrace();
}
mediaPlayer.start();
}
}catch (Exception e){
e.printStackTrace();
}
}
//暂停播放
public void pause(){
if (mediaPlayer != null && mediaPlayer.isPlaying()){
mediaPlayer.pause();//暂停播放
}else if (mediaPlayer != null && (!mediaPlayer.isPlaying())){
mediaPlayer.start();
}
}
}
public void onCreate(){
super.onCreate();
}
//获取当前速度
public int getCurrentProgress(){
if (mediaPlayer !=null & mediaPlayer.isPlaying()){
return mediaPlayer.getCurrentPosition();
}else if (mediaPlayer != null & (!mediaPlayer.isPlaying())){
return mediaPlayer.getCurrentPosition();
}
return 0;
}
public void onDestroy() {
if (mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
//第一步执行onBind方法
return new MyBinder();
}
}
在上述代码中,完成了音乐的播放、暂停功能。通过onBind()f方法将MyBinder对象返回给访问者,从而完成访问者和Service的通信,并实现了对音乐播放器的操作。
上述代码中使用了MediaPlayer类实现播放音乐功能,接下来简单介绍一下MediaPlayer类中的常用的方法。
- setAudioStreamType(): 指定音频文件的类型,必须在prepare()方法之前调用;
- setDataSource(): 设置要播放的音频文件的位置,Uri路径;
- prepare(): 准备播放,调用此方法会使MediaPlayer进入准备状态;
- start(): 开始或继续播放音频;
- pause(): 暂停播放音频;
- seeKTo: 从指定的位置开始播放音频;
- release():释放掉与MediaPlayer对象相关的资源;
- isPlaying(): 判断当前MediaPlayer是否正在播放音频;
- getCurrentPosition(): 获取当前播放音频文件的位置。
编写界面交互代码
接下来在MainActivity中实现播放、暂停按钮的单击事件,具体代码如下:
MainActivity.java
package com.czt.musicplayer;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Environment;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.File;
public class MainActivity extends AppCompatActivity implements
View.OnClickListener {
private EditText path;
private Intent intent;
private myConn conn;
MusicService.MyBinder binder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
path = (EditText) findViewById(R.id.et_inputpath);
findViewById(R.id.tv_play).setOnClickListener(this);
findViewById(R.id.tv_pause).setOnClickListener(this);
conn = new myConn();
intent = new Intent(this,MusicService.class);
bindService(intent,conn,BIND_AUTO_CREATE);
}
private class myConn implements ServiceConnection {
public void onServiceConnected(ComponentName name, IBinder service){
binder = (MusicService.MyBinder)service;
}
public void onServiceDisconnected(ComponentName name){
}
}
@Override
public void onClick(View v) {
String pathway = path.getText().toString().trim();
File SDpath = Environment.getExternalStorageDirectory();
File file = new File(SDpath,pathway);
String path = file.getAbsolutePath();
switch (v.getId()){
case R.id.tv_play:
if (file.exists() && file.length() >0){
binder.play(path);
}else {
Toast.makeText(this,"找不到音乐文件",Toast.LENGTH_SHORT).show();
}
break;
case R.id.tv_pause:
binder.pause();
break;
default:
break;
}
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
}
在上述代码中,在onCreate()方法中绑定服务,并且实现播放和暂停按钮的监听事件。
4.运行程序
运行音乐播放器之前,首先将指定的音频文件导入到模拟器的mnt/sdcard/Muaic目录中。如图所示:
导入音频文件
运行音乐播放器程序,在音乐播放器程序中填写音频文件sdcard文件夹中的全部路径,如音频文件在sdcard文件夹中的Music文件夹中,需要填写音频路径为“Music.mp3”,运行结果如图所示
运行结果
网友评论