在动手写这篇学习笔记的时候其实我是沮丧的,因为此前的两天时间我都在折腾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();
}
}