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 ...
随机推荐
- Mac安装Bower
1.安装bower,得首先安装node: brew install npm //npm是nodejs的程序包管理器,如果安装过nodejs,可忽略此步. 2.安装Git(因为需要从Git仓库获取一些代 ...
- k近邻(KNN)复习总结
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合内容: 1.算法概述 K近邻算法是一种基本分类和回归方法:分类时,根据其K个最近邻的训练实例的类 ...
- Intellij IDEA 13.1.3 打开多个窗口项目
作者QQ:1095737364 Intellij 是Java开发人员最喜欢的编程工具.默认情况只能打开一个窗口一个项目,本文就是教大家打开多个窗口,实现同时打开多个项目 第一步:打开Intellij, ...
- vmware 虚拟机通信拿不到 inet addr 的解决办法
我在虚拟机上安装完红帽之后,使用ifconfig命令来看网卡的IP,但是,输入命令之后,eht0里面只有 inet6 addr 而没有 inet addr,不多说,上图. 解决办法如下:打开 虚拟机设 ...
- java IO流 之 其他流
一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一). public class ByteArrayInputStream extends ...
- lintcode 落单的数(位操作)
题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...
- AngularJS之ng-class(十一)
前言 本节我们来讲讲指令中的ng-class,通过添加ng-class来生成对应的样式,有时候得根据不同的条件来选择对应的样式,本节我们来看看ng-class的灵活性用法. ng-class使用字符串 ...
- C#线程同步自动重置事件——AutoResetEvent
AutoResetEvent对象用来进行线程同步操作,AutoResetEvent类继承waitHandle类. AutoResetEvent对象有终止和非终止两种状态,终止状态是线程继续执行,非终止 ...
- 关于在Linux64位下安装xampp
网上关于这个主题的内容比较少,所以就写一下按装后的心得.之前一直在windows下用xampp,想在Linux下也体验一把,可是自己的Linux装的是64位的在XAMPP的官网上http://www. ...
- spring笔记--事务管理之声明式事务
事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使 ...