Android开发之音乐播放器的实现
Android音乐播放器
使用到Android的Actiivity和Service组件
播放音频的代码应该运行在服务中,定义一个播放服务MusicService,服务里定义play、stop、pause、continuePlay等方法
把这几个方法抽取成一个接口MusicInterface
定义一个中间人类,继承Binder,实现MusicInterface
操作按钮等使用Activity与用户交互
同时为了把服务所在进程变成服务进程,防止Activity销毁时依旧执行Service,需要使用Service启动的混合调用,即先使用startService(),然后使用bindService()方法。
原理:使用bindService()方法,启动service。在ServiceConnection的onServiceConnected()方法中返回一个iBinder对象,通过该对象可以操作音乐service中的播放音乐的方法。
播放服务
代码:
MainActivity:
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.view.View;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener; public class MainActivity extends Activity { private MusicInterface mi; static Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
Bundle bundle = msg.getData();
//取出消息携带的数据
int duration = bundle.getInt("duration");
int currentPosition = bundle.getInt("currentPosition");
//刷新播放进度
sb.setMax(duration);
sb.setProgress(currentPosition);
};
}; private static SeekBar sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sb = (SeekBar) findViewById(R.id.sb);
//给sb设置一个拖动侦听
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
//停止拖动时调用
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//根据拖动进度,改变音乐播放进度
mi.seekTo(seekBar.getProgress());
}
//开始拖动时调用
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub }
//拖动的时候不断调用
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub }
});
Intent intent = new Intent(this, MusicService.class);
//先start启动MusicService,再bind
startService(intent);
MyServiceConn conn = new MyServiceConn();
bindService(intent, conn, BIND_AUTO_CREATE);
} class MyServiceConn implements ServiceConnection { @Override
public void onServiceConnected(ComponentName name, IBinder service) {
mi = (MusicInterface) service;
} @Override
public void onServiceDisconnected(ComponentName name) { } } public void play(View v) {
mi.play();
} public void continuePlay(View v) {
mi.continuePlay();
} public void pause(View v) {
mi.pause();
} public void stop(View v) {
mi.stop();
}
}
MusicService:
import java.util.Timer;
import java.util.TimerTask; import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message; public class MusicService extends Service {
private MediaPlayer player;
private Timer timer; @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new MusicMiddleMan();
} class MusicMiddleMan extends Binder implements MusicInterface {
public void play() {
MusicService.this.play();
} public void pause() {
MusicService.this.pause();
} public void continuePlay() {
MusicService.this.continuePlay();
} public void stop() {
MusicService.this.stop();
} @Override
public void seekTo(int progress) {
// TODO Auto-generated method stub
MusicService.this.seekTo(progress);
} } @Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
player = new MediaPlayer(); } public void play() {
System.out.println("播放");
if (player == null) {
player = new MediaPlayer();
}
player.reset();
try {
//设置网络资源
player.setDataSource("http://192.168.5.100:8080/HEYJUDE.mp3");
// 异步获取网络资源
player.prepareAsync();
player.setOnPreparedListener(new OnPreparedListener() { @Override
public void onPrepared(MediaPlayer mp) {
player.start();
addTimer(); }
});
} catch (Exception e) {
e.printStackTrace();
} } public void continuePlay() {
System.out.println("继续播放");
player.start();
} public void pause() {
System.out.println("暂停");
player.pause();
} public void stop() {
System.out.println("停止");
player.stop();
player.release();
player = null;
if (timer!=null) {
timer.cancel();
timer=null;
}
} public void seekTo(int progress){
player.seekTo(progress);
} public void addTimer() {
//播放进度需要不停的获取,不停的刷新进度条,使用计时器每1000毫秒获取一次播放进度
//发消息至Handler,把播放进度放进Message对象中,在Handler中更新SeekBar的进度
if (timer == null) { timer = new Timer();
timer.schedule(new TimerTask() { @Override
public void run() {
// 获取到歌曲总时长
int duration = player.getDuration();
// 获取歌曲当前进度
int currentPosition = player.getCurrentPosition();
Message msg = MainActivity.handler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt("duration", duration);
bundle.putInt("currentPosition", currentPosition);
msg.setData(bundle);
MainActivity.handler.sendMessage(msg); }
}, 5, 1000);
} } }
把MusicControl类抽取出来为接口,这样可以在MainActivity中只可以访问接口的方法,MusicControl类中的其他方法不被方法
MusicInterface:
public interface MusicInterface {
void play();
void continuePlay();
void stop();
void pause();
void seekTo(int progress);
}
Android开发之音乐播放器的实现的更多相关文章
- Android开发之音乐播放器
做了一天的音乐播放器小项目,已经上传到github,将链接发到这里供大家参阅提议 https://github.com/wangpeng0531/MusicPlayer.git
- Android实现简单音乐播放器(MediaPlayer)
Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能 ...
- Android大作业 --音乐播放器
1.项目成员(本次作业主要对上一次的音乐播放器进行完善) 韦家城 学号:1600802026 班级:161 博客:https://www.cnblogs.com/ln9969cc/ 邓乾尧 学号:1 ...
- Android实现简单音乐播放器(startService和bindService后台运行程序)
Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有 ...
- Android 实现简单音乐播放器(二)
在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...
- Android 实现简单音乐播放器(一)
今天掐指一算,学习Android长达近两个月了,今天开始,对过去一段时间的学习收获以及遇到的疑难杂症做一些总结. 简单音乐播放器是我自己完成的第一个功能较为完整的APP,可以说是我的Android学习 ...
- android全功能音乐播放器、基于MVP-Clean + Weex + RxJava2 + Retrofit + Dagger2 + MTRVA的综合应用、图片滤镜处理等源码
Android仿微信朋友圈查看图片下拽返回. Android图片滤镜处理,相机滤镜处理效果源码 Android自定义View源码:一个水平的进度条 基于MVP-Clean + Weex + RxJav ...
- Android实现网络音乐播放器
本文是一个简单的音乐播放器 布局代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayo ...
- Flex4/Flash开发在线音乐播放器 , 含演示地址
要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...
随机推荐
- 开源 侧滑 和 Tab滑动翻页 控件
侧滑 https://github.com/jfeinstein10/SlidingMenu Tab滑动翻页 https://github.com/astuetz/PagerSlidingTabStr ...
- 提高 Discuz 门户文章被百度收录的方法
如果你了解 SEO,你就该清楚使用 canonical URL 标签可以固定网页标准地址,可以提高网页的权重,有利于搜索引擎收录. 例如我的网站拥有两个子域名www.bbseat.com.cn和bbs ...
- setcookie,getcookie,delcookie,setpostBgPic
function setCookie(name,value) { var Days = 365; //此 cookie 将被保存 30 天 var exp = new Date(); //new Da ...
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...
- 生产场景NFS共享存储优化及实战
生产场景NFS共享存储优化: 1.硬件:sas/ssd磁盘,买多块,raid0/raid10,网卡好 2.NFS服务器端优化加all_squash,async /backup/NFS 192.168. ...
- Mooncake (排序+贪心)
Mooncake is a Chinese bakery product traditionally eaten during the Mid-Autumn Festival. Many types ...
- 【转】perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行
默认状态下,很显然都是用\n来区分行,\n也被我们称作为换行符. 当读取序列时,按行来读取时,就是以换行符为标准. 读取的strawberry1.gb的文件内容如下: LOCUS JX118024 4 ...
- shell 实现类似php的require_once函数
config.sh #/bin/bash require_once() { #File the true path ,To prevent a symbolic link local realpath ...
- 关于Oracle数据库中SQL空值排序的问题
在Oracle中进行查询排序时,如果排序字段里面有空值的情况下,排序结果可能会达不到自己想要的结果. 如 select * from tableTest order by VISITS desc ...
- Java程序员的发展前景
不知道什么时候开始,IT业初级程序员的工作性质与进城打工的"农民工"变得如此惊人的相似.很多IT公司的高管认为"人便宜,就是要用到坏掉,然后再找更便宜.更年轻的" ...