今天本文介绍的是Andriod系统自带的Mediaplayer,和VideoView实现简单的音乐和视频的播放,至于想做出如酷狗音乐这样的APP的话,只要想做,应该也不难,都是基于此实现了功能的扩展。
Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer来实现的。
一、播放音频文件
首先看看MediaPlaer的生命周期
下面是MediaPlayer提供的常用方法
方法 | 说明 |
---|---|
MediaPlayer | 构造方法 |
create | 创建一个要播放的多媒体 |
getCurrentPosition | 得到当前播放位置 |
getDuration | 得到文件的时间 |
getVideoHeight | 得到视频的高度 |
getVideoWidth | 得到视频的宽度 |
isLooping | 是否循环播放 |
isPlaying | 是否正在播放 |
pause | 暂停 |
prepare | 准备(同步) |
prepareAsync | 准备(异步) |
release | 释放MediaPlayer对象相关的资源 |
reset | 重置MediaPlayer对象为刚刚创建的状态 |
seekTo | 指定播放的位置(以毫秒为单位的时间) |
setAudioStreamType | 设置流媒体的类型 |
setDataSource | 设置多媒体数据来源(位置) |
setDisplay | 设置用SurfaceHolder来显示多媒体 |
setLooping | 设置是否循环播放 |
setOnButteringUpdateListener | 网络流媒体的缓冲监听 |
setOnErrorListener | 设置错误信息监听 |
setOnVideoSizeChangedListener | 视频尺寸监听 |
setScreenOnWhilePlaying | 设置是否使用SurfaceHolder来保持屏幕显示 |
setVolume | 设置音量 |
start | 开始播放 |
stop | 停止播放 |
MediaPlayer的工作流程是这样的:
1、首先创建MediaPlaer对象;
2、然后调用setDataSource()方法来设置音频文件的路径;
3 、再调用prepare()方法使MediaPlayer进入到准备状态;
4 、调用start方法就可以播放音频。
创建MediaPlaer对象有两种方式
1、直接new出来
MediaPlayer mp = new MediaPlayer();
2、使用create方式
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了
当然上面首先得在res文件夹下新建raw文件夹,并放置一个test文件
设置播放的文件
MediaPlayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
例如:
MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他文件路径下的媒体文件
例如:
mp.setDataSource("/sdcard/test.mp3");
c. 网络上的媒体文件
例如:
mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");
MediaPlayer的setDataSource一共四个方法:
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)
其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
下面是实现代码
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="播放" />
<Button
android:id="@+id/pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="暂停" />
<Button
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止" />
</LinearLayout>
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="0"
android:progress="0"
android:secondaryProgress="0" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="当前时间" />
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="总时间" />
</RelativeLayout>
</LinearLayout>
MainActivity.java
package com.example.musicplayer;
import java.io.File;
import java.io.IOException;
import android.R.integer;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener,
OnSeekBarChangeListener {
private Button play, pause, stop;
private MediaPlayer player;
private SeekBar mSeekBar;
private TextView tv, tv2;
private boolean hadDestroy = false;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0x01:
break;
default:
break;
}
};
};
Runnable runnable = new Runnable() {
@Override
public void run() {
if (!hadDestroy) {
mHandler.postDelayed(this, 1000);
int currentTime = Math
.round(player.getCurrentPosition() / 1000);
String currentStr = String.format("%s%02d:%02d", "当前时间 ",
currentTime / 60, currentTime % 60);
tv.setText(currentStr);
mSeekBar.setProgress(player.getCurrentPosition());
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = (Button) findViewById(R.id.play);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
mSeekBar = (SeekBar) findViewById(R.id.seekbar);
tv = (TextView) findViewById(R.id.tv);
tv2 = (TextView) findViewById(R.id.tv2);
mSeekBar.setOnSeekBarChangeListener(this);
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
player = new MediaPlayer();
initMediaplayer();
}
/** * 初始化播放器 */
private void initMediaplayer() {
try {
File file = new File(Environment.getExternalStorageDirectory()
+ "/Download/", "aiqiu.mp3");
player.setDataSource(file.getPath());
Log.e("播放器", file.toString());
player.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if (!player.isPlaying()) {
player.start();
int totalTime = Math.round(player.getDuration() / 1000);
String str = String.format("%02d:%02d", totalTime / 60,
totalTime % 60);
tv2.setText(str);
mSeekBar.setMax(player.getDuration());
mHandler.postDelayed(runnable, 1000);
}
break;
case R.id.pause:
if (player.isPlaying()) {
player.pause();
}
break;
case R.id.stop:
if (player.isPlaying()) {
player.reset();
initMediaplayer();
}
break;
default:
break;
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (player != null) {
player.seekTo(seekBar.getProgress());
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO 自动生成的方法存根
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO 自动生成的方法存根
}
@Override
protected void onDestroy() {
// TODO 自动生成的方法存根
super.onDestroy();
if (player != null) {
player.stop();
hadDestroy = true;
player.release();
}
}
}
二、播放视频文件
播放视频文件相比播放音频文件并不比它复杂,
这里使用VideoView类来实现。这个类将视频的显示和控制集于一身。
VideoView和MediaPlaer也比较类似,主要有以下常用方法
方法名 | 功能描述 |
---|---|
setVideoPath() | 设置要播放的视频文件的位置。 |
start() | 开始或继续播放视频。 |
pause() | 暂停播放视频。 |
resume() | 将视频重头开始播放。 |
seekTo() | 从指定的位置开始播放视频。 |
isPlaying() | 判断当前是否正在播放视频。 |
getDuration() | 获取载入的视频文件的时长。 |
因为VideoView是包装过的MediaPlayer,所以使用起来很相似。
比如:
private void initVideoPlayer() {
File file = new File(Environment.getExternalStorageDirectory()
+ "/Download/", "Sample.3gp");
videoPlayer.setVideoPath(file.getPath());// 指定视频文件的路径
}
事件处理
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if (!videoPlayer.isPlaying()) {
videoPlayer.start();
}
break;
case R.id.pause:
if (videoPlayer.isPlaying()) {
videoPlayer.pause();
}
break;
case R.id.stop:
if (videoPlayer.isPlaying()) {
videoPlayer.resume();
}
break;
default:
break;
}
}
三、常见的MediaPlayer错误
也就是它的错误状态。比如这样的错误 start called in state 0,0表示他的错误状态,下面是MediaPlayer的状态,源码中找到的:
enum media_player_states {
MEDIA_PLAYER_STATE_ERROR = 0, // 0状态
MEDIA_PLAYER_IDLE = 1 << 0, // 1状态
MEDIA_PLAYER_INITIALIZED = 1 << 1, // 2 状态
MEDIA_PLAYER_PREPARING = 1 << 2, // 4 状态
MEDIA_PLAYER_PREPARED = 1 << 3, // 8状态
MEDIA_PLAYER_STARTED = 1 << 4, // 16状态
MEDIA_PLAYER_PAUSED = 1 << 5, // 32状态
MEDIA_PLAYER_STOPPED = 1 << 6, // 64 状态
MEDIA_PLAYER_PLAYBACK_COMPLETE = 1 << 7, // 128 状态
}
可以参照报错的状态和MediaPlayer的生命周期(上图)进行错误分析。
今天的文章Android中的MediaPlayer的使用详解分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24439.html