【Android】多媒体编程——MediaPlayer音频播放

时间:2020-12-02 05:52:46

在动手写这篇学习笔记的时候其实我是沮丧的,因为此前的两天时间我都在折腾ANDROID多媒体编程这块,所谓多媒体编程就是指调用Android提供的api对文本、图片、音频、视频等做相应的处理,比如图片的的旋转、平移等基本的操作,音频、视频的播放、录制等操作。

在这篇文章中,我主要总结多媒体编程中的音频播放的解决方案。参考了很多本书,包括传智播客高教部的《Android移动应用基础教程》以及清华大学出版社的《精通Android应用开发》,还有我最初接触Android的第一本书,郭霖大神的《第一行代码—Android》等三本书。

Android多媒体编程一个不容忽视的api就是MediaPlayer。它在底层很好地封装了对音频、视频播放的reset()start()pause()prepare()setDataSource()stop()等方法,他们的具体用法如下

setDataSource()----把播放的音频文件以字符串作为参数
prepare()----播放前调用此方法完成播放的准备工作
start()----开始播放、或者继续播放
pause()----暂停播放
reset()----将MediaPlayer对象重置到刚刚创建时的状态
release()----停止播放前由MediaPlayer对象调用此方法,释放底层多媒体资源
stop()----停止播放,此时MediaPlayer对象将会被销毁
seekTo()----从指定位置开始播放,接收一个currentPosition的时间参数
isPlaying()----判断当前是否正在播放,若正在播放返回true
getDuration()----获取音频文件的总时长

另外组要格外注意,我在这个地方就踩过一次坑。设置播放的数据源有三种方式

MediaPlayer.create(this, R.raw.文件名);    // 播放应用res/raw目录下的音频文件
mediaPlayer.setDataSource("sdcard/文件名.mp3"); // 播放sd卡中的音频文件
mediaPlayer.setDataSource("http://www.xxx.mp3"); // 播放网络上的音频文件

下面贴出一个完整的案例,具体代码如下。布局文件如下

<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:orientation="vertical" >

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/_play"
android:onClick="play_music"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/_pause"
android:onClick="pause_music"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/_stop"
android:onClick="stop_music"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/_contin"
android:onClick="continue_music"
/>


</LinearLayout>

MusicInterface接口中抽取了四个方法,具体如下

package com.example.musicplayer.service;

public interface MusicInterface {

void play_music();
void pause_music();
void continue_music();
void stop_music();

}

MusicService类如下

package com.example.musicplayer.service;

import com.example.musicplayer.R;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;

public class MusicService extends Service {

MediaPlayer player;


@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new MusicBinder();
}

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
player = new MediaPlayer();
// player.setAudioStreamType(AudioManager.STREAM_MUSIC);


}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
// 此方法调用,player就会被释放资源然后销毁
player.release();
player = null;
}



class MusicBinder extends Binder implements MusicInterface {

@Override
public void play_music() {
// TODO Auto-generated method stub
MusicService.this.play_music();
}

@Override
public void pause_music() {
// TODO Auto-generated method stub
MusicService.this.pause_music();
}

@Override
public void continue_music() {
// TODO Auto-generated method stub
MusicService.this.continue_music();
}

@Override
public void stop_music() {
// TODO Auto-generated method stub
MusicService.this.stop_music();
}
}

private void play_music() {
// TODO Auto-generated method stub
player.reset();
try {
// 播放sd卡上的MP3
// player.setDataSource("sdcard/ykzzldx.mp3");
// 播放资源文件的MP3
player.create(this, R.raw.wdgsl);
player.prepare();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
player.start();

}

private void pause_music() {
// TODO Auto-generated method stub
player.pause();
}

private void continue_music() {
// TODO Auto-generated method stub
player.start();
}

private void stop_music() {
// TODO Auto-generated method stub
player.stop();
}

}

MainAvtivity代码如下

package com.example.musicplayer;

import com.example.musicplayer.service.MusicInterface;
import com.example.musicplayer.service.MusicService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;

public class MainActivity extends Activity {

MusicInterface mi;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent intent = new Intent(this, MusicService.class);
startService(intent);
bindService(intent, new MyServiceConn(), BIND_AUTO_CREATE);
}

class MyServiceConn implements ServiceConnection {

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mi = (MusicInterface) service;
}

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub

}

}

public void play_music(View v) {
mi.play_music();
}
public void pause_music(View v) {
mi.pause_music();
}
public void continue_music(View v) {
mi.continue_music();
}
public void stop_music(View v) {
mi.stop_music();
}

}