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 ...
随机推荐
- 老司机学新平台 - Xamarin开发之我的第一个MvvmCross跨平台插件:SimpleAudioPlayer
大家好,老司机学Xamarin系列又来啦!上一篇MvvmCross插件精选文末提到,Xamarin平台下,一直没找到一个可用的跨平台AudioPlayer插件.那就自力更生,让我们就自己来写一个吧! ...
- k近邻(KNN)复习总结
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合内容: 1.算法概述 K近邻算法是一种基本分类和回归方法:分类时,根据其K个最近邻的训练实例的类 ...
- 生成模型(Generative Model)与判别模型(Discriminative Model)
摘要: 1.定义 2.常见算法 3.特性 4.优缺点 内容: 1.定义 1.1 生成模型: 在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下.它给观测值和标 ...
- Vue 入门指南
英文:http://vuejs.org/guide/index.html 介绍 vue.js 是用来构建web应用接口的一个库 技术上,Vue.js 重点集中在MVVM模式的ViewModel层,它连 ...
- SSIS Design5:使用暂存
以数据流的方式来设计Package,将核心数据处理移动到数据流中,一般情况下,能够减少临时表的创建,获得较高的处理性能,在某些情况下,使用暂存表(staging table)能够优化package设计 ...
- 前端组件化Polymer入门教程(8)——事件
可以在listeners对象中监听事件 <x-custom></x-custom> <dom-module id="x-custom"> < ...
- 【Win 10 应用开发】打印UI元素
Windows App支持将UI界面进行打印的功能,这与浏览器中的打印网页的用途相近,其好处就是“所见即所得”,直接把界面上呈现的内容打印下来,比重新创建打印图像方便得多. 要在通用App中实现打印, ...
- python进程池:multiprocessing.pool
本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...
- Cnblogs支持Latex及测试
为了方便后续机器学习文章的书写,因此在cnblogs中设置了支持Latex. 设置: 在"后台管理"中"页首Html代码"中加入如下代码: <script ...
- mac+php+xdebug+phpstorm在苹果下配置xdebug一波三折
1.下载xdebug文件 http://xdebug.org/wizard.php 将phpinfo()的源代码复制到文本框中,xdebug会提示如何配置和下载哪个版本的xdebug. 全部下载地址: ...