• Android应用开发--MP3音乐播放器代码实现(一)


    需求1:将内存卡中的MP3音乐读取出来并显示到列表当中

    1.   从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象
    2.   迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中
    3.   定义一个List集合,把Map对象添加到List集合当中
    4.   通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中

     

    [java] view plaincopy
     
    1. /** 
    2. * 用于从数据库中查询歌曲的信息,保存在List当中 
    3. * @return 
    4. */  
    5. public List<Mp3Info> getMp3Infos() {  
    6.     Cursor cursor = getContentResolver().query(  
    7.         MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,  
    8.         MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
    9.     List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();  
    10.     for (int i = 0; i < cursor.getCount(); i++) {  
    11.         Mp3Info mp3Info = new Mp3Info();  
    12.         cursor.moveToNext();  
    13.         long id = cursor.getLong(cursor  
    14.             .getColumnIndex(MediaStore.Audio.Media._ID));   //音乐id  
    15.         String title = cursor.getString((cursor   
    16.             .getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题  
    17.         String artist = cursor.getString(cursor  
    18.             .getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家  
    19.         long duration = cursor.getLong(cursor  
    20.             .getColumnIndex(MediaStore.Audio.Media.DURATION));//时长  
    21.         long size = cursor.getLong(cursor  
    22.             .getColumnIndex(MediaStore.Audio.Media.SIZE));  //文件大小  
    23.         String url = cursor.getString(cursor  
    24.             .getColumnIndex(MediaStore.Audio.Media.DATA));              //文件路径  
    25.     int isMusic = cursor.getInt(cursor  
    26.         .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐  
    27.     if (isMusic != 0) {     //只把音乐添加到集合当中  
    28.         mp3Info.setId(id);  
    29.         mp3Info.setTitle(title);  
    30.         mp3Info.setArtist(artist);  
    31.         mp3Info.setDuration(duration);  
    32.         mp3Info.setSize(size);  
    33.         mp3Info.setUrl(url);  
    34.         mp3Infos.add(mp3Info);  
    35.         }  
    36.     }  
    37. return mp3Infos;  
    38. }  

     

    [java] view plaincopy
     
    1. /** 
    2.      * 填充列表 
    3.      * @param mp3Infos 
    4.      */  
    5.     public void setListAdpter(List<Mp3Info> mp3Infos) {  
    6.         List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();  
    7.         for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {  
    8.             Mp3Info mp3Info = (Mp3Info) iterator.next();  
    9.             HashMap<String, String> map = new HashMap<String, String>();  
    10.             map.put("title", mp3Info.getTitle());  
    11.             map.put("Artist", mp3Info.getArtist());  
    12.             map.put("duration", String.valueOf(mp3Info.getDuration()));  
    13.             map.put("size", String.valueOf(mp3Info.getSize()));  
    14.             map.put("url", mp3Info.getUrl());  
    15.             mp3list.add(map);  
    16.         }  
    17.         mAdapter = new SimpleAdapter(this, mp3list,  
    18.                 R.layout.music_list_item_layout, new String[] { "title", "Artist", "duration" },  
    19.                 new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });  
    20.         mMusiclist.setAdapter(mAdapter);      
    21.     }  

     

    实现效果如图:

       

    需求2:点击列表的每一项,启动一个服务来播放音乐

    1.   注册条目点击监听器OnItemClickListener

    2.   定义一个实现OnItemClickListener接口的内部类

    3.   定义一个继承Service的服务类PlayerServie

    1.   注册条目点击监听器OnItemClickListener

    [java] view plaincopy
     
    1. mMusiclist = (ListView) findViewById(R.id.music_list);  
    2.         mMusiclist.setOnItemClickListener(new MusicListItemClickListener());  
    3.         mp3Infos = getMp3Infos();  
    4.         setListAdpter(getMp3Infos());  



    2.   定义一个实现OnItemClickListener接口的内部类

    [java] view plaincopy
     
    1. private class MusicListItemClickListener implements OnItemClickListener {  
    2.     @Override  
    3.     public void onItemClick(AdapterView<?> parent, View view, int position,  
    4.             long id) {  
    5.         if(mp3Infos != null) {  
    6.             Mp3Info mp3Info = mp3Infos.get(position);  
    7.             Log.d("mp3Info-->", mp3Info.toString());  
    8.             Intent intent = new Intent();  
    9.             intent.putExtra("url", mp3Info.getUrl());         
    10.             intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);  
    11.             intent.setClass(MainActivity.this, PlayerService.class);  
    12.             startService(intent);       //启动服务  
    13.         }  
    14.     }  
    15. }  



    3.   定义一个继承Service的服务类PlayerServie(未完善的Service类)

    [java] view plaincopy
     
    1. package com.wwj.sb.service;  
    2.   
    3.   
    4. import android.annotation.SuppressLint;  
    5. import android.app.Service;  
    6. import android.content.Intent;  
    7. import android.media.MediaPlayer;  
    8. import android.media.MediaPlayer.OnPreparedListener;  
    9. import android.os.IBinder;  
    10.   
    11. import com.wwj.sb.domain.AppConstant;  
    12.   
    13. @SuppressLint("NewApi")  
    14. public class PlayerService extends Service {  
    15.     private MediaPlayer mediaPlayer =  new MediaPlayer();       //媒体播放器对象  
    16.     private String path;                        //音乐文件路径  
    17.     private boolean isPause;                    //暂停状态  
    18.       
    19.     @Override  
    20.     public IBinder onBind(Intent arg0) {  
    21.         return null;  
    22.     }  
    23.       
    24.     @Override  
    25.     public int onStartCommand(Intent intent, int flags, int startId) {  
    26.         if(mediaPlayer.isPlaying()) {  
    27.             stop();  
    28.         }  
    29.         path = intent.getStringExtra("url");          
    30.         int msg = intent.getIntExtra("MSG", 0);  
    31.         if(msg == AppConstant.PlayerMsg.PLAY_MSG) {  
    32.             play(0);  
    33.         } else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {  
    34.             pause();  
    35.         } else if(msg == AppConstant.PlayerMsg.STOP_MSG) {  
    36.             stop();  
    37.         }  
    38.         return super.onStartCommand(intent, flags, startId);  
    39.     }  
    40.       
    41.   
    42.     /** 
    43.      * 播放音乐 
    44.      * @param position 
    45.      */  
    46.     private void play(int position) {  
    47.         try {  
    48.             mediaPlayer.reset();//把各项参数恢复到初始状态  
    49.             mediaPlayer.setDataSource(path);  
    50.             mediaPlayer.prepare();  //进行缓冲  
    51.             mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器  
    52.         }  
    53.         catch (Exception e) {  
    54.             e.printStackTrace();  
    55.         }  
    56.     }  
    57.       
    58.     /** 
    59.      * 暂停音乐 
    60.      */  
    61.     private void pause() {  
    62.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
    63.             mediaPlayer.pause();  
    64.             isPause = true;  
    65.         }  
    66.     }  
    67.       
    68.     /** 
    69.      * 停止音乐 
    70.      */  
    71.     private void stop(){  
    72.         if(mediaPlayer != null) {  
    73.             mediaPlayer.stop();  
    74.             try {  
    75.                 mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数  
    76.             } catch (Exception e) {  
    77.                 e.printStackTrace();  
    78.             }  
    79.         }  
    80.     }  
    81.       
    82.       
    83.     @Override  
    84.     public void onDestroy() {  
    85.         if(mediaPlayer != null){  
    86.             mediaPlayer.stop();  
    87.             mediaPlayer.release();  
    88.         }  
    89.     }  
    90.     /** 
    91.      *  
    92.      * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放 
    93.      * 
    94.      */  
    95.     private final class PreparedListener implements OnPreparedListener {  
    96.         private int positon;  
    97.           
    98.         public PreparedListener(int positon) {  
    99.             this.positon = positon;  
    100.         }  
    101.           
    102.         @Override  
    103.         public void onPrepared(MediaPlayer mp) {  
    104.             mediaPlayer.start();    //开始播放  
    105.             if(positon > 0) {    //如果音乐不是从头播放  
    106.                 mediaPlayer.seekTo(positon);  
    107.             }  
    108.         }  
    109.     }  
    110.       
    111. }  

    public class MusicActivity extends Activity {
    private boolean isStop = false;
    private MediaPlayer mPlayer;
    public final String TITLE = Environment.getExternalStorageDirectory()
    + "/iwantyourlove.mp3";

    private File file;

    private SeekBar seekBar;
    private ImageView play;
    private TextView title;

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.music_main);

    initWidgets();

    }

    // 重新初始化播放器
    public void initWidgets() {
    play = (ImageView) findViewById(R.id.img_stop);
    title = (TextView) findViewById(R.id.title);
    seekBar = (SeekBar) findViewById(R.id.seek);

    seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
    //seekBar.setProgress(mPlayer.getCurrentPosition() *seekBar.getMax() / total);
    //Log.i("sss", seekBar.getProgress()+"");
    //mPlayer.seekTo(mPlayer.getCurrentPosition());
    mPlayer.seekTo(seekBar.getProgress() * mPlayer.getDuration() /100 );
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
    boolean fromUser) {
    // Log.i("progress", ""+progress);
    // Log.i("qqq", seekBar.getProgress()+"");
    // progress = currentPosition * 100 / duration;

    //progress*duration/100
    //mPlayer.seekTo(progress * mPlayer.getDuration() /100 );
    }
    });

    file = new File(TITLE);

    title.setText(file.getName());

    mPlayer = new MediaPlayer();
    try {
    mPlayer.setDataSource(TITLE);
    mPlayer.prepare();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    public void play(View v) {
    if (!mPlayer.isPlaying()) {
    mPlayer.start();
    }
    }

    public void pause(View v) {
    if (mPlayer.isPlaying()) {
    mPlayer.pause();
    }
    }

    public void replay(View v) {
    mPlayer.reset();
    initWidgets();// 重新构建播放器
    // mPlayer.start();
    play(v);
    }

    public void stop(View v) {
    isStop = true;
    mPlayer.stop();

    play.setImageResource(R.drawable.player_play);
    }

    // 用图片代替按钮
    public void playOrPause(View v) {
    if (isStop) {// 停止后重新开始播放
    mPlayer.reset();
    initWidgets();
    mPlayer.start();
    play.setImageResource(R.drawable.player_pause);
    isStop = false;
    } else if (mPlayer.isPlaying()) {// 播放状态
    play.setImageResource(R.drawable.player_play);
    mPlayer.pause();
    } else {// 暂停状态
    play.setImageResource(R.drawable.player_pause);
    mPlayer.start();
    }

    // 异步任务
    new MusicTask().execute();
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    // 释放资源
    mPlayer.release();
    }

    // 音乐播放异步任务
    class MusicTask extends AsyncTask<Void, Void, Void> {
    //int current = mPlayer.getCurrentPosition();// 当前播放是什么位置,
    int total = mPlayer.getDuration(); // 音乐总共多长时间

    @Override
    protected Void doInBackground(Void... params) {
    // 让SeekBar跟着音乐一起向右边走
    while (mPlayer.getCurrentPosition() <= total&&!isStop) { //!isPause不是停止状态
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    publishProgress();
    }
    return null;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
    super.onProgressUpdate(values);
    // Log.i("msg", ""+mPlayer.getCurrentPosition() * 100 / total);
    seekBar.setProgress(mPlayer.getCurrentPosition() *seekBar.getMax() / total);
    }

    @Override
    protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    }
    }
    }

  • 相关阅读:
    针对wamp的phpmyadmin显示#2003无法连接mysql
    vs2019编译gdal3.1.0报错 (filemanager.obj) : error LNK2001: 无法解析的外部符号 __imp_SHGetFolderPathW
    半透明遮罩层覆盖整个可视区域
    css首字下沉
    仿花瓣标题栏始终在页面顶部(ie6下position:fixed失效解决方法)
    Redis最佳实践及核心原理
    Java对接微信公众号模板消息推送
    XXLJOB任务调度
    MyBatis学习笔记
    SpringBoot集成Redis
  • 原文地址:https://www.cnblogs.com/wangfeng520/p/5089609.html
Copyright © 2020-2023  润新知