Android实现播放器功能
package com.example.yzj.android_7_27; import android.content.ContentResolver;
import android.content.DialogInterface;
import android.database.Cursor;
import android.media.AudioManager;
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.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar; import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; public class MusicActivity extends AppCompatActivity implements MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnPreparedListener {
private SeekBar sb;
private Button btn_play;
private Button btn_pause;
private Button btn_stop;
private Button btn_last;
private Button btn_next;
private MediaPlayer mediaPlayer;
private BtnListener btnlistener;
private MyHandler myHandler;
private Timer timer;
private Thread thread;
private boolean pause;
private ContentResolver resolver;
private List<MusicInfo> data;
private int currentMusic;
private int currentPosition;
private boolean stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
init();
setListener();
setMediaPlayer();
} private void setListener() {
btn_play.setOnClickListener(btnlistener);
btn_pause.setOnClickListener(btnlistener);
btn_stop.setOnClickListener(btnlistener);
btn_last.setOnClickListener(btnlistener);
btn_next.setOnClickListener(btnlistener);
} public void setMediaPlayer() {
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(data.get(currentMusic).getStrMusicPath());
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnPreparedListener(this);
} catch (IOException e) {
e.printStackTrace();
}
} public void start() {
if (pause) {
float i=(float)sb.getProgress()/(float)sb.getMax();
float j=mediaPlayer.getDuration();
float n=i*j;
int m=(int)n;
mediaPlayer.seekTo(m);
mediaPlayer.start();
} else if (!mediaPlayer.isPlaying()) {
mediaPlayer.prepareAsync();
if(stop){
mediaPlayer.seekTo(0);
}
}
pause = false;
stop=false;
if (!thread.isAlive()) {
try{
thread.start();
}
catch (Exception e) {
thread=new Thread(timer);
thread.start();
}
}
} public void pause() {
if (mediaPlayer != null) {
mediaPlayer.pause();
}
pause = true;
} public void stop() {
mediaPlayer.stop();
stop=true;
} private void init() {
sb = (SeekBar) findViewById(R.id.sb);
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
} @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onStopTrackingTouch(SeekBar seekBar) {
currentPosition=sb.getProgress();
}
});
btn_play = (Button) findViewById(R.id.btn_play);
btn_pause = (Button) findViewById(R.id.btn_pause);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_last = (Button) findViewById(R.id.btn_last);
btn_next = (Button) findViewById(R.id.btn_next);
data=new ArrayList<>();
getMusicInfo();
btnlistener = new BtnListener();
myHandler = new MyHandler();
timer = new Timer();
thread = new Thread(timer);
} @Override
public void onBufferingUpdate(MediaPlayer mp, int percent) { } @Override
public void onPrepared(MediaPlayer mp) {
float i=(float)currentPosition/(float)sb.getMax();
float j=mediaPlayer.getDuration();
float n=i*j;
int m=(int)n;
mediaPlayer.seekTo(m);
mediaPlayer.start();
} private class BtnListener implements View.OnClickListener { @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_play:
start();
break;
case R.id.btn_pause:
pause();
break;
case R.id.btn_stop:
stop();
break;
case R.id.btn_last:
currentMusic--;
if (currentMusic==-1) {
currentMusic=data.size()-1;
}
if (pause) {
pause = false;
}
try{
thread.start();
}
catch(Exception e){
Log.v("msg","线程已经启动");
} mediaPlayer.reset();
try {
mediaPlayer.setDataSource(data.get(currentMusic).getStrMusicPath());
mediaPlayer.prepareAsync(); } catch (IOException e) {
e.printStackTrace();
}
thread.interrupt();
break;
case R.id.btn_next:
currentMusic++;
if (pause) {
pause = false;
}
try{
thread.start();
}
catch(Exception e){
Log.v("msg","线程已经启动");
}
mediaPlayer.reset();
if(currentMusic>data.size()-1){
currentMusic=0;
}
try {
mediaPlayer.setDataSource(data.get(currentMusic).getStrMusicPath());
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
thread.interrupt();
break;
}
}
} private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0x123) {
int position = mediaPlayer.getCurrentPosition();
int duration = mediaPlayer.getDuration();
if (duration > 0) {
long pos = sb.getMax() * position / duration;
sb.setProgress((int) pos);
}
}
}
} private class Timer implements Runnable {
@Override
public void run() {
while (!pause&&!stop) {
try {
Message msg = myHandler.obtainMessage();
msg.what = 0x123;
msg.sendToTarget();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} private void getMusicInfo() {
resolver = getContentResolver();
Cursor musicCursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
//获取歌曲时间
while (musicCursor.moveToNext()) {
MusicInfo musicInfo = new MusicInfo();
int duration = musicCursor.getInt(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
String strMusicName = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String strMusicPath = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
musicInfo.setnMusicTime(duration);
musicInfo.setStrMusicName(strMusicName);
musicInfo.setStrMusicPath(strMusicPath);
data.add(musicInfo);
}
}
}
package com.example.yzj.android_7_27; import java.io.Serializable; /**
* Created by YZJ on 2016/7/27.
*/
public class MusicInfo implements Serializable {
private String strMusicName;
private int nMusicTime;
private String strMusicPath; public String getStrMusicName() {
return strMusicName;
} public void setStrMusicName(String strMusicName) {
this.strMusicName = strMusicName;
} public int getnMusicTime() {
return nMusicTime;
} public void setnMusicTime(int nMusicTime) {
this.nMusicTime = nMusicTime;
} public String getStrMusicPath() {
return strMusicPath;
} public void setStrMusicPath(String strMusicPath) {
this.strMusicPath = strMusicPath;
}
}
Android实现播放器功能的更多相关文章
- Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)
一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...
- 一款非常简单的android音乐播放器源码分享给大家
一款非常简单的android音乐播放器源码分享给大家,该应用虽然很小,大家常用的播放器功能基本实现了,可能有点还不够完善,大家也可以自己完善一下,源码在源码天堂那里已经有了,大家可以到那里下载学习吧. ...
- android音乐播放器开发教程
android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...
- 使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)
前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表& ...
- 使用Vitamio打造自己的Android万能播放器(5)——在线播放(播放优酷视频)
前言 为了保证每周一篇的进度,又由于Vitamio新版本没有发布, 决定推迟本地播放的一些功能(截图.视频时间.尺寸等),跳过直接写在线播放部分的章节.从Vitamio的介绍可以看得出,其支持http ...
- 使用Vitamio打造自己的Android万能播放器(4)——本地播放(快捷搜索、数据存储)
前言 关键字:Vitamio.VPlayer.Android播放器.Android影音.Android开源播放器 本章节把Android万能播放器本地播放的主要功能(缓存播放列表和A-Z快速查询功能) ...
- 使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、播放列表)
前言 打造一款完整可用的Android播放器有许多功能和细节需要完成,也涉及到各种丰富的知识和内容,本章将结合Fragment.ViewPager来搭建播放器的主界面,并实现本地播放基本功能.系列文章 ...
- 使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放
前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://ove ...
- 使用Vitamio打造自己的Android万能播放器(1)——准备
前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...
随机推荐
- 混合 Data Warehouse 和 Big Data 倉庫的新架構
(讀書筆記)許多公司,儘管想導入 Big Data,仍必須繼續用 Data Warehouse 來管理結構化的營運數據.系統記錄.而 Big Data 的出現,為 Data Warehouse 提供了 ...
- [译]如何防止elasticsearch的脑裂问题
本文翻译自blog.trifork.com的博文 地址是http://blog.trifork.com/2013/10/24/how-to-avoid-the-split-brain-problem- ...
- css+div常用属性备忘录
学习软件设计有一年多了,明年五月就要毕业了.回头看看发现自己其实挺差劲的. 最近开通了博客所以就整理了一下笔记,在这里发布一下自己以前学习css时总是记不住去翻书又很常用的属性,都是一些很基础的. 大 ...
- Sql Server系列:Update语句
1 UPDATE语法结构 [ WITH <common_table_expression> [...n] ] UPDATE [ TOP ( expression ) [ PERCENT ] ...
- Android总结之json解析(FastJson Gson 对比)
前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...
- Neutron 网络基本概念 - 每天5分钟玩转 OpenStack(66)
上次我们讨论了 Neutron 提供的功能,今天我们学习 Neutron 模块几个重要的概念. Neutron 管理的网络资源包括 Network,subnet 和 port,下面依次介绍. netw ...
- Hawk 数据抓取工具 使用说明(二)
1. 调试模式和执行模式 1.1.调试模式 系统能够通过拖拽构造工作流.在编辑流的过程中,处于调试模式,为了保证快速地计算和显示当前结果(只显示前20个数据,可在调试的采样量中修改),此时,所有执行器 ...
- 如何高效地向Redis插入大量的数据
最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中. 我刚开始的建议是Shell+redis客户端. 今天,查看Redis官档,发现文档的首页部分( ...
- log4net 记录MVC监控日志
由于MVC自身的特点,可以让我们记录每一个Controller下Action的执行时间以及View视图渲染完成的时间,本文采用log4net记录MVC每个Action的执行时间和View视图渲染完成时 ...
- Deque的部分成员函数 解析,关于这个类,百度有很多解析,唯独没有其函数介绍
函数 描述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数据赋值给c. 将n个elem的拷贝赋值给c. c.at(idx) 传回索引idx所指的 ...