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及以上 演示地址 演 ...
随机推荐
- DICOM开源库
转载于 http://blog.csdn.net/jackmacro/article/details/5850142 Developers used to search for libraries , ...
- ISO-9126 软件质量模型
摘要 在软件开发过程中,软件的质量是一个重要的因素,而软件体系结构在整个过程中显得尤为重要.软件的质量需求是在开发初期的非功能性需求,对软件的体系结构影响很大.但是并不意味着一味的追求质量,必须在效率 ...
- javac mac 终端乱码
java和javac在简体中文的Mac OSX的终端(Terminal.app)环境下,默认是以GBK编码的中文输出各种诸如语法错误,数组访问越界之类的信息.但是,Mac的终端的默认编码是UTF-8, ...
- 《WPF程序设计指南》读书笔记——第3章 内容的概念
1.Content属性及字体相关的属性 using System; using System.Windows; using System.Windows.Media; namespace LY.Dis ...
- 种子填充找连通块 floodfill
Description Due to recent rains, water has pooled in various places in Farmer John's field, which is ...
- 第二章 约束和排序数据(SQL基础)
第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时,条件包括边界值: ...
- python logging 日志轮转文件不删除问题
前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据. 分析 项目使用了 logg ...
- 监控SQL Server的job执行情况
在服务器没有设置发邮件并且不允许发邮件的情况下, 可以通过下列语句来检查SQL Server 的job的执行情况 select top 150 a.run_date,a.run_time, b.nam ...
- Asp.Net MVC结合ExtJs gridPanel 分页和高度自适应
Ext.onReady(function () { gridPanel(); var panel = Ext.getCmp('gridPanel'); window.onresize = functi ...
- DXperience-12.1.5 官网下载+注册破解+帮助文档
安装包 DXperience 12.1.5 Universal 帮助文档: DXperienceHelp2010 DXperienceHelp2010-12.1.5.exe DXperienceHel ...