借鉴 Mini音乐播放器

继上篇音乐播放器,我们讲到使用 SDCard 播放音乐的例子,上篇也将如何在Android 模拟器中创建 SDCard 的步骤列了出来。本篇将扩展上篇例子,去获取SDCard 的所存内存,显示出来告诉用户。本篇讲述的内容如下:
  • 1、讲述 Environment 类。
  • 2、讲述 StatFs 类。
  • 3、完整例子读取 SDCard 内存

1、讲述 Environment 类Environment 是一个提供访问环境变量的类Environment 包含常量:

  • MEDIA_BAD_REMOVAL
    解释:返回getExternalStorageState() ,表明SDCard 被卸载前己被移除
  • MEDIA_CHECKING
    解释:返回getExternalStorageState() ,表明对象正在磁盘检查。
  • MEDIA_MOUNTED
    解释:返回getExternalStorageState() ,表明对象是否存在并具有读/写权限
  • MEDIA_MOUNTED_READ_ONLY
    解释:返回getExternalStorageState() ,表明对象权限为只读
  • MEDIA_NOFS
    解释:返回getExternalStorageState() ,表明对象为空白或正在使用不受支持的文件系统。
  • MEDIA_REMOVED
    解释:返回getExternalStorageState() ,如果不存在 SDCard 返回
  • MEDIA_SHARED
    解释:返回getExternalStorageState() ,如果 SDCard 未安装 ,并通过 USB 大容量存储共享 返回
  • MEDIA_UNMOUNTABLE
    解释:返回getExternalStorageState() ,返回 SDCard 不可被安装 如果 SDCard 是存在但不可以被安装
  • MEDIA_UNMOUNTED
    解释:返回getExternalStorageState() ,返回 SDCard 已卸掉如果 SDCard 是存在但是没有被安装

Environment 常用方法:

  • 方法:getDataDirectory()
    解释:返回 File ,获取 Android 数据目录。
  • 方法:getDownloadCacheDirectory()
    解释:返回 File ,获取 Android 下载/缓存内容目录。
  • 方法:getExternalStorageDirectory()
    解释:返回 File ,获取外部存储目录即 SDCard
  • 方法:getExternalStoragePublicDirectory(String type)
    解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件
  • 方法:getExternalStorageState()
    解释:返回 File ,获取外部存储设备的当前状态
  • 方法:getRootDirectory()
    解释:返回 File ,获取 Android 的根目录

2、讲述 StatFs 类StatFs 一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况
StatFs 常用方法:

  • getAvailableBlocks()
    解释:返回 Int ,获取当前可用的存储空间
  • getBlockCount()
    解释:返回 Int ,获取该区域可用的文件系统数
  • getBlockSize()
    解释:返回 Int ,大小,以字节为单位,一个文件系统
  • getFreeBlocks()
    解释:返回 Int ,该块区域剩余的空间
  • restat(String path)
    解释:执行一个由该对象所引用的文件系统

3、完整例子读取 SDCard 内存存储卡在 Android 手机上是可以随时插拔的,每次的动作都对引起操作系统进行 ACTION_BROADCAST,本例子将使用上面学到的方法,计算出 SDCard 的剩余容量和总容量。代码如下:


下面是图例显示 MediaPlayer 的生命周期


3.1、MediaPlayer 常用方法介绍

  • 方法:create(Context context, Uri uri)
    解释:静态方法,通过Uri创建一个多媒体播放器。
  • 方法:create(Context context, int resid)
    解释:静态方法,通过资源ID创建一个多媒体播放器
  • 方法:create(Context context, Uri uri, SurfaceHolder holder)
    解释:静态方法,通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器
  • 方法: getCurrentPosition()
    解释:返回 Int, 得到当前播放位置
  • 方法: getDuration()
    解释:返回 Int,得到文件的时间
  • 方法:getVideoHeight()
    解释:返回 Int ,得到视频的高度
  • 方法:getVideoWidth()
    解释:返回 Int,得到视频的宽度
  • 方法:isLooping()
    解释:返回 boolean ,是否循环播放
  • 方法:isPlaying()
    解释:返回 boolean,是否正在播放
  • 方法:pause()
    解释:无返回值 ,暂停
  • 方法:prepare()
    解释:无返回值,准备同步
  • 方法:prepareAsync()
    解释:无返回值,准备异步
  • 方法:release()
    解释:无返回值,释放 MediaPlayer 对象
  • 方法:reset()
    解释:无返回值,重置 MediaPlayer 对象
  • 方法:seekTo(int msec)
    解释:无返回值,指定播放的位置(以毫秒为单位的时间)
  • 方法:setAudioStreamType(int streamtype)
    解释:无返回值,指定流媒体的类型
  • 方法:setDataSource(String path)
    解释:无返回值,设置多媒体数据来源【根据 路径】
  • 方法:setDataSource(FileDescriptor fd, long offset, long length)
    解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】
  • 方法:setDataSource(FileDescriptor fd)
    解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】
  • 方法:setDataSource(Context context, Uri uri)
    解释:无返回值,设置多媒体数据来源【根据 Uri】
  • 方法:setDisplay(SurfaceHolder sh)
    解释:无返回值,设置用 SurfaceHolder 来显示多媒体
  • 方法:setLooping(boolean looping)
    解释:无返回值,设置是否循环播放
  • 事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
    解释:监听事件,网络流媒体的缓冲监听
  • 事件:setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
    解释:监听事件,网络流媒体播放结束监听
  • 事件:setOnErrorListener(MediaPlayer.OnErrorListener listener)
    解释:监听事件,设置错误信息监听
  • 事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)
    解释:监听事件,视频尺寸监听
  • 方法:setScreenOnWhilePlaying(boolean screenOn)
    解释:无返回值,设置是否使用 SurfaceHolder 显示
  • 方法:setVolume(float leftVolume, float rightVolume)
    解释:无返回值,设置音量
  • 方法:start()
    解释:无返回值,开始播放
  • 方法:stop()
    解释:无返回值,停止播放

4、完整音乐播放例子演示通过上面的讲解大致知道了 MediaPlayer 的播放原理,下面我们来完成一个小项目,即实现一个 Mini 版音乐播放器。这个播放器中我们需要有暂停、停止、上一首、下一首等基本按钮,有了上面的讲解要实现这个小项目就轻松多了,下面将贴出代码

  1. import java.io.File;
  2. import java.io.FilenameFilter;[/font]
  3. public class MusicFilter implements FilenameFilter{
  4. @Override
  5. public boolean accept(File dir, String filename) {
  6. // TODO Auto-generated method stub
  7. return (filename.endsWith(".mp3"));
  8. }
  9. }
复制代码

Tip:播放器不可能只是希望播放一种音乐格式,并且还需要自动识别指定的路径中哪些是可以播放的音频文件,哪些是不支持的格式,以上代码可以作为参考。好了,下面贴出完整代码

  1. package com.terry;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import android.app.ListActivity;
  6. import android.media.MediaPlayer;
  7. import android.media.MediaPlayer.OnCompletionListener;
  8. import android.os.Bundle;
  9. import android.view.KeyEvent;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.widget.ArrayAdapter;
  13. import android.widget.Button;
  14. import android.widget.ListView;
  15. import android.widget.Toast;
  16. public class musicActivity extends ListActivity {
  17. //播放对象
  18. private MediaPlayer myMediaPlayer;
  19. //播放列表
  20. private List<String> myMusicList=new ArrayList<String>();
  21. //当前播放歌曲的索引
  22. private int currentListItem=0;
  23. //音乐的路径
  24. private static final String MUSIC_PATH=new String("/sdcard/");
  25. /** Called when the activity is first created. */
  26. @Override
  27. public void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.main);
  30. myMediaPlayer=new MediaPlayer();
  31. findView();
  32. musicList();
  33. listener();
  34. }
  35. //绑定音乐
  36. void musicList(){
  37. File home=new File(MUSIC_PATH);
  38. if(home.listFiles(new MusicFilter()).length>0){
  39. for(File file:home.listFiles(new MusicFilter())){
  40. myMusicList.add(file.getName());
  41. }
  42. ArrayAdapter<String> musicList=new ArrayAdapter<String>
  43. (musicActivity.this,R.layout.musicitme, myMusicList);
  44. setListAdapter(musicList);
  45. }
  46. }
  47. //获取按钮
  48. void findView(){
  49. viewHolder.start=(Button)findViewById(R.id.start);
  50. viewHolder.stop=(Button)findViewById(R.id.stop);
  51. viewHolder.next=(Button)findViewById(R.id.next);
  52. viewHolder.pause=(Button)findViewById(R.id.pause);
  53. viewHolder.last=(Button)findViewById(R.id.last);
  54. }
  55. //监听事件
  56. void listener(){
  57. //停止
  58. viewHolder.stop.setOnClickListener(new OnClickListener() {
  59. @Override
  60. public void onClick(View v) {
  61. // TODO Auto-generated method stub
  62. if(myMediaPlayer.isPlaying()){
  63. myMediaPlayer.reset();
  64. }
  65. }
  66. });
  67. //开始
  68. viewHolder.start.setOnClickListener(new OnClickListener() {
  69. @Override
  70. public void onClick(View v) {
  71. // TODO Auto-generated method stub
  72. playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  73. }
  74. });
  75. //下一首
  76. viewHolder.next.setOnClickListener(new OnClickListener() {
  77. @Override
  78. public void onClick(View v) {
  79. // TODO Auto-generated method stub
  80. nextMusic();
  81. }
  82. });
  83. //暂停
  84. viewHolder.pause.setOnClickListener(new OnClickListener() {
  85. @Override
  86. public void onClick(View v) {
  87. // TODO Auto-generated method stub
  88. if(myMediaPlayer.isPlaying()){
  89. myMediaPlayer.pause();
  90. }else{
  91. myMediaPlayer.start();
  92. }
  93. }
  94. });
  95. //上一首
  96. viewHolder.last.setOnClickListener(new OnClickListener() {
  97. @Override
  98. public void onClick(View v) {
  99. // TODO Auto-generated method stub
  100. lastMusic();
  101. }
  102. });
  103. }
  104. //播放音乐
  105. void playMusic(String path){
  106. try {
  107. myMediaPlayer.reset();
  108. myMediaPlayer.setDataSource(path);
  109. myMediaPlayer.prepare();
  110. myMediaPlayer.start();
  111. myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
  112. @Override
  113. public void onCompletion(MediaPlayer mp) {
  114. // TODO Auto-generated method stub
  115. nextMusic();
  116. }
  117. });
  118. } catch (Exception e) {
  119. // TODO: handle exception
  120. e.printStackTrace();
  121. }
  122. }
  123. //下一首
  124. void nextMusic(){
  125. if(++currentListItem>=myMusicList.size()){
  126. currentListItem=0;
  127. }
  128. else{
  129. playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  130. }
  131. }
  132. //上一首
  133. void lastMusic(){
  134. if(currentListItem!=0)
  135. {
  136. if(--currentListItem>=0){
  137. currentListItem=myMusicList.size();
  138. } else{
  139. playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  140. }
  141. } else{
  142. playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  143. }
  144. }
  145. //当用户返回时结束音乐并释放音乐对象
  146. @Override
  147. public boolean onKeyDown(int keyCode, KeyEvent event) {
  148. // TODO Auto-generated method stub
  149. if(keyCode==KeyEvent.KEYCODE_BACK){
  150. myMediaPlayer.stop();
  151. myMediaPlayer.release();
  152. this.finish();
  153. return true;
  154. }
  155. return super.onKeyDown(keyCode, event);
  156. }
  157. //当选择列表项时播放音乐
  158. @Override
  159. protected void onListItemClick(ListView l, View v, int position, long id) {
  160. // TODO Auto-generated method stub
  161. currentListItem=position;
  162. playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  163. }
  164. }

猜你喜欢

转载自wuxifu001.iteye.com/blog/1774058