简单的android音乐播放器
最近在学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音乐播放器相关推荐
- Android音乐播放器eclipse,简单的Android音乐播放器 eclipse开发的基于Android平台的音乐播放器 - 下载 - 搜珍网...
压缩包 : 音乐播放器.zip 列表 音乐播放器/ 音乐播放器/.classpath 音乐播放器/.project 音乐播放器/.settings/ 音乐播放器/.settings/org.eclip ...
- 一个简单的Android音乐播放器
在这里主要是用两个简单的按钮实现音乐的播放和停止功能,工程的目录结构为: 同时添加一个文件夹,里面放后缀为mp3的文件就可以了. 在main配置文件主要是添加两个Button: 添加一个activit ...
- android音乐播放器完整教程,android实现简单音乐播放器
本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...
- 简单android音乐播放器课程设计,android音乐播放器课程设计报告.doc
android音乐播放器课程设计报告 android音乐播放器课程设计报告 基于Android音乐播放器的设计与实现 滨江学院 <移动通信程序设计> 课程设计 题 目 院 系 专 业学生姓 ...
- 基于android音乐播放器的设计
本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...
- Android音乐播放器的设计与实现
课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...
- android 音乐播放器专辑图片旋转,Android应用开发之简易、大气音乐播放器实现专辑倒影效果...
今天要实现的功能是实现专辑倒影效果,这个功能已经属于图像处理方面的了,对图像处理我不怎么在行,等一下会介绍一个很实用的工具类,专门用来进行图像处理的.这个工具类不是我写的,我只是拿来用到自己的项目当中 ...
- android七大主流Android音乐播放器横向评测
随着智能手机和3G网络的普及,移动互联网日益成为人们生活娱乐的重心之一.在音乐领域,竞争也十分激烈,在PC之后,几大提供音乐服务的厂商正在加紧占据手机客户端. 本期我们在Android平台挑选了七家国 ...
- Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)
1. 说明 源码已同步到Gitee仓库,GitHub仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. 以往的文章 服务端:Android音乐播放器开发–服务端 登录:Andr ...
最新文章
- Java之Spring mvc详解(非原创)
- 【FPGA实现GA】基于FPGA的GA优化算法的设计与实现
- 判断scrollview是否滚动到了底部
- java oracle 字符_Oracle转义字符
- leetcode359. 日志速率限制器
- 81. Search in Rotated Sorted Array II
- 24 种设计模式之 观察者模式
- 【转载】Apache Ranger剖析:Hadoop生态圈的安全管家
- idea 连接云mysql_IDEA开发环境下配置JDBC连接MySQL
- jquery 左右移动 以及使用layer.js弹出框呈现在页面上
- PLSA隐变量主题模型的公式推导解惑
- linux 黑酷命令行背景图片
- 【转载】如何让外网访问IIS里面搭建的网站
- Excel批量插入图片小技巧
- 银行IT架构变迁史(金融IT基础架构)
- EndNote实现章节后插入参考文献的方法
- 一种简单的2D Roguelike地图生成算法
- MySQL索引(详细,1万字长文)
- python 通过ftp自动 上传指定excel文件
- stm32之中断系统
热门文章
- redis的String、List、Hash、SET、ZSet五中数据类型常用的一些场景总结
- Oracle中varchar2()类型
- 软件工程与计算II-14-面向对象的模块化
- css实现霓虹灯特效字体
- python中callable_Python callable() 函数
- 中国企业家领导力创新
- 直播平台狂拼流量,“一直播”领跑商业变现之路
- IT培训就是“包就业”吗?内行人这么看
- a href=mailto:的使用总结笔记
- csgo客服端文件与比赛服务器,B5全新客户端功能大揭秘 自定义比赛功能篇