- 浏览: 325159 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xuanyuanxiaoxue:
...
Android - LayoutInflater -
柴兴博:
不错 多谢
Android 悬浮Activity并可拖动(访悬浮歌词) -
di1984HIT:
写的很好,我收藏一下。
java之动态代理模式(JDK和cglib) -
chinacssnj:
待测试,明天测,测试的结果发给大家
网络开发上传文件到服务器 -
fx_199182:
...
Android之MediaPlayer
Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
首先我们的播放器可能不只是希望播放一种格式的音乐,而且还需要自动识别指定的路径中哪些是可以播放的音频文件,哪些是不支持的格式,我们可以通过下面的代码来过滤文件类型:
class MusicFilter implements FilenamFilter{ public boolean accept(File dir,String name){ return(name.endWith(".mps3")); } }
现在我们已经得到了能够播放的音频文件,如何来实现一个播放列表的界面呢?本例我们使用ListActivity布局来实现。但是我们还需要几个按钮来表示开始、暂停等操作,我们使用ImageButton来实现,下面是我们的播放器的界面。
现在我们需要指定音乐文件的位置,本例我们设置路径为“/sdcard/”,因此我们需要向SD卡中添加音频文件。步骤如下:启动模拟器,在Eclipse上选择DDMS窗口,选择File Explorer标签,向左、向右箭头分别是拷贝进、拷贝出指定位置,减号则是删除选中的文件。
现在我们只需要设置这些ImageButton按钮的时间来处理相应的动作即可播放音乐,首先调用Reset(),这样做将重置MediaPlayer到它的正常状态,这是必须的。如果正在放一首歌曲,同事又想去改变这个数据源,这个Reset()功能也将停止任何正在播放的歌曲。因此,如果一首歌曲是播放状态,同事我们又要选择另一首歌曲,那么它将在启动下一首歌曲之前停止这首正在播放的歌曲。然后我们通过路径找到这首歌曲(setDataSource(String))同事调用prepare()和Start()。在这里指向MediaPlayer将启动播放你的歌曲。接下来的工作就是去装备一个OnCompletionLister(setOnCompletionListener(newOnCompletionListener())).在歌曲结束的时候,onCompletion(MediaPlayer)这个功能将被调用。比如我们可以在这里设置自动播放下一首歌曲。下面我们老看看具体的实现代码。
package com.yarin.android.Examples_07_01; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.ListView; public class Activity01 extends ListActivity { /* 几个操作按钮 */ private ImageButton mFrontImageButton = null; private ImageButton mStopImageButton = null; private ImageButton mStartImageButton = null; private ImageButton mPauseImageButton = null; private ImageButton mNextImageButton = null; /* MediaPlayer对象 */ public MediaPlayer mMediaPlayer = null; /* 播放列表 */ private List<String> mMusicList = new ArrayList<String>(); /* 当前播放歌曲的索引 */ private int currentListItme = 0; /* 音乐的路径 */ private static final String MUSIC_PATH = new String("/sdcard/"); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* 更新显示播放列表 */ musicList(); /* 构建MediaPlayer对象 */ mMediaPlayer = new MediaPlayer(); mFrontImageButton = (ImageButton) findViewById(R.id.LastImageButton); mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton); mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton); mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton); mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton); //停止按钮 mStopImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View v) { /* 是否正在播放 */ if (mMediaPlayer.isPlaying()) { //重置MediaPlayer到初始状态 mMediaPlayer.reset(); } } }); //开始按钮 mStartImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View v) { playMusic(MUSIC_PATH + mMusicList.get(currentListItme)); } }); //暂停 mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener() { public void onClick(View view) { if (mMediaPlayer.isPlaying()) { /* 暂停 */ mMediaPlayer.pause(); } else { /* 开始播放 */ mMediaPlayer.start(); } } }); //下一首 mNextImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View arg0) { nextMusic(); } }); //上一首 mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View arg0) { FrontMusic(); } }); } public boolean onKeyDown(int keyCode, KeyEvent event) { if ( keyCode == KeyEvent.KEYCODE_BACK) { mMediaPlayer.stop(); mMediaPlayer.release(); this.finish(); return true; } return super.onKeyDown(keyCode, event); } @Override /* 当我们点击列表时,播放被点击的音乐 */ protected void onListItemClick(ListView l, View v, int position, long id) { currentListItme = position; playMusic(MUSIC_PATH + mMusicList.get(position)); } /* 播放列表 */ public void musicList() { //取得指定位置的文件设置显示到播放列表 File home = new File(MUSIC_PATH); if (home.listFiles(new MusicFilter()).length > 0) { for (File file : home.listFiles(new MusicFilter())) { mMusicList.add(file.getName()); } ArrayAdapter<String> musicList = new ArrayAdapter<String>(Activity01.this,R.layout.musicitme, mMusicList); setListAdapter(musicList); } } private void playMusic(String path) { try { /* 重置MediaPlayer */ mMediaPlayer.reset(); /* 设置要播放的文件的路径 */ mMediaPlayer.setDataSource(path); /* 准备播放 */ mMediaPlayer.prepare(); /* 开始播放 */ mMediaPlayer.start(); mMediaPlayer.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer arg0) { //播放完成一首之后进行下一首 nextMusic(); } }); }catch (IOException e){} } /* 下一首 */ private void nextMusic() { if (++currentListItme >= mMusicList.size()) { currentListItme = 0; } else { playMusic(MUSIC_PATH + mMusicList.get(currentListItme)); } } /* 上一首 */ private void FrontMusic() { if (--currentListItme >= 0) { currentListItme = mMusicList.size(); } else { playMusic(MUSIC_PATH + mMusicList.get(currentListItme)); } } } /* 过滤文件类型 */ class MusicFilter implements FilenameFilter { public boolean accept(File dir, String name) { //这里还可以设置其他格式的音乐文件 return (name.endsWith(".mp3")); } }
现在我们已经知道如何播放指定SD卡上的音乐了,但是大家是否想到,我们在应用时(比如游戏中的音效),肯定是需要和我们的程序一起打包发布的,这样音乐就没有存在于SD卡上了,一般情况下会放在应用的目录下的“res\raw\”中,那么如何播放这样的音乐呢,其实很简单,只需要把上面的例子中的setDataSource 方法改成有create方法来创建一个指定的资源索引的MediaPlayer对象,其他操作基本一。代码如下:
package com.yarin.android.Examples_07_02; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; public class Activity01 extends Activity { private ImageButton mStopImageButton; private ImageButton mStartImageButton; private ImageButton mPauseImageButton; private TextView mTextView; private boolean bIsReleased = false; private boolean bIsPaused = false; private boolean bIsPlaying = false; public MediaPlayer mMediaPlayer = new MediaPlayer(); ; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton); mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton); mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton); mTextView = (TextView) findViewById(R.id.TextView01); //停止按钮 mStopImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View v) { if (bIsPlaying == true) { if ( !bIsReleased ) { mMediaPlayer.stop(); mMediaPlayer.release(); bIsReleased = true; } bIsPlaying = false; mTextView.setText("当前处于停止状态,请按开始进行音乐播放!"); } } }); //开始按钮 mStartImageButton.setOnClickListener(new ImageButton.OnClickListener() { @Override public void onClick(View v) { try { if ( !bIsPlaying ) { bIsPlaying = true; /* 装载资源中的音乐 */ mMediaPlayer = MediaPlayer.create(Activity01.this, R.raw.test); bIsReleased = false; /* 设置是否循环 */ mMediaPlayer.setLooping(true); try { mMediaPlayer.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mMediaPlayer.start(); mTextView.setText("当前正在播放音乐!"); } } catch (IllegalStateException e) { e.printStackTrace(); } mMediaPlayer.setOnCompletionListener(new OnCompletionListener() { // @Override public void onCompletion(MediaPlayer arg0) { mMediaPlayer.release(); } }); } }); //暂停 mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener() { public void onClick(View view) { if (mMediaPlayer != null) { if (bIsReleased == false) { if (bIsPaused == false) { mMediaPlayer.pause(); bIsPaused = true; bIsPlaying = true; mTextView.setText("已经暂停,请再次按暂停按钮回复播放!"); } else if (bIsPaused == true) { mMediaPlayer.start(); bIsPaused = false; mTextView.setText("音乐恢复播放!"); } } } } }); } public boolean onKeyDown(int keyCode, KeyEvent event) { if ( keyCode == KeyEvent.KEYCODE_BACK) { if ( !bIsReleased ) { mMediaPlayer.stop(); mMediaPlayer.release(); bIsReleased = true; } this.finish(); return true; } return super.onKeyDown(keyCode, event); } }
细心的读者已经发现create方法不仅可以加载应用程序中资源的索引,还可加载一个URI地址,当然这就说明我们同样可以很轻松地播放网络音乐,核心代码如下:
Private MediaPlayer mMediaPlayer; Uri uri=Uri.parse("http://www.xxx.com.xxx.mp3"); mMediaPlayer=MediaPlayer.create(this,uri); mMediaPlayer.start();
发表评论
-
Android中AsyncTask的简单用法
2012-01-13 16:00 1122在开发Android移动客户端的时候往往要使用多线程来进行操 ... -
Android应用的自动升级、更新模块的实现 .
2011-11-16 14:01 644http://www.eoeandroid.com/threa ... -
一个APK反编译利器Apktool
2011-11-16 13:54 1554一个APK反编译利器Apktool APK 本地化 ... -
自定义Android标题栏TitleBar布局
2011-11-14 14:13 1214很多网友发现自己Android程序的标题栏TitleBar区域 ... -
Android GPS获取地理位置 .
2011-11-14 14:11 825import android.app.Activity; i ... -
android ListView详解
2011-11-14 13:48 1024在android开发中ListView是比较常用的组件,它以列 ... -
Android之Content provider 详解
2011-11-14 13:35 2435Android是如何实现应用程序之间数据共享的?一个应用程序可 ... -
Android源码地址
2011-11-12 19:14 1023http://blog.csdn.net/ilittleone ... -
android之File
2011-11-11 22:39 19691:Fileservice package cn.itcas ... -
Android知识补漏
2011-11-09 22:33 01:AndroidManifiest.xml < ... -
深入剖析Android消息机制
2011-11-09 14:13 934在Android中,线程内部或者线程之间进行信息交互时经常会使 ... -
Android之Handler详解(四)
2011-11-09 14:00 1262d、自己创建新的线程,然后在新线程中创建Looper,主线程调 ... -
Android之Handler详解(三)
2011-11-09 13:58 1347c、将消息队列绑定到子线程上,主线程只管通过Handl ... -
Android之Handler详解(二)
2011-11-09 13:54 1633二:sendMessage版本的Handl ... -
Android之Handler详解(一)
2011-11-09 13:22 2265一个Handler允许你发送和处理消息(Message)以及 ... -
关于StartActivityForResult方法的使用
2011-10-31 17:11 1051根据方法名可知 这个方法是要得到启动后的Activity返回的 ... -
Android 悬浮Activity并可拖动(访悬浮歌词)
2011-10-24 16:23 2048天天动听, 这款Android手机上的音乐播放器,相信不少朋友 ... -
Android GWES
2011-10-24 16:13 1154第八章 Android GWES 8.1 View Syst ... -
Android系统服务-WindowManager
2011-10-24 16:10 1416WindowManager是Android中一个重要的服务 ... -
http通信
2011-10-15 17:31 1067HTTP(HyperText Transfer Proto ...
相关推荐
Android下MediaPlayer播放MP3示例,详细参见博客:http://www.cnblogs.com/plokmju/p/android_MediaPlayer.html
Android MediaPlayer 自定义循环次数
Android的MediaPlayer架构介绍
详情见博客:https://blog.csdn.net/qq_20785431/article/details/100543504
Android使用MediaPlayer高级内容,详情参见博客:http://www.cnblogs.com/plokmju/p/android_MediaPlayerHigh.html
Android 使用MediaPlayer播放assets或者raw目录的音频文件 https://blog.csdn.net/qq_31939617/article/details/80491552
android的MediaPlayer播放器迷你案例,简单易懂,包含播放,暂停,停止
Android MediaPlayer播放mp3的实例
Android 使用mediaplayer播放res/raw文件夹中的音乐的实例 (1)在res文件夹中新建一个文件夹重命名为raw,并且将要播放的音乐放到raw文件夹里面 (2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本...
Android player example source code
来自疯狂Android的MediaPlayer实例,原书基于Android5.0,在原实例基础上加入了运行时动态权限申请,能够适配Android6.0以后的设备,用于学习和参考使用~
Android MediaPlayer使用方法简单介绍
Android mediaPlayer demo 简单的demo
簡易Android MediaPlayer,使用android studio開啟,可快轉 倒轉 暫停 停止 撥放,支援音樂時間倒數。
Android 中级教程之------Android MediaPlayer播放mp3的实例 是提示性代码!
android mediaPlayer android mediaPlayer
如何实现一个简单的代理服务器(仅支持Http Get),与Android的MediaPlayer结合,从而可以扩展出“播放 反盗链的媒体文件”,“边播放边保存”的功能。
Android中 MediaPlayer的使用案例,一个简答的音乐播放器,重点在于MediaPlayer的玩法
Android 视频播放demo MediaPlayer+Surface实现 播放网络视频: MyMediaPlayer.getInstance().play("http://download.cntv.cn/docuchina/PSA/2017/08/28/3b69f457848e0b497b12e356376515df_mpeg28000000PCM.mp4"); ...