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. DTcms 导航选中样式以及简化方法

    (建议使用方法2,执行效率略高) 一般用于导航不能循环输出的情况. 可以循环输出导航的情况直接用if判断即可. 首页模版中顶部,自定义c#代码. <%set string channel=&qu ...

  2. ios 数字禁止变成电话号码

    1.使用meta来限制页面不转换电话号码   <meta name="format-detection"content="telphone=no"/> ...

  3. discuz!X2.5技术文档

    discuz!系统常量: DISCUZ_ROOT //网站根目录 TIMESTAMP   //程序执行的时间戳 CHARSET     //程序的编码类型 FORMHASH    //HASH值 其余 ...

  4. Delphi Idhttp Post提交 Aspx/Asp.net 时 500错误的解决办法。

    一直使用Delphi写程序,因为习惯了,用起来方便. 但是有一个问题困扰了我半年了.就是使用Idhttp Post提交时候总会有莫名其妙的错误,大部分网站没问题,但是一遇到Asp.net就报错500. ...

  5. Ubuntu安装google Gtest

    (1) 下载源码:http://code.google.com/p/googletest/gtest-1.7.0 (2013)gtest-1.7.0 (2010) (2) README编译指南126 ...

  6. 2014年辛星完全解读Javascript第五节 break和continue与错误处理

    先说一下break和continue的主要用法吧,break用于跳出循环,continue用于跳过该循环中的一个迭代.简单的说,就是break直接从该语句跳出,但是continue不会跳出该循环语句, ...

  7. mysql mysqldump只导出表结构或只导出数据的实现方法

    mysql mysqldump只导出表结构或只导出数据的实现方法,需要的朋友可以参考下. mysql mysqldump 只导出表结构 不导出数据 复制代码代码如下: mysqldump --opt ...

  8. Integer自动装箱分析

    先看看下面的代码会输出什么: public static void main(String[] args) { Integer i = 127; Integer j = 128; Integer ii ...

  9. xcode 6.3 打包crash问题--参考

    xcode升级6.3之后,有些项目会出现打包crash的问题,只要选择偏好设置,把source control全部禁用掉就可以了.

  10. 【数位DP】bzoj1026: [SCOI2009]windy数

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4163  Solved: 1864[Submit][Sta ...