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开发之音乐播放器的实现的更多相关文章

  1. Android开发之音乐播放器

    做了一天的音乐播放器小项目,已经上传到github,将链接发到这里供大家参阅提议 https://github.com/wangpeng0531/MusicPlayer.git

  2. Android实现简单音乐播放器(MediaPlayer)

    Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能 ...

  3. Android大作业 --音乐播放器

    1.项目成员(本次作业主要对上一次的音乐播放器进行完善) 韦家城 学号:1600802026 班级:161  博客:https://www.cnblogs.com/ln9969cc/ 邓乾尧 学号:1 ...

  4. Android实现简单音乐播放器(startService和bindService后台运行程序)

    Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有 ...

  5. Android 实现简单音乐播放器(二)

    在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...

  6. Android 实现简单音乐播放器(一)

    今天掐指一算,学习Android长达近两个月了,今天开始,对过去一段时间的学习收获以及遇到的疑难杂症做一些总结. 简单音乐播放器是我自己完成的第一个功能较为完整的APP,可以说是我的Android学习 ...

  7. android全功能音乐播放器、基于MVP-Clean + Weex + RxJava2 + Retrofit + Dagger2 + MTRVA的综合应用、图片滤镜处理等源码

    Android仿微信朋友圈查看图片下拽返回. Android图片滤镜处理,相机滤镜处理效果源码 Android自定义View源码:一个水平的进度条 基于MVP-Clean + Weex + RxJav ...

  8. Android实现网络音乐播放器

    本文是一个简单的音乐播放器 布局代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayo ...

  9. Flex4/Flash开发在线音乐播放器 , 含演示地址

    要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...

随机推荐

  1. 【原】EF简单使用

    /// <summary> /// 数据上下文对象 /// </summary> static TestEntities te = new TestEntities(); st ...

  2. Cassandra1.2文档学习(15)—— 配置数据一致性

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_config ...

  3. ssh通过密钥免密登录linux服务器

    由于经常要登录远程服务器,每次都要把密码重输一遍,如下所示: # ssh 用户名@服务器IP # 用户名@服务器IP's password:这里需要手动输入密码然后回车 作为一个懒货,必须要想个办法免 ...

  4. php获取数组中重复数据的两种方法

    分享下php获取数组中重复数据的两种方法. 1,利用php提供的函数,array_unique和array_diff_assoc来实现 <?php function FetchRepeatMem ...

  5. 几个好用的截取字符串的php函数分享

    分享几个好用的PHP 截取字符串函数(支持gb2312和utf-8). 1.截取GB2312字符用的函数 <?php /** **截取中文字符串 * edit by www.jbxue.com ...

  6. Oracle 监听动态注册与静态注册

    静态注册 静态注册是在启动listener时,listener会从listener.ora文件中获取服务名及相关信息.信息包括:实例名和服务名等. --静态注册时,listener.ora中的内容如下 ...

  7. Android UI学习1:控件和基本事件的响应

    在任何一个 GUI 系统中,控制界面上的控件(通常称为控件)都是一个基本的内容.对于 Android 应用程序,控件称为 View. 在 Android 中,在处理 UI 中的各种元素的时候,两个程序 ...

  8. uva401 - Palindromes结题报告

    题目地址 :  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  9. Qt+MinGW+OpenCV开发环境在win7系统下的搭建(最新20140423)

    1 搭建环境 (1)联想Y470笔记本电脑,win7操作系统 (2)Qt 5.2.1 Open Source :(Qt Online installer for Window(9MB),即下载页面最上 ...

  10. 《ENVI下遥感影像自然真彩色合成方法》——TM、spot5

    来源:http://blog.sina.com.cn/s/blog_764b1e9d0100tz4f.html#bsh-73-375271630