最近在学android开发,最近写了一个简易的音乐播放器,主要参考了《第一行代码》以及别人的博客。这里贴出代码,供大家交流分享,如有错误或疑问,欢迎批评或者交流探讨。本人使用的开发工具是android studio 2.1.2。

首先是MainActivity.java

package handsome.musicplayer;import android.database.Cursor;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private ListView songView;private List<Song> songList;private MediaPlayer mediaPlayer;private Button mainPlay,mainNext;private SeekBar playTime;private TextView nowPlaying;private int playType;private static int ICON_PLAY=R.drawable.bfzn_004;private static int ICON_PAUSE=R.drawable.bfzn_003;private static final int UPDATE_PLAYTIME=1;private static final int PLAY_ORDER=0;private static final int PLAY_RANDOM=1;private static final int PLAY_SINGLE=2;private int previousSong,totalSong;private ImageView bgImage;private Handler handler=new Handler(){public void handleMessage(Message msg){switch (msg.what){case UPDATE_PLAYTIME:try {playTime.setProgress(mediaPlayer.getCurrentPosition());}catch(Exception e){}break;default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*musicList=new ArrayList<>();musicView=(ListView)findViewById(R.id.musicView);adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,musicList);musicView.setAdapter(adapter);*///初始化songList=new ArrayList<>();mediaPlayer=new MediaPlayer();totalSong=0;previousSong=-1;playType=PLAY_ORDER;//控件初始化songView=(ListView)findViewById(R.id.songView);mainPlay=(Button)findViewById(R.id.mainPlay);mainNext=(Button)findViewById(R.id.mainNext);playTime=(SeekBar)findViewById(R.id.playTime);nowPlaying=(TextView)findViewById(R.id.nowPlaying);bgImage=(ImageView)findViewById(R.id.bgImage);nowPlaying.setBackgroundColor(Color.WHITE);bgImage.setImageResource(R.drawable.setsuna);bgImage.setImageAlpha(0x77);Cursor cursor=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null);while(cursor.moveToNext()){String title=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));//标题String artist=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家String url=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));//文件路径int duration=cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));//时长if(artist.compareTo("<unknown>")==0)artist="";songList.add(new Song(title,artist,url,duration));totalSong++;}if(cursor!=null)cursor.close();final SongAdapter adapter=new SongAdapter(this,R.layout.song,songList);songView.setAdapter(adapter);songView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {playSong(i);}});mainPlay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if(mediaPlayer.isPlaying()){mainPlay.setBackground(getResources().getDrawable(ICON_PLAY));mediaPlayer.pause();}else {mainPlay.setBackground(getResources().getDrawable(ICON_PAUSE));mediaPlayer.start();}}});mainNext.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switch (playType){case PLAY_ORDER:if(previousSong==totalSong-1)previousSong=-1;playSong(previousSong+1);break;case PLAY_RANDOM:playSong((int)(Math.random()*songList.size()));break;case PLAY_SINGLE:playSong((int)(Math.random()*songList.size()));break;}}});playTime.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {mediaPlayer.seekTo(playTime.getProgress());}});mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mediaPlayer) {switch (playType){case PLAY_ORDER:if(previousSong==totalSong-1)previousSong=-1;playSong(previousSong+1);break;case PLAY_RANDOM:playSong((int)(Math.random()*songList.size()));break;case PLAY_SINGLE:mediaPlayer.start();break;}}});}@Overrideprotected void onDestroy(){super.onDestroy();if(mediaPlayer!=null) {mediaPlayer.stop();mediaPlayer.release();}}void playSong(int i){Song song=songList.get(i);try {Log.e("url",song.getUrl());mediaPlayer.reset();mediaPlayer.setDataSource(song.getUrl());mediaPlayer.prepare();mediaPlayer.start();mainPlay.setBackground(getResources().getDrawable(ICON_PAUSE));previousSong=i;playTime.setMax(song.getDuration());nowPlaying.setText("正在播放:"+song.getTitle());new Thread(new Runnable() {@Overridepublic void run() {Message message=new Message();message.what=UPDATE_PLAYTIME;handler.sendMessage(message);handler.postDelayed(this,1000);}}).start();}catch (Exception e){String errorInformation="Play failed!";Toast.makeText(MainActivity.this,errorInformation,Toast.LENGTH_SHORT).show();}}public boolean onCreateOptionsMenu(Menu menu){getMenuInflater().inflate(R.menu.main_menu,menu);return true;}public boolean onOptionsItemSelected(MenuItem item){switch (item.getItemId()){case R.id.playOrder:playType=PLAY_ORDER;break;case R.id.playRandom:playType=PLAY_RANDOM;break;case R.id.playSingle:playType=PLAY_SINGLE;break;default:break;}return true;}
}

然后是Song.java

package handsome.musicplayer;/*** Created by Administrator on 2016/7/17.*/
public class Song {private String title;private String artist;private String url;private int duration;public Song(String title,String artist,String url,int duration){this.title=title;this.artist=artist;this.url=url;this.duration=duration;}public String getTitle(){return title;}public String getArtist(){return artist;}public String getUrl(){return url;}public int getDuration(){return duration;}
}

最后是SongAdapter.java

package handsome.musicplayer;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;import java.util.List;/*** Created by Administrator on 2016/7/17.*/
public class SongAdapter extends ArrayAdapter<Song> {private int resourceId;public SongAdapter(Context context,int textViewResourceId,List<Song> objects){super(context,textViewResourceId,objects);resourceId=textViewResourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){Song song=getItem(position);View view= LayoutInflater.from(getContext()).inflate(resourceId,null);TextView title=(TextView)view.findViewById(R.id.title);TextView artist=(TextView)view.findViewById(R.id.artist);title.setText(song.getTitle());artist.setText(song.getArtist());return view;}
}

这里简要分析一下,界面部分:首先调用 Cursor cursor=getContentResolver().query(MediaStore.Audio.Media. EXTERNAL_CONTENT_URI , null , null , null , null )函数提取出手机当中所有的音频文件(这里由于个人水平原因,处理得比较粗暴。而且我这里每次程序启动都会这样做一遍,其实我们可以利用数据库技术来存储这个列表,把这个操作改成手动的,这个就留给读者自己去完善了。)读取的同时,将它们用Song类型(存储了音乐名,作曲家,音乐时间长短和音乐存储位置)保存在songList内,通过songAdapter让它在songView这个控件上显示。几个layout就不贴出了,我已将源码上传至百度云盘,可供大家下载。

音乐播放部分:
首先是如何播放音乐,这个非常容易。我这里实现的功能是点击songView上的对应项就可以播放对应的音乐,这个只要在songView.setOnItemClickListener里调用一下playSong这个函数就可以了,playSong的函数里主要是通过点击的序号在songList里找到对应的对象,这样可以得到它的存储路径,通过mediaPlayer.setDataSource(song.getUrl());可以设置播放路径,然后播放即可。
最后我想说一下滚动条部分。这里我们必须要用到多线程来实时获得歌曲播放信息,但子线程是不支持UI修改的,所以我们通过handler.sendMessage,主线程通过handleMessage接收这个方法来对SeekBar的位置进行修改。具体大家可以参考我是怎么写的,更详细的可以看《第一行代码》第九章内容。
其他还实现了下一曲,循环播放,随机播放,单曲循环等功能,这些都不难,大家自己研究一下就可以了。

时间关系,就写到这里,附上源码:http://pan.baidu.com/s/1ge8Iv8f

简单的android音乐播放器相关推荐

  1. Android音乐播放器eclipse,简单的Android音乐播放器 eclipse开发的基于Android平台的音乐播放器 - 下载 - 搜珍网...

    压缩包 : 音乐播放器.zip 列表 音乐播放器/ 音乐播放器/.classpath 音乐播放器/.project 音乐播放器/.settings/ 音乐播放器/.settings/org.eclip ...

  2. 一个简单的Android音乐播放器

    在这里主要是用两个简单的按钮实现音乐的播放和停止功能,工程的目录结构为: 同时添加一个文件夹,里面放后缀为mp3的文件就可以了. 在main配置文件主要是添加两个Button: 添加一个activit ...

  3. android音乐播放器完整教程,android实现简单音乐播放器

    本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...

  4. 简单android音乐播放器课程设计,android音乐播放器课程设计报告.doc

    android音乐播放器课程设计报告 android音乐播放器课程设计报告 基于Android音乐播放器的设计与实现 滨江学院 <移动通信程序设计> 课程设计 题 目 院 系 专 业学生姓 ...

  5. 基于android音乐播放器的设计

    本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...

  6. Android音乐播放器的设计与实现

    课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...

  7. android 音乐播放器专辑图片旋转,Android应用开发之简易、大气音乐播放器实现专辑倒影效果...

    今天要实现的功能是实现专辑倒影效果,这个功能已经属于图像处理方面的了,对图像处理我不怎么在行,等一下会介绍一个很实用的工具类,专门用来进行图像处理的.这个工具类不是我写的,我只是拿来用到自己的项目当中 ...

  8. android七大主流Android音乐播放器横向评测

    随着智能手机和3G网络的普及,移动互联网日益成为人们生活娱乐的重心之一.在音乐领域,竞争也十分激烈,在PC之后,几大提供音乐服务的厂商正在加紧占据手机客户端. 本期我们在Android平台挑选了七家国 ...

  9. Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)

    1. 说明 源码已同步到Gitee仓库,GitHub仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. 以往的文章 服务端:Android音乐播放器开发–服务端 登录:Andr ...

最新文章

  1. Java之Spring mvc详解(非原创)
  2. 【FPGA实现GA】基于FPGA的GA优化算法的设计与实现
  3. 判断scrollview是否滚动到了底部
  4. java oracle 字符_Oracle转义字符
  5. leetcode359. 日志速率限制器
  6. 81. Search in Rotated Sorted Array II
  7. 24 种设计模式之 观察者模式
  8. 【转载】Apache Ranger剖析:Hadoop生态圈的安全管家
  9. idea 连接云mysql_IDEA开发环境下配置JDBC连接MySQL
  10. jquery 左右移动 以及使用layer.js弹出框呈现在页面上
  11. PLSA隐变量主题模型的公式推导解惑
  12. linux 黑酷命令行背景图片
  13. 【转载】如何让外网访问IIS里面搭建的网站
  14. Excel批量插入图片小技巧
  15. 银行IT架构变迁史(金融IT基础架构)
  16. EndNote实现章节后插入参考文献的方法
  17. 一种简单的2D Roguelike地图生成算法
  18. MySQL索引(详细,1万字长文)
  19. python 通过ftp自动 上传指定excel文件
  20. stm32之中断系统

热门文章

  1. redis的String、List、Hash、SET、ZSet五中数据类型常用的一些场景总结
  2. Oracle中varchar2()类型
  3. 软件工程与计算II-14-面向对象的模块化
  4. css实现霓虹灯特效字体
  5. python中callable_Python callable() 函数
  6. 中国企业家领导力创新
  7. 直播平台狂拼流量,“一直播”领跑商业变现之路
  8. IT培训就是“包就业”吗?内行人这么看
  9. a href=mailto:的使用总结笔记
  10. csgo客服端文件与比赛服务器,B5全新客户端功能大揭秘 自定义比赛功能篇