Android中的MediaPlayer的使用详解 您所在的位置:网站首页 视频循环播放是什么意思 Android中的MediaPlayer的使用详解

Android中的MediaPlayer的使用详解

2024-06-08 07:52| 来源: 网络整理| 查看: 265

今天本文介绍的是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

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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有