原创:Android应用开发记录-Andorid歌词秀(3)使用的Service的音频播放器
在下文中我们实现的简单的音乐播放功能。
原创:Android应用开发记录-Andorid歌词秀(2)先来一个音频播放器
但是这样的方式在程序退出后播放也会停止,为了解决这个问题,使用的Service类。
在参考网上播放器例子代码的基础上,运用Proxy模式简化的Service的管理和使用。
功能简介:
1.选择手机上的音频,以list形式表示。
2.点击对应标题播放歌曲。
3.点击播放中的歌曲时,暂停播放,再次点击,继续播放。
工程,源码下载地址:http://download.csdn.net/source/3527938
简单说明
MusicPlaybackService 类
管理MediaPlayer 的生成和创建
实现了Resume功能
播放文件名的设定和取得功能
public class MusicPlaybackService extends Service {
private MediaPlayer mMediaPlayer = new MediaPlayer();
private final IBinder mBinder = new LocalBinder();
private int mPausePosition = 0;
private String mDataSource;
public class LocalBinder extends Binder {
public MusicPlaybackService getService() {
return MusicPlaybackService.this ;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
mMediaPlayer = new MediaPlayer();
super.onCreate();
}
@Override
public void onDestroy() {
mMediaPlayer.release();
mMediaPlayer = null;
super.onDestroy();
}
public void setDataSource(String path) {
mDataSource = path;
try{
mMediaPlayer.reset();
mMediaPlayer.setDataSource(path);
mMediaPlayer.prepare();
}catch(IOException e) {
return;
} catch (IllegalArgumentException e) {
return;
}
}
public String getDataSource(){
return mDataSource;
}
public void start() {
mMediaPlayer.start();
}
public void stop() {
mMediaPlayer.stop();
}
public void pause() {
mPausePosition = getPosition();
mMediaPlayer.pause();
}
public void resume() {
seek(mPausePosition);
mMediaPlayer.start();
}
public boolean isPlaying() {
return mMediaPlayer.isPlaying();
}
public int getDuration() {
return mMediaPlayer.getDuration();
}
public int getPosition() {
return mMediaPlayer.getCurrentPosition();
}
public long seek(long whereto) {
mMediaPlayer.seekTo((int ) whereto);
return whereto;
}
}
Service类完成以后,就可以使用的,只是还有点繁琐,能不能包装一下呢?在这个程序中为了简化Service的利用,追加了一个MusicPlaybackServiceProxy类
主要是封装的ServiceConnection关联部分。虽然mPlaybackService 是在绑定后(实际上还要晚一点)才可用的,但是MusicPlaybackServiceProxy随时可用。
代码其实很简单,一看就应该能理解。
public class MusicPlaybackServiceProxy {
private ContextWrapper mContextWrapper= null;
private MusicPlaybackService mPlaybackService = null ;
private ServiceConnection mPlaybackConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mPlaybackService = ((MusicPlaybackService.LocalBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
mPlaybackService = null ;
}
};
MusicPlaybackServiceProxy(ContextWrapper cw){
mContextWrapper = cw;
}
void startAndBindService(){
mContextWrapper.startService(new Intent(mContextWrapper ,MusicPlaybackService.class));
mContextWrapper.bindService(new Intent(mContextWrapper, MusicPlaybackService.class), mPlaybackConnection, Context.BIND_AUTO_CREATE);
}
void stopService(){
if(mPlaybackService != null){
mContextWrapper.stopService(new Intent(mContextWrapper ,MusicPlaybackService.class));
}
}
public void setDataSource(String path) {
mPlaybackService.setDataSource(path);
}
public String getDataSource(){
if(mPlaybackService != null){
return mPlaybackService.getDataSource();
}else{
return null;
}
}
public void start() {
if(mPlaybackService != null){
mPlaybackService.start();
}
}
public void stop(){
if(mPlaybackService != null){
mPlaybackService.stop();
}
}
public void pause() {
if(mPlaybackService != null){
mPlaybackService.pause();
}
}
public void resume() {
if(mPlaybackService != null){
mPlaybackService.start();
}
}
public boolean isPlaying() {
if(mPlaybackService != null){
return mPlaybackService.isPlaying();
}else{
return false;
}
}
public int getDuration() {
if(mPlaybackService != null){
return mPlaybackService.getDuration();
}else{
return 0;
}
}
public int getPosition() {
if(mPlaybackService != null){
return mPlaybackService.getPosition();
}else{
return 0;
}
}
public long seek(long whereto) {
if(mPlaybackService != null){
return mPlaybackService.seek(whereto);
}else{
return 0;
}
}
};
最后是使用代码的例子,更简单。
public class SubtitleMain extends Activity{
private Cursor mCursor;
private ListView mFilelist;
private MusicPlaybackServiceProxy mProxy = new MusicPlaybackServiceProxy(this);
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mProxy.startAndBindService();
mCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null ,
null ,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
//初始化歌曲列表
mFilelist = (ListView)findViewById(R.id.audio_file_view);
startManagingCursor(mCursor);
String[] from = new String[] {MediaStore.Audio.Media.TITLE};
int[] to = new int[]{R.id.music_title};
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this,R.layout.file_list_row, mCursor, from ,to);
mFilelist.setAdapter(adapter);
mFilelist.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
mCursor.moveToPosition(position);
String url = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
String urlPlaying = mProxy.getDataSource();
if(urlPlaying == null || url.compareTo(urlPlaying)!=0){
//如果是第一次播放或不是同一首歌
mProxy.setDataSource(url);
mProxy.start();
}else{
if(mProxy.isPlaying()){
mProxy.pause();
}else{
mProxy.resume();
}
}
}
});
}
@Override
protected void onPause() {
if(!mProxy.isPlaying()){
mProxy.stopService();
}
super.onPause();
}
}
原创:Android应用开发记录-Andorid歌词秀(3)使用的Service的音频播放器相关推荐
- 原创:Android应用开发记录-Andorid歌词秀(4)完成,含源码
最新版软件请参照: Android应用开发记录-字幕播放器(5)完善 功能简介: 1.自动读取与音乐相同位置的歌词文件 2.根据播放进度,表示当前的歌词 3.按歌词语句快进,快退. 可以用来记歌词,学 ...
- 原创:Android应用开发记录-Andorid歌词秀(1)想法
现在有好多外语资源都带有字幕信息,就是那个LRC文件,内容大致如此 [00:23.49]我越慌张却越灿烂 [00:28.65]倒退着跑到了前方 [00:34.89]怎么忽然就成了这样 [00:41.1 ...
- Android应用开发记录-Android歌词秀(5)完善一下,像一个产品了
原创:Android应用开发记录-Andorid歌词秀(4)完成,含源码中的播放器虽然实现了播放,歌词移动等功能,但是距离真正产品级的软件还有一段距离,为此进行了完善 增加的主要功能 1.将操作按钮改 ...
- 【创新项目实训】Android移动开发教学app案例之音频播放器(二)
教学app案例之音频播放器(二) 一.开发环境 二.项目介绍 三.开始主界面 四.显示歌曲列表 五.播放音乐的服务 六.实现播放音乐 一.开发环境 软件环境: Android Studio 4.1.3 ...
- Android SELinux开发入门指南之如何增加Native Binder Service权限
Android SELinux开发入门指南之如何增加Native Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指 ...
- Android SELinux开发入门指南之如何增加Java Binder Service权限
Android SELinux开发入门指南之如何增加Java Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之 ...
- Android 使用 MediaCodec API音频播放器
OpenMAX 有时缩写为"OMX",是针对多媒体处理的免版税.跨平台的例程和接口集.它主要用于嵌入式设备,在设计时考虑了效率,因此可以以优化和受控的方式处理大量多媒体数据,包括视 ...
- 网页版音频播放器,歌词随音乐而动
制作不易,多多支持,谢谢!! 我的博客里面还有关于视频播放器的,感兴趣的小伙伴可以来看看. 这个是效果图 这是利用audio做的一个歌词随音乐而动的html页面. 这个简单的音频播放器是用ajax请求 ...
- android服务绑定音乐播放器,Android基于Service的音乐播放器
本文开发一个基于Service的音乐播放器,音乐由后台运行的Service负责播放,当后台的播放状态发生变化时,程序将会通过发送广播通知前台Activity更新界面:当点击Activity的界面按钮时 ...
最新文章
- 推荐7款实用强大的神器工具,建议你先收藏,总有一天你会用到!
- 人体上身各部位图_【肝货】画好人体结构,你还需要了解这些
- Android中开发习惯
- 致新手——OpenStack云倒底是什么?
- Docker教程-深度学习环境配置
- java –cp ./:_成为Java流大师–第3部分:终端操作
- ZK的实际应用:MVVM –加载和渲染数据
- Ubuntu ufw 取消 网关到 224.0.0.1 multicast 日志
- 基于能量均衡高效WSN的LEACH协议改进算法
- Unity 2D人物移动实现
- VBA控制Excel行列转换
- (转)移动端自适应方案
- 接口测试+自动化接口测试详解入门到精通
- Unified diagnostic services (UDS)
- firebox插件制作
- Javaweb学习第三天,CSS(知识点来自广陵散老师总结)
- 关于“存储空间不足”的问题
- Java+spring+springmvc ssm432咖啡馆咖啡销售预定管理系统#毕业设计
- 计算机组成原理——8086 CPU寄存器
- Vanish CDN
热门文章
- 正弦函数的频谱图(FFT)
- SpringBoot整合RabbitMQ之 典型应用场景实战一
- U盘在微型计算机属于什么,u盘属于什么类目
- c语言是否所有的字符串都有终止符,C语言字符串数组
- 中国青年报:“区块链+供应链金融”为小微企业融资推开一扇窗
- 软件外包接单经验谈-估算工期、报价、签订合同篇
- 雕爷:我眼中的O2O成长路径
- python文章抄袭检测_怎样用Python检测抄袭行为?广大中小学生们的美梦就此结束...
- ajax使用 ajax+json
- 新东方回应员工吐槽歌曲走红:我们初心不变 未来可期