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 ...
随机推荐
- TODO:Golang UDP连接简单测试慎用Deadline
TODO:Golang UDP连接简单测试慎用Deadline UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interco ...
- TODO:软件升级的那些事
TODO:软件升级的那些事 软件升级,指软件从低版本向高版本的更新.由于高版本常常修复低版本的部分BUG,所以经历了软件升级,一般都会比原版本的性能更好,得到优化的效果,用户也能有更好的体验. 最近常 ...
- Eclipse启动参数
from 网络 eclipse 启动参数 -clean2013-- : eclipse 启动参数介绍(如添加插件时,如果不显示,则使用eclipse -clean启动) 其实,Eclipse是一个可以 ...
- jQuery 2.0.3 源码分析 事件绑定 - bind/live/delegate/on
事件(Event)是JavaScript应用跳动的心脏,通过使用JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应 事件的基础就不重复讲解了,本来是定位源码分析 ...
- sublime text学习
Ctrl + / ---------------------注释 Ctrl + 滚动 --------------字体变大/缩小 Ctrl + N-------------------新建 软件右下 ...
- document.getElementById()与 $()区别
document.getElementById()返回的是DOM对象,而$()返回的是jQuery对象 什么是jQuery对象? ---就是通过jQuery包装DOM对象后产生的对象.jQuery对象 ...
- 连接第二个 insance 到 first_local_net - 每天5分钟玩转 OpenStack(83)
上一节在 first_local_net 中已经部署了 cirros-vm1,今天将再部署一个instance,并验证两个 instance 的连通性. 以同样的方式 launch instance ...
- Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)
今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...
- 从零开始编写自己的C#框架(8)——后台管理系统功能设计
还是老规矩先吐下槽,在规范的开发过程中,这个时候应该是编写总体设计(概要设计)的时候,不过对于中小型项目来说,过于规范的遵守软件工程,编写太多文档也会拉长进度,一般会将它与详细设计合并到一起来处理,所 ...
- gravatar配置和使用【让你的网站使用全球通用头像】
前言 我们在很多博客或者网站留言,评论的时候会看到有的人头像很酷很个性化,但是这个博客和网站本身并没有提供设置头像的功能,感觉有点神奇,那么是怎么做到的呢?其实这是使用了Gravatar. Grava ...