zoukankan      html  css  js  c++  java
  • android开发之MediaPlayer+Service MP3播放器

    1. import java.io.File;  
    2. import java.io.FilenameFilter;  
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5.   
    6. import android.app.ListActivity;  
    7. import android.apps.service.PlayerService;  
    8. import android.content.Intent;  
    9. import android.media.AudioManager;  
    10. import android.os.Bundle;  
    11. import android.view.View;  
    12. import android.view.View.OnClickListener;  
    13. import android.widget.ArrayAdapter;  
    14. import android.widget.Button;  
    15. import android.widget.SeekBar;  
    16. import android.widget.Toast;  
    17.   
    18. public class TestMediaPlayer extends ListActivity {  
    19.     /* 前段时间刚学习Android时就觉得MediaPlayer是个很神奇的东西,就试着做了个简单的音乐播放器。 
    20.      * 支持后台播放、进度条拖放、音量控制、读取sdCard音乐文件进行播放等。 
    21.      * */  
    22.     private Button playButton = null;  
    23.     private Button mFrontButton = null;  
    24.     private Button mLastButton = null;  
    25.     private Button exit = null;  
    26.     /* 声明音量管理器 */  
    27.     private AudioManager mAudioManager = null;  
    28.   
    29.     /* 定义进度条 */  
    30.     public static SeekBar audioSeekBar = null;  
    31.   
    32.     /* 定义音量大小 */  
    33.     private SeekBar audioVolume = null;  
    34.   
    35.     /* 定于一个数据播放列表,用来存放从指定文件中搜索到的文件 */  
    36.     public static List<String> mMusicList = new ArrayList<String>();  
    37.   
    38.     /* 定义音乐存放路径 */  
    39. //  private static final String MUSIC_PATH = new String("/mnt/sdcard/"); //android 2.2  
    40.     private static final String MUSIC_PATH = new String("/sdcard/");//android 2.1  
    41.     /* 定义在播放列表中的当前选择项 */  
    42.     public static int currentListItme = 0;  
    43.   
    44.     @Override  
    45.     public void onCreate(Bundle savedInstanceState) {  
    46.         super.onCreate(savedInstanceState);  
    47.         setContentView(R.layout.main);  
    48.         /* 更新列表 */  
    49.         musicList();  
    50.         /* 得到控件 */  
    51.         playButton = (Button) findViewById(R.id.StartMusic);  
    52.         mFrontButton = (Button) findViewById(R.id.FrontButton);  
    53.         mLastButton = (Button) findViewById(R.id.LastMusic);  
    54.         audioVolume = (SeekBar) findViewById(R.id.audioVolume);  
    55.         exit = (Button)findViewById(R.id.exit);  
    56.         audioSeekBar = (SeekBar) findViewById(R.id.seekbar01);  
    57.         /* 播放、暂停监听 */  
    58.         playButton.setOnClickListener(new OnClickListener() {  
    59.   
    60.             @Override  
    61.             public void onClick(View v) {  
    62.   
    63.                 playMusic(AppConstant.PlayerMag.PAUSE);  
    64.             }  
    65.         });  
    66.         /* 监听下一首 */  
    67.         mFrontButton.setOnClickListener(new OnClickListener() {  
    68.   
    69.             @Override  
    70.             public void onClick(View v) {  
    71.                 nextMusic();  
    72.             }  
    73.         });  
    74.         /* 监听上一首 */  
    75.         mLastButton.setOnClickListener(new View.OnClickListener() {  
    76.   
    77.             @Override  
    78.             public void onClick(View v) {  
    79.                 FrontMusic();  
    80.             }  
    81.         });  
    82.         /*退出监听*/  
    83.         exit.setOnClickListener(new OnClickListener() {  
    84.               
    85.             @Override  
    86.             public void onClick(View v) {  
    87.                 Intent intent = new Intent();  
    88.                 intent.setClass(TestMediaPlayer.this, PlayerService.class);  
    89.                 stopService(intent);//停止Service  
    90.                 try {  
    91.                     TestMediaPlayer.this.finish();//关闭当前Activity  
    92.                 } catch (Throwable e) {  
    93.                     e.printStackTrace();  
    94.                 }  
    95.               
    96.                   
    97.             }  
    98.         });  
    99.         /* 播放进度监听 */  
    100.         audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
    101.         /*退出后再次进去程序时,进度条保持持续更新*/  
    102.         if(PlayerService.mMediaPlayer!=null){  
    103.             //设置进度条最大值  
    104.             TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer.getDuration());  
    105.             audioSeekBar.setProgress(PlayerService.mMediaPlayer.getCurrentPosition());  
    106.         }  
    107.           
    108.           
    109.         /* 得到当前音量对象 */  
    110.         mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);  
    111.         /* 把当前音量值赋给进度条 */  
    112.         audioVolume.setProgress(mAudioManager  
    113.                 .getStreamVolume(AudioManager.STREAM_MUSIC));  
    114.         /* 监听音量 */  
    115.         audioVolume.setOnSeekBarChangeListener(new AudioVolumeChangeEvent());  
    116.     }  
    117.   
    118.     public void playMusic(int action) {  
    119.         Intent intent = new Intent();  
    120.         intent.putExtra("MSG", action);  
    121.         intent.setClass(TestMediaPlayer.this, PlayerService.class);  
    122.           
    123.         /* 启动service service要在AndroidManifest.xml注册如:<service></service>*/  
    124.           
    125.         startService(intent);  
    126.     }  
    127.   
    128.     /* 检测sdcard MP3文件并加入到List列表 */  
    129.     public void musicList() {  
    130.         // 先清除list中的缓存  
    131.         mMusicList.clear();  
    132.         /* 从指定的路径中读取文件,并与播放列表关联 */  
    133.         File home = new File(MUSIC_PATH);  
    134.           
    135.         System.out.println(home.canRead());  
    136.         /* 读取指定类型的文件,在本程序,指定播放类型为mp3 */  
    137.         if (home.listFiles(new MusicFilter()).length > 0) {  
    138.             /* 读取文件 */  
    139.             for (File file : home.listFiles(new MusicFilter())) {  
    140.                 mMusicList.add(file.getName());  
    141.             }  
    142.             /* 播放文件与播放列表关联 */  
    143.             ArrayAdapter<String> musicList = new ArrayAdapter<String>(  
    144.                     TestMediaPlayer.this, R.layout.musictime, mMusicList);  
    145.             setListAdapter(musicList);  
    146.         }  
    147.     }  
    148.   
    149.     /* 音量监听 */  
    150.     class AudioVolumeChangeEvent implements SeekBar.OnSeekBarChangeListener {  
    151.   
    152.         @Override  
    153.         public void onProgressChanged(SeekBar seekBar, int progress,  
    154.                 boolean fromUser) {  
    155.   
    156.             // mAudioManager.adjustVolume(AudioManager.ADJUST_LOWER, 0);  
    157.             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,  
    158.                     0);  
    159.   
    160.         }  
    161.   
    162.         @Override  
    163.         public void onStartTrackingTouch(SeekBar seekBar) {  
    164.         }  
    165.   
    166.         @Override  
    167.         public void onStopTrackingTouch(SeekBar seekBar) {  
    168.         }  
    169.   
    170.     }  
    171.   
    172.     /* 音乐选择监听 */  
    173.     @Override  
    174.     protected void onListItemClick(android.widget.ListView l, View v,  
    175.             int position, long id) {  
    176.         super.onListItemClick(l, v, position, id);  
    177.         currentListItme = position;  
    178.         playMusic(AppConstant.PlayerMag.PLAY_MAG);  
    179.     }  
    180.   
    181.     /* 播放下一首 */  
    182.     private void nextMusic() {  
    183.         if (++currentListItme >= mMusicList.size()) {  
    184.             Toast.makeText(TestMediaPlayer.this, "已到最后一首歌曲", Toast.LENGTH_SHORT)  
    185.                     .show();  
    186.             currentListItme = mMusicList.size() - 1;  
    187.         } else {  
    188.             playMusic(AppConstant.PlayerMag.PLAY_MAG);  
    189.         }  
    190.     }  
    191.   
    192.     /* 播放上一首歌曲 */  
    193.     private void FrontMusic() {  
    194.         if (--currentListItme >= 0) {  
    195.             playMusic(AppConstant.PlayerMag.PLAY_MAG);  
    196.   
    197.         } else {  
    198.             Toast.makeText(TestMediaPlayer.this, "已到第一首歌曲", Toast.LENGTH_SHORT)  
    199.                     .show();  
    200.             currentListItme = 0;  
    201.         }  
    202.     }  
    203. }  
    204.   
    205. /* 播放文件选择类 */  
    206. class MusicFilter implements FilenameFilter {  
    207.     public boolean accept(File dir, String name) {  
    208.         /* 指定扩展名类型 ,可以加其他的音乐格式*/  
    209.         return (name.endsWith(".mp3"));  
    210.     }  
    211. }  
    212.   
    213. /* 拖放进度监听 ,别忘了Service里面还有个进度条刷新*/  
    214. class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {  
    215.   
    216.     @Override  
    217.     public void onProgressChanged(SeekBar seekBar, int progress,  
    218.             boolean fromUser) {  
    219.         /*假设改变源于用户拖动*/  
    220.         if (fromUser) {  
    221.             PlayerService.mMediaPlayer.seekTo(progress);// 当进度条的值改变时,音乐播放器从新的位置开始播放  
    222.         }  
    223.     }  
    224.   
    225.     @Override  
    226.     public void onStartTrackingTouch(SeekBar seekBar) {  
    227.         PlayerService.mMediaPlayer.pause(); // 开始拖动进度条时,音乐暂停播放  
    228.     }  
    229.   
    230.     @Override  
    231.     public void onStopTrackingTouch(SeekBar seekBar) {  
    232.         PlayerService.mMediaPlayer.start(); // 停止拖动进度条时,音乐开始播放  
    233.     }  
    234. }  


    service类

    首先建议不要把播放音乐放在Activity中,因为关闭Activity后就不能实现后台播放。所以播放音乐要放在Service中,我们只需要管理Activity与Service间的通信就好了。下面就是个Service类。直接看注释和代码:

    [java] view plaincopy
     
    1. package android.apps.service;  
    2.   
    3. import java.io.IOException;  
    4.   
    5. import android.app.Service;  
    6. import android.content.Intent;  
    7. import android.media.MediaPlayer;  
    8. import android.net.Uri;  
    9. import android.os.IBinder;  
    10. import android.widget.Toast;  
    11.   
    12. import android.apps.*;  
    13.   
    14. public class PlayerService extends Service implements Runnable,  
    15.         MediaPlayer.OnCompletionListener {  
    16.     /* 定于一个多媒体对象 */  
    17.     public static MediaPlayer mMediaPlayer = null;  
    18.     // 是否单曲循环  
    19.     private static boolean isLoop = false;  
    20.     // 用户操作  
    21.     private int MSG;  
    22.   
    23.     /* 定义要播放的文件夹路径 */  
    24.     private static final String MUSIC_PATH = new String("/sdcard/");  
    25.   
    26.     @Override  
    27.     public IBinder onBind(Intent intent) {  
    28.         return null;// 这里的绑定没的用,上篇我贴出了如何将activity与service绑定的代码  
    29.     }  
    30.   
    31.     @Override  
    32.     public void onCreate() {  
    33.         super.onCreate();  
    34.         if (mMediaPlayer != null) {  
    35.             mMediaPlayer.reset();  
    36.             mMediaPlayer.release();  
    37.             mMediaPlayer = null;  
    38.         }  
    39.         mMediaPlayer = new MediaPlayer();  
    40.         /* 监听播放是否完成 */  
    41.         mMediaPlayer.setOnCompletionListener(this);  
    42.     }  
    43.   
    44.     @Override  
    45.     public void onDestroy() {  
    46.         super.onDestroy();  
    47.   
    48.         if (mMediaPlayer != null) {  
    49.             mMediaPlayer.stop();  
    50.             mMediaPlayer.release();  
    51.             mMediaPlayer = null;  
    52.         }  
    53.   
    54.         System.out.println("service onDestroy");  
    55.     }  
    56.     /*启动service时执行的方法*/  
    57.     @Override  
    58.     public int onStartCommand(Intent intent, int flags, int startId) {  
    59.         /*得到从startService传来的动作,后是默认参数,这里是我自定义的常量*/  
    60.         MSG = intent.getIntExtra("MSG", AppConstant.PlayerMag.PLAY_MAG);  
    61.         if (MSG == AppConstant.PlayerMag.PLAY_MAG) {  
    62.             playMusic();  
    63.         }  
    64.         if (MSG == AppConstant.PlayerMag.PAUSE) {  
    65.             if (mMediaPlayer.isPlaying()) {// 正在播放  
    66.                 mMediaPlayer.pause();// 暂停  
    67.             } else {// 没有播放  
    68.                 mMediaPlayer.start();  
    69.             }  
    70.         }  
    71.   
    72.         return super.onStartCommand(intent, flags, startId);  
    73.     }  
    74.   
    75.     @SuppressWarnings("static-access")  
    76.     public void playMusic() {  
    77.         try {  
    78.             /* 重置多媒体 */  
    79.             mMediaPlayer.reset();  
    80.             /* 读取mp3文件 */  
    81.             mMediaPlayer.setDataSource(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));  
    82. //          Uri uri = Uri.parse(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));  
    83. //            
    84. //          mMediaPlayer.create(PlayerService.this,uri);  
    85.             /* 准备播放 */  
    86.             mMediaPlayer.prepare();  
    87.             /* 开始播放 */  
    88.             mMediaPlayer.start();  
    89.             /* 是否单曲循环 */  
    90.             mMediaPlayer.setLooping(isLoop);  
    91.             // 设置进度条最大值  
    92.             TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer  
    93.                     .getDuration());  
    94.             new Thread(this).start();  
    95.         } catch (IOException e) {  
    96.         }  
    97.   
    98.     }  
    99.   
    100.     // 刷新进度条  
    101.     @Override  
    102.     public void run() {  
    103.         int CurrentPosition = 0;// 设置默认进度条当前位置  
    104.         int total = mMediaPlayer.getDuration();//  
    105.         while (mMediaPlayer != null && CurrentPosition < total) {  
    106.             try {  
    107.                 Thread.sleep(1000);  
    108.                 if (mMediaPlayer != null) {  
    109.                     CurrentPosition = mMediaPlayer.getCurrentPosition();  
    110.                 }  
    111.             } catch (InterruptedException e) {  
    112.                 e.printStackTrace();  
    113.             }  
    114.             TestMediaPlayer.audioSeekBar.setProgress(CurrentPosition);  
    115.         }  
    116.   
    117.     }  
    118.   
    119.     @Override  
    120.     public void onCompletion(MediaPlayer mp) {  
    121.         /* 播放完当前歌曲,自动播放下一首 */  
    122.   
    123.         if (++TestMediaPlayer.currentListItme >= TestMediaPlayer.mMusicList  
    124.                 .size()) {  
    125.             Toast.makeText(PlayerService.this, "已到最后一首歌曲", Toast.LENGTH_SHORT)  
    126.                     .show();  
    127.             TestMediaPlayer.currentListItme--;  
    128.             TestMediaPlayer.audioSeekBar.setMax(0);  
    129.         } else {  
    130.             playMusic();  
    131.         }  
    132.     }  
    133. }  

    参数封装

    [java] view plaincopy
     
    1. /** 
    2.  * @把参数这样封装易于管理和阅读 
    3.  * 
    4.  */  
    5. public interface AppConstant {  
    6.     public class PlayerMag{  
    7.         public static final int PLAY_MAG=1;//开始播放  
    8.         public static final int PAUSE=2;//暂停播放  
    9.     }  
    10. }  


    详细代码下载:http://download.csdn.net/source/3318587

  • 相关阅读:
    C#缓存
    js 日期相减
    无法加载图片信息处理
    一些经营性的文章,写得不蛮不错
    集线器、交换机、路由器的区别
    存储过程使用建议
    存储过程优点和缺点
    杀人游戏规则介绍(1.0~5.0版本)
    C#网络编程(1) 来源出网络的资源收集
    谈谈外包软件项目的经验
  • 原文地址:https://www.cnblogs.com/ruiati/p/3708346.html
Copyright © 2011-2022 走看看