文档章节

音乐播放器--简单实现播放、暂停、随机播放、音乐进度条(第一版)

Bonjourss
 Bonjourss
发布于 2016/05/11 09:18
字数 1151
阅读 82
收藏 2
界面如下:
                 

说明一下实现这个音乐播放器的思路。
首先,打开应用后查找手机上所有的音乐,放在Application中。这样做避免以后查找播放音乐的时候使用静态变量(上个应用就是应为大量使用静态变量,内存消耗太大,Activity老是被回收,所以这次直接把要使用的数据放在Application,使用的时候再取出来)
获取手机上所有音乐(有个缺点,就是所有是声音的文件都查找出来了,这部分以后还要优化,优化成自定义扫描目录,获获取手机上歌曲。)
代码如下:
<pre name="code" class="java"> private List<Music> musiclist;
 @Override
 public void onCreate() {
  super.onCreate();
  searchMusicONPhone();
 }
 /**
  * 查找手机上所有歌曲
  */
 private void searchMusicONPhone(){
 
  Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
    null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
  musiclist = new ArrayList<Music>();
  if(cursor == null || cursor.getCount() <= 0){
   setMusiclist(musiclist);
  }else{
   while(cursor.moveToNext()){
    Music music = new Music();
    music.setId(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID))); //歌曲ID
    music.setTitle(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)));//歌曲的名称
    music.setAlbum(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM))); //歌曲的专辑名
    music.setArtists(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST))); //歌曲的歌手名
    music.setTimes(toTime(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION))));//歌曲的总播放时长
    music.setPath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));//歌曲文件的路径
    music.setSize(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE)));//歌曲文件的大小
    musiclist.add(music);
   }
   setMusiclist(musiclist);
  }
  if(cursor != null){
   cursor.close();
   cursor = null;
  }

 }

 public List<Music> getMusiclist() {
  return musiclist;
 }

 public void setMusiclist(List<Music> musiclist) {
  this.musiclist = musiclist;
 }


在Activity中获取歌曲代码如下:  
mApplication = (MyApplication)getApplication();
musiclist = mApplication.getMusiclist();



第二步:当点击播放音乐的时候,传递给Service音乐id,在后台打开音乐。代码如下:
1、在<manifest>中 声明<service>    
<service
            android:name="com.mini.service.MusicService">
            <intent-filter>
                <action android:name="com.app.media.music_service"/>
            </intent-filter>
   </service>


2、创建自己的Service
package com.mini.service;

import java.io.IOException;
import java.util.List;

import com.mini.MyApplication;
import com.mini.R;
import com.mini.activity.base.BaseActivity;
import com.mini.bean.Music;
import com.mini.constans.Constants;

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.provider.MediaStore;

@SuppressLint("HandlerLeak")
public class MusicService extends Service implements MediaPlayer.OnCompletionListener {

 private MyApplication mApplication;
 private List<Music> mList;
 private MediaPlayer mPlayer;
 private int op;
 private Uri uri;
 private int id;
 private int position;
 private int currentTime;
 private Handler mHandler;
 private int duration;
 
 @Override
 public void onCreate() {
  super.onCreate();
  mApplication = (MyApplication)getApplication();
  mList = mApplication.getMusiclist();
  if(mPlayer != null){
   mPlayer.reset();
   mPlayer.release();
   mPlayer = null;
  }
  mPlayer = new MediaPlayer();
  mPlayer.setOnCompletionListener(this);
 }

 @SuppressWarnings("deprecation")
 @Override
 public void onStart(Intent intent, int startId) {
  super.onStart(intent, startId);
  position = intent.getIntExtra("idOption", -1);
  if(position == -1){
  }else{
   playMusic();
  }
 
  op = intent.getIntExtra("op", -1);
   switch (op) {
   case Constants.MUSIC_PLAY:
    playing();            
    break;
   case Constants.MUSIC_PAUSE:
    pause();
    break;
   case Constants.MUSIC_STOP:
    stop();        
    break;
   case Constants.PROGRESS_CHANGE:
    currentTime = intent.getExtras().getInt("progress");
    mPlayer.seekTo(currentTime);
    break;
   case -1:
    setUp();
    initBorderCastService();
    break;
   default:
    break;
   }
  }
 
 
 /**
  * 初始化歌曲信息、进度条
  */
 private void setUp(){
  final Intent intent = new Intent();
  intent.setAction(Constants.MUSIC_DURATION);
   try {
   
    if(!mPlayer.isPlaying()){
     mPlayer.prepare();
    }
    mPlayer.setOnPreparedListener(new OnPreparedListener() {
     @Override
     public void onPrepared(MediaPlayer mp) {
      mHandler.sendEmptyMessage(1);
     }
    });
   
   } catch (IllegalStateException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
   duration = mPlayer.getDuration();
   intent.putExtra("duration", duration);
   sendBroadcast(intent);
 }
 
 /**
  * 初始化广播机制
  */
 private void initBorderCastService(){
  final Intent intent = new Intent();
  intent.setAction(Constants.MUSIC_CURRENT);
  if(mHandler == null){
   mHandler = new Handler(){
    public void handleMessage(Message msg){
     if(msg.what == 1){
      currentTime = mPlayer.getCurrentPosition();
      intent.putExtra("currentTime", currentTime);
      if(position == -1){
       intent.putExtra("position",intent.getIntExtra("position", -1));
      }else{
       intent.putExtra("position",position);
      }
     
      sendBroadcast(intent);
     }
     mHandler.sendEmptyMessageDelayed(1, 1000);
    }
   };
  }
 }
 

 /**
  * 播放歌曲
  */
 private void playing(){
  if(mPlayer != null){
   mPlayer.start();
  }
 }
 
 /**暂停*/
 private void pause() {
  if (mPlayer != null) {
   mPlayer.pause();
  }
 }
 
 /** 停止*/
 private void stop() {
  if (mPlayer != null) {
   mPlayer.stop();
   try {
    mPlayer.prepare();
    mPlayer.seekTo(0);
   } catch (IllegalStateException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
   mHandler.removeMessages(1);

  }
 }
 @Override
 public IBinder onBind(Intent intent) {
  return null;
 }

 private static  int i;
 @Override
 public void onCompletion(MediaPlayer mp) {
  nextMusic();
 }

 private void nextMusic() {
  switch (BaseActivity.loop_method) {
  case Constants.LOOP_ONE:
   break;
  case Constants.LOOP_ALL:
   if (position == mList.size()-1) {
    position = 0;
   } else if (position < mList.size()-1) {
    position++;
   }
   break;
  case Constants.LOOP_NONE:
   position = BaseActivity.mRandomID();
   break;
  default:
   break;
  }
  playMusic();
  setUp();
  initBorderCastService();
  playing();
 }
 
 public void playMusic(){
  id = mList.get(position).getId();
  uri = Uri.withAppendedPath(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id + "");
  try {
   mPlayer.reset();
   mPlayer.setDataSource(this,uri);
   mPlayer.prepare();
   mPlayer.start();
  } catch (IllegalStateException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 
 }

}
3、播放事件
  /**
   * 随机播放音乐事件
   */
  radom_begin_music.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    myPosition = mRandomID();
    Intent intent = new Intent();
    intent.setAction("com.app.media.music_service");
    intent.putExtra("idOption", myPosition);
    startService(intent);
    flag = Constants.MUSIC_PAUSE;
   }
  });


接下来是细节问题,比如进度条改变,暂停音乐,继续播放。。
1、进度条改变是通过Service不断发送广播,然后在Activity中接收广播
 
/**
  * 接收广播,更新歌曲的进度
  */
 protected BroadcastReceiver musicReceiver = new BroadcastReceiver(){
  @Override
  public void onReceive(Context context, Intent intent) {
   String actionString = intent.getAction();
   if(actionString.equals(Constants.MUSIC_CURRENT)){
    currentPosition = intent.getExtras().getInt("currentTime");
    position = intent.getExtras().getInt("position");
    music_durtion_sBar.setProgress(currentPosition);
    music_preform_time.setText(toTime(currentPosition));
    bottomUpdate();
   }else if(actionString.equals(Constants.MUSIC_DURATION)){
    duration = intent.getExtras().getInt("duration");
    music_durtion_sBar.setMax(duration);
   }
  }
 };

2、底部的暂停播放按钮事件
/**
   * 底部播放暂停按钮
   */
  bottom_play_btn.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
   
    switch (flag) {
    case Constants.MUSIC_PAUSE:
     pause();
     break;
    case Constants.MUSIC_PLAY:
     play();
     break;
    default:
     break;
    }
   }
  });

 /**
  * 播放音乐
  */
 public void play() {
  flag = Constants.MUSIC_PAUSE;
  bottom_play_btn.setBackgroundResource(R.drawable.bottom_play);
  Intent intent = new Intent();
  intent.setAction("com.app.media.music_service");
  intent.putExtra("op", Constants.MUSIC_PLAY);// 向服务传递数据
  startService(intent);
 }
 
 /**
  * 暂停
  */
 public void pause() {
  flag = Constants.MUSIC_PLAY;
  bottom_play_btn.setBackgroundResource(R.drawable.bottom_pause);
  Intent intent = new Intent();
  intent.setAction("com.app.media.music_service");
  intent.putExtra("op", Constants.MUSIC_PAUSE);
  startService(intent);
 }



3、下一首事件代码
/**
  * 下一首
  */
 public  void nextOne() {
  stop();
  setup();
  playNext();
 }
 
 public void playNext() {
  flag = Constants.MUSIC_PAUSE;
  int music_id = position;
 
  switch (loop_method) {
  case Constants.LOOP_ONE:
   music_id = position;
   break;
  case Constants.LOOP_ALL:
   if (position == musiclist.size()-1) {
    position = 0;
    music_id = position;
   } else if (position < musiclist.size()-1) {
    position++;
    music_id = position;
   }
   break;
  case Constants.LOOP_NONE:
   music_id = mRandomID();
   break;
  default:
   break;
  }
  bottom_play_btn.setBackgroundResource(R.drawable.bottom_play);
  Intent intent = new Intent();
  intent.setAction("com.app.media.music_service");
  intent.putExtra("idOption", music_id);// 向服务传递数据
  startService(intent);
 }

 /**
  * 停止播放音乐
  */
 private void stop() {
  unregisterReceiver(musicReceiver);
  Intent intent = new Intent();
  intent.setAction("com.app.media.music_service");
  intent.putExtra("op", Constants.MUSIC_STOP);
  startService(intent);
 }
 
 /**
  * 初始化
  */
 private void setup() {
  init();
 }




这里可以下载源码:http://download.csdn.net/detail/yan943789510/8615689

本文转载自:http://blog.csdn.net/yan943789510/article/details/45168471

Bonjourss
粉丝 2
博文 37
码字总数 2312
作品 0
虹口
程序员
私信 提问
手把手教你做音乐播放器(一)功能规划

版权声明:本文为博主原创文章,禁止转载,违者必究。 https://blog.csdn.net/anddlecn/article/details/52594998 前言 学习完“计算器” “视频播放器” “蓝牙聊天”以后,对安卓应用的开发...

anddlecn
2016/09/20
0
0
HTML+CSS+JAVASCRIPT 高仿低配网页版网易云音乐播放器

前言 没有使用任何框架,只是想用最简单纯js的代码实现下 前台: Javascript+jQuery 后台: php/nodejs(php是参考网上的例子写的,nodejs代码是在php的基础上重新写的) 还有她的姊妹篇(网易...

Yangfan
2018/10/29
0
0
Vue全家桶打造自适应 web 音乐播放器

虽然全网上 Vue 仿饿了么、xx音乐的项目一大堆,但是我还是厚着脸皮来了,毕竟我也稍微标新立异,PC端为主,移动端为辅打造的 web 音乐播放器,所以说大佬们关爱下,毕竟我这个播放器刚从韩国...

小小茂茂
2018/05/22
0
0
Android开发---MediaPlayer简单音乐播放器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/zhaokx3/article/details/53432718 Android开发—MediaPlayer简单音乐...

OneDay-X
2016/12/02
0
0
运用面向对象原则,设计一款音乐点唱机

.设计内容及要求 能够实现简单的音乐播放器功能,如:打开本地文件,播放,暂停,停止,背景播放,单曲循环等等,界面充实,交互友好,可以添加多首歌曲目录 一个简单的基于java语言的音乐播...

一贱书生
2016/11/21
90
0

没有更多内容

加载失败,请刷新页面

加载更多

arduino项目-1. 模拟楼道灯

@toc 1.1 情景说明 说明 漆黑的夜晚,当有人非法进入一所房屋,房屋内的灯在恰当的时间亮起,也许会有效阻止非法活动的继续。 效果展示 1.2 实验器材 器材名称 数量 继电器 1 人体红外感应器...

acktomas
16分钟前
3
0
Nacos 常见问题及解决方法

Nacos 开源至今已有一年,在这一年里,得到了很多用户的支持和反馈。在与社区的交流中,我们发现有一些问题出现的频率比较高,为了能够让用户更快的解决问题,我们总结了这篇常见问题及解决方...

阿里云官方博客
23分钟前
3
0
pinyin4j 满足中文转拼音的需求

引入依赖 // https://mvnrepository.com/artifact/com.belerweb/pinyin4j //汉字转拼音compile group: 'com.belerweb', name: 'pinyin4j', version: '2.5.1' 写入中文转拼英的工具......

edison_kwok
28分钟前
3
0
IPSE接入Substrate/Polkadot插槽实现互操作性的运行原理

Substrate框架将区块链的众多功能都模块化,对于开发者来说,只是一个选择的问题,同时还保持了众多的可以定制的功能和模块,比如底层通信模块,比如账户体系,比如共识机制等都是可以自己定...

IPSE
34分钟前
154
0
linux配置安装phpMyAdmin的步骤记录

1、首先在phpMyAdmin官方网站 http://www.phpmyadmin.net/downloads下载源码包,或者通过脚本之家进行下载://www.jb51.net/codes/405261.html ,下载后上传到服务器解压即可,或者通过Linux...

蜗牛女孩
35分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部