长沙哪里学网站建设,德阳做网站的公司,网络游戏推广,中国排名第一的游戏大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能#xff0c;在Android的界面上#xff0c;Music和Video两个应用程序都是调用MediaPlayer实现的。 首先来看看MediaPlayer的生命周期#xff… 大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能在Android的界面上Music和Video两个应用程序都是调用MediaPlayer实现的。 首先来看看MediaPlayer的生命周期 从MediaPlayer的生命周期图或者说是状态转移图上来看 当一个MediaPlayer对象别创建或者调用reset()方法之后它处于空闲状态在调用release()方法后才会处于结束状态。 一个新建的MediaPlayer对象在调用getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamType(int), setLooping(boolean), setVolume(float,float), pause(), start(), stop(), seekTo(int), prepare(), prepareAsync()方法时不会触发OnErrorListener.onError()事件但是MediaPlayer对象如果调用了reset()方法后再使用这些方法则会触发OnErrorListener.onError()事件。当MediaPlayer对象不再被使用时最好通过release()方法来释放使其处于结束状态以免造成不必要的错误。当MediaPlayer处于结束状态是便不能再使用。MediaPlayer对象被新建时处于空闲状态如果通过creat()方法创建之后便处于准备状态。一般情况下一些常用的播放控制操作可能因为音频、视频的格式不被支持或者质量较差以及流超时也有可能由于开发者的疏忽使得MediaPlayer对象处于无效状态而导致错误。这时可以通过注册setOnErrorListener()方法实现OnErrorListener.onError()方法来监控这些错误。如果发生了错误MediaPlayer对象将处于错误状态可以使用reset()方法来恢复错误。任何MediaPlayer对象都必须先处于准备状态然后才开始播放。要开始播放MediaPlayer对象都必须成功调用start()方法。可以通过isPlaying()方法来检测当前是否正在播放。当MediaPlayer对象在播放时可以进行暂停和停止等操作pause()方法暂停播放stop()方法停止播放。处于暂停状态时可以通过start()方法来恢复播放但是处于停止状态则必须先调用pause()方法处于准备状态然后再通过start()方法来开始播放。可以通过setLooping(boolean)方法来设置是否循环播放。 下边是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 停止播放 至此可以得出Android中通过MediaPlayer来播放音乐的步骤 MediaPlayer mp new MediaPlayer();//构建MediaPlayer对象mp.setDataSource(/sdcard/test.mp3);//设置文件路径mp.prepare();//准备mp.start();//开始播放 MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的为了构建一个MediaPlayer程序上层还包含了进程间通讯等内容这种进程间通讯的基础是Android基本库中的Binder机制。 而我们今天的例子只是利用MediaPlayer来播放res/raw文件夹中一首非常动听的英文哥Avril Lavigne - Complicated.mp3.程序有4个ImageButton按钮,播放,停止,重播和暂停!4个按钮的功能我就不用多说.下面我将Step By Step教你如何完成本Demo的实现.本实例可以实现音乐播放器除了来电的时候会暂停播放通话结束后恢复播放外打开其他的Activity都可以继续播放音乐享受一边听音乐一边做其他的事情。 Step 1 :新建一个Android工程,命名为AudioPlayer Step 2 :准备素材,将Avril Lavigne - Complicated.mp3导入到SDCard中 Step 3: 设计UI布局,在main.xml里放入4个ImageButton,代码如下: ?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationvertical android:layout_widthfill_parentandroid:layout_heightfill_parentTextView android:layout_widthwrap_contentandroid:layout_height40dp android:textstring/file_nameandroid:idid/textView /EditText android:layout_widthfill_parentandroid:layout_heightwrap_content android:idid/file_name android:textAvril Lavigne - Complicated.mp3/LinearLayout android:orientationhorizontalandroid:layout_widthfill_parent android:layout_heightwrap_contentButton android:layout_widthwrap_contentandroid:layout_heightwrap_content android:textstring/button_playandroid:onClickmediaPlay android:idid/button_play /Button android:layout_widthwrap_contentandroid:layout_heightwrap_content android:textstring/button_pauseandroid:onClickmediaPlay android:idid/button_pause /Button android:layout_widthwrap_contentandroid:layout_heightwrap_content android:textstring/button_replayandroid:onClickmediaPlay android:idid/button_replay /Button android:layout_widthwrap_contentandroid:layout_heightwrap_content android:textstring/button_stopandroid:onClickmediaPlay android:idid/button_stop //LinearLayout
/LinearLayout string.xml ?xml version1.0 encodingutf-8?
resourcesstring namehelloHello World, MainActivity!/stringstring nameapp_name音乐播放器/stringstring namefile_name请输入音乐文件名/stringstring namefile_noexist音乐文件不存在/stringstring namebutton_play播放/stringstring namebutton_pause暂停/stringstring namebutton_continue继续/stringstring namebutton_replay重播/stringstring namebutton_stop停止/string
/resourcesStep 4 :主控制程序MainActivity.java的实现,代码如下: package cn.roco.mp3;import java.io.File;import android.app.Activity;
import android.content.Context;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {private TextView textView;private EditText file_name_Text;private String filePath;private MediaPlayer mediaPlayer;private boolean pause;private int playPosition;/** Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);textView(TextView) this.findViewById(R.id.textView);file_name_Text (EditText) this.findViewById(R.id.file_name);mediaPlayer new MediaPlayer();TelephonyManager telephonyManager(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);}/*** 只有电话来了之后才暂停音乐的播放*/private final class MyPhoneListener extends android.telephony.PhoneStateListener{Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_RINGING://电话来了if (mediaPlayer.isPlaying()) {playPosition mediaPlayer.getCurrentPosition();// 获得当前播放位置mediaPlayer.stop();}break;case TelephonyManager.CALL_STATE_IDLE: //通话结束if (playPosition 0 filePath ! null) {play(playPosition);playPosition 0;}break;}}}/*// 当该窗口处于不可见的时候触发Overrideprotected void onPause() {if (mediaPlayer.isPlaying()) {playPosition mediaPlayer.getCurrentPosition();// 获得当前播放位置mediaPlayer.stop();}super.onPause();}// 当该窗口处于重新回到前台时候触发Overrideprotected void onResume() {if (playPosition 0 filePath ! null) {play();mediaPlayer.seekTo(playPosition);playPosition 0;}super.onResume();}*/Overrideprotected void onDestroy() {mediaPlayer.release();mediaPlayer null;super.onDestroy();}public void mediaPlay(View v) {switch (v.getId()) {// 播放按钮case R.id.button_play:String fileName file_name_Text.getText().toString();File audio new File(Environment.getExternalStorageDirectory(),fileName);if (audio.exists()) {// 文件存在filePath audio.getAbsolutePath(); // 文件绝对路径play(0); // 播放音乐textView.setText(音乐开始播放...);} else {filePath null;Toast.makeText(getApplicationContext(), R.string.file_noexist,1).show();}break;// 暂停按钮case R.id.button_pause:if (mediaPlayer.isPlaying()) {// 如果正在播放mediaPlayer.pause();// 暂停pause true;textView.setText(音乐暂停播放...); ((Button) v).setText(R.string.button_continue);// 文字暂停--继续} else {if (pause) {// 如果处于暂停状态mediaPlayer.start();// 继续播放pause false;textView.setText(音乐继续播放...); ((Button) v).setText(R.string.button_pause);// 文字继续--暂停}}break;// 重播按钮case R.id.button_replay:if (mediaPlayer.isPlaying()) {textView.setText(音乐重新播放...); mediaPlayer.seekTo(0);// 从开始位置开始播放音乐} else {if (filePath ! null) {play(0);}}break;// 停止按钮case R.id.button_stop:if (mediaPlayer.isPlaying()) {textView.setText(音乐停止播放...); mediaPlayer.stop();}break;}}/*** 播放音乐* param playPosition */private void play(int playPosition) {try {mediaPlayer.reset();// 把各项参数恢复到初始状态/*** 通过MediaPlayer.setDataSource() 的方法,将URL或文件路径以字符串的方式传入.使用setDataSource ()方法时,要注意以下三点:1.构建完成的MediaPlayer 必须实现Null 对像的检查.2.必须实现接收IllegalArgumentException 与IOException 等异常,在很多情况下,你所用的文件当下并不存在.3.若使用URL 来播放在线媒体文件,该文件应该要能支持pragressive 下载.*/mediaPlayer.setDataSource(filePath);mediaPlayer.prepare();// 进行缓冲mediaPlayer.setOnPreparedListener(new MyPreparedListener(playPosition));} catch (Exception e) {e.printStackTrace();}}private final class MyPreparedListener implementsandroid.media.MediaPlayer.OnPreparedListener {private int playPosition;public MyPreparedListener(int playPosition) {this.playPositionplayPosition;}Overridepublic void onPrepared(MediaPlayer mp) {mediaPlayer.start();// 开始播放if (playPosition0) {mediaPlayer.seekTo(playPosition);}}}} Step 5:由于加入了监听电话的功能所以要在AndroidManifest.xml中配置权限 ?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidpackagecn.roco.mp3android:versionCode1android:versionName1.0uses-sdk android:minSdkVersion8 /!-- 注意这里要加入一个监听电话的权限 --uses-permission android:nameandroid.permission.READ_PHONE_STATE/uses-permissionapplication android:icondrawable/icon android:labelstring/app_nameactivity android:name.MainActivityandroid:labelstring/app_nameintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity/application
/manifest Step 6: 运行效果如下,一首动听的Avril Lavigne - Complicated.mp3在播放... 1 23 45 6 如果想加入进度条等功能 可以参考 Android MediaPlayer播放网络音频的实例--网络mp3播放器 这篇文章 作者欧阳鹏 欢迎转载与人分享是进步的源泉 转载请保留原文地址http://blog.csdn.net/ouyang_peng 转载于:https://www.cnblogs.com/ouyangpeng/archive/2013/04/09/8538414.html