- 浏览: 433686 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
yehuiyan8002:
支持中文查询
快熟查找联系人 -
lehehe:
现成的接口,免费试用,http://www.haoservic ...
天气Widget -
D.Z:
android:focusable="false&q ...
CheckBox在ListView 而导致其OnItemClickListener不会被触发 -
freecode:
碰到该问题,CheckBox的android:focusabl ...
CheckBox在ListView 而导致其OnItemClickListener不会被触发 -
echohfut:
哥们,新博客是不是在墙外啊?不能访问。还有你怎么进行博客迁移的 ...
博客 迁移
音乐播放器widget
[功能]
有人可能会问:又不是写小说 分什么前传后传啊
因为音乐播放器widget 不仅涉及到widget 而且音乐播放器有有一些特别的设定 而且在一篇里面都讲会内容太多 而且比较杂乱 所以打算分开讲解
前传:音乐播放器
后传:widget
所以这次会以 音乐播放器 为主 顺便包括一些与widget功能有关的东西
又因为主要的目的还是widget 所以音乐播放功能会比较少 只要下面功能:
写道
1. 播放/暂停
2. 换曲 即 下一曲
2. 换曲 即 下一曲
大家可以自己扩展之!
[代码 步骤]
1. 准备一下下面用到的字符串常量
public class MusicPlayerHelper { //供 MusicPlayerService 接收Broadcast用 主要接受来自于 MusicPlayerActivity 的消息 public final static String Broadcast_MusicPlayerService = "Broadcast_MusicPlayerService"; //供 MusicPlayerWidget 接收Broadcast用 主要接受来自于 MusicPlayerService 的消息 public final static String Broadcast_MusicPlayerWidget = "Broadcast_MusicPlayerWidget"; //供 MusicPlayerService 接收MusicPlayerWidget换曲用 主要接受来自于 MusicPlayerService 的消息 public final static String Broadcast_MusicPlayerService_Next = "Broadcast_MusicPlayerService_Next"; //用于 播放控制 消息 public final static String Message_MusicPlayerService_CMD = "Message_MusicPlayerService_CMD"; public final static String Message_MusicPlayerService_Next = "Message_MusicPlayerService_Next"; public final static String Message_MusicPlayer_Text = "Message_MusicPlayer_Text"; //2首歌曲 一个供开始播放用 一个供下一曲 public final static String MUSIC1 = "/sdcard/GuoHuo.mp3"; public final static String MUSIC2 = "/sdcard/WelcomeToBeijing.mp3"; }
2. 准备播放器界面 只要2个Button 一个用于播放控制 一个用于换曲
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/cmd" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="start/pause!" /> <Button android:id="@+id/next" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Next!" /> </LinearLayout>
3. 分别给2个Button 注册OnClickListener()
public class MusicPlayerActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startService(new Intent(this,MusicPlayerService.class)); findViewById(R.id.cmd).setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub sendMusicPlayerMessageCmd(); } }); findViewById(R.id.next).setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub sendMusicPlayerMessageNext(); } }); } public void sendMusicPlayerMessageCmd(){ Intent i = new Intent(MusicPlayerHelper.Broadcast_MusicPlayerService); Bundle b = new Bundle(); b.putString(MusicPlayerHelper.Message_MusicPlayerService_CMD, "NA"); i.putExtras(b); sendBroadcast(i); } public void sendMusicPlayerMessageNext(){ Intent i = new Intent(MusicPlayerHelper.Broadcast_MusicPlayerService); Bundle b = new Bundle(); b.putString(MusicPlayerHelper.Message_MusicPlayerService_Next, "NA"); i.putExtras(b); sendBroadcast(i); } }
4. MusicPlayerService 里的 播放/暂停 控制 及 换曲 功能
//播放指定音乐 public void playMusic(String s){ mp.reset(); try { mp.setDataSource(s); mp.prepare(); mp.start(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void sendMusicText(String s){ Intent i = new Intent(MusicPlayerHelper.Broadcast_MusicPlayerWidget); Bundle b = new Bundle(); b.putString(MusicPlayerHelper.Message_MusicPlayer_Text, s); i.putExtras(b); sendBroadcast(i); }
5. MusicPlayerService 的 BroadcastReceiver 实现 及 注册
- 实现
//Broadcast 既接受来自MusicPlayerActivity的Broadcast 也接受来自MusicPlayerWidget的Broadcast public class MusicPlayerListenerHelper extends BroadcastReceiver { Context context; MusicPlayerListenerHelper listener; //construct public MusicPlayerListenerHelper(Context c){ context = c; //to instance it listener = this; } public void registerAction(String action){ IntentFilter filter = new IntentFilter(); filter.addAction(action); context.registerReceiver(listener,filter); } @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub //对接收到的Broadcast进行判断 是MusicPlayerActivity还是MusicPlayerWidget 通过Intent.getActon() if(arg1.getAction().endsWith(MusicPlayerHelper.Broadcast_MusicPlayerService)){ Bundle b = arg1.getExtras(); if(b.containsKey(MusicPlayerHelper.Message_MusicPlayerService_Next)){ playMusic(MusicPlayerHelper.MUSIC2); } else if(b.containsKey(MusicPlayerHelper.Message_MusicPlayerService_CMD)){ switchMusic(); } } else if(arg1.getAction().endsWith(MusicPlayerHelper.Broadcast_MusicPlayerService_Next)){ playMusic(MusicPlayerHelper.MUSIC2); sendMusicText("Hello to MusicPlayerWidget!"); } } }
- 注册
//注册BroadcastReceiver 用于接受来自MusicPlayerActivity的消息 MusicPlayerListenerHelper helper = new MusicPlayerListenerHelper(this); helper.registerAction(MusicPlayerHelper.Broadcast_MusicPlayerService); //注册BroadcastReceiver 用于接受来自MusicPlayerWidget的消息 MusicPlayerListenerHelper nextHelper = new MusicPlayerListenerHelper(this); nextHelper.registerAction(MusicPlayerHelper.Broadcast_MusicPlayerService_Next);
写道
可能细心的人会奇怪 为什么要 new 2 次 因为:
[其他]
假如我们的BroadcastReceiver 要接受2种消息 即 MessageA & MessageB
普通的做法是:Bundle复用 然后通过Bundle.getString() 来区分是MessageA 还是 MessageB
如:
- 发送端:
Intent i = new Intent(“目的BroadcastReceiver的匹配字串”);
Bundle b = new Bundle();
b.putString(key, value);
i.putExtras(b);
sendBroadcast(i);
- 接收端
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Bundle b = arg1.getExtras();
if(b.containsKey(BroadcastColumn.MESSAGE_STRING)){
String string = b.getString(BroadcastColumn.MESSAGE_STRING);
Log.d("TAG",string);
}
}
[其他]
假如我们的BroadcastReceiver 要接受2种消息 即 MessageA & MessageB
普通的做法是:Bundle复用 然后通过Bundle.getString() 来区分是MessageA 还是 MessageB
如:
- 发送端:
Intent i = new Intent(“目的BroadcastReceiver的匹配字串”);
Bundle b = new Bundle();
b.putString(key, value);
i.putExtras(b);
sendBroadcast(i);
- 接收端
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Bundle b = arg1.getExtras();
if(b.containsKey(BroadcastColumn.MESSAGE_STRING)){
String string = b.getString(BroadcastColumn.MESSAGE_STRING);
Log.d("TAG",string);
}
}
写道
其实 Bundle 主要通过对应的""key" 来 加载 和 提取 数据 的
写道
但是上述办法在widget中却不行 现在也不知道原因 是bug 还是故意使然
那么我们的办法就是: 定义2个BroadcastReceiver 一个用于接收来自MusicPlayerActivity的Broadcast 一个接收来自于MusicPlayerWidget 的Broadcast 还有别的办法么? 有 那就是通过BroadcastReceiver复用
BroadcastReceiver复用 就是:让一个BroadcastReceiver 接收几个Broadcast 然后在通过Intent.getAction() 来区分开
所以 要new 2 次 理解这点很重要!
那么我们的办法就是: 定义2个BroadcastReceiver 一个用于接收来自MusicPlayerActivity的Broadcast 一个接收来自于MusicPlayerWidget 的Broadcast 还有别的办法么? 有 那就是通过BroadcastReceiver复用
BroadcastReceiver复用 就是:让一个BroadcastReceiver 接收几个Broadcast 然后在通过Intent.getAction() 来区分开
所以 要new 2 次 理解这点很重要!
写道
其实道理和Bundle复用一样 只是这次借助于BroadcastReceiver的 Action 字串
6. 至此 我们播放器功能就完成了 下次将说道其widget有关的功能! let's go!
发表评论
-
滑动抽屉 另一种解决办法
2010-07-09 17:43 0滑动抽屉 -
Spinner 定制化 增强版
2010-07-09 14:34 2609Spinner 作为下拉选 ... -
ListView 内容之分批显示
2010-06-25 20:38 5925ListView 内容循环显示 大家试想 假如 ... -
MediaScanner 研究
2010-06-23 15:21 3170MediaScanner 之所以拿MediaSc ... -
CheckBox在ListView 而导致其OnItemClickListener不会被触发
2010-06-22 20:55 19015CheckBox在ListView 而导致其OnItemCli ... -
获取Launcher 启动列表
2010-06-22 10:09 3138获取Launcher 启动列表 即 列出所有Launc ... -
PreferenceActivity 全接触
2010-06-19 12:53 9440PreferenceActivity 为了引入 ... -
android src 下载 编译 安装 全接触
2010-06-12 14:44 0android src - download install ... -
Intent.createChooser() 妙用
2010-06-12 11:14 5955Intent.createChooser(ntent targ ... -
SMS管理:收信箱 发信息 编写新信息
2010-06-07 08:14 14445SMS管理 [功能] 1. 收信箱:显示 ... -
求 android 手机 帮忙测试sms服务系统 谢谢
2010-06-05 08:25 1452Hi guys, 最近一段时间没有更新blog 因为一 ... -
流媒体 播放 理论篇
2010-05-28 14:42 2224流媒体播放 之所以为理论篇 因为该篇仅实现了播放功能 ... -
NDK 搭建与HelloWorld
2010-05-19 09:48 3225NDK [前提] 1. Cygwin 用于安装 ... -
自定义字体
2010-05-15 10:49 1221自定义字体: []代码 步骤] 1 ... -
模糊查找 再深入
2010-05-15 09:41 3158模糊查找 再深入 应某位大哥要求 再次对 SQLite ... -
快捷方式Bar + ViewGroup - 自定义
2010-05-09 09:20 2470TabActivity - 自定义 其实 这篇感觉极鸡 ... -
View 拖动&插入 研究
2010-05-09 07:14 3985View 拖动&插入 即: ... -
带图标 快捷键 Menu - 终极版
2010-05-04 20:23 1837Menu 改头换面 扩展如下: 1. 图标化文字 2 ... -
*.gif 解码 - 实践
2010-05-02 18:58 1737*.gif decode 前面已经说过 今天不打算再说了 ... -
*.gif 解码 - 理论
2010-05-01 21:11 1522我们知道Android 默认是不支持*.gif 的 但是 ...
相关推荐
org.vaadin.addons.dcharts-widget-0.10.0-dcharts-widget-0.10.0.jar
安卓优雅音乐播放器,带widget
live2d-widget-models live2d模型的存储 使用情况 安装所有型号 使用npm install live2d-widget-models 请手动安装,此包装已被弃用,因为它不会增加生产环境的依赖性。 安装单独的模型 使用npm install {package...
优雅音乐播放器是一款精心设计的音乐应用,其特色在于它带有Widget功能,模仿了MIUI系统中的音乐播放器界面,提供了美观且用户友好的体验。Widget在安卓系统中是一种小型的应用程序视图,可以直接在主屏幕上显示,让...
而"ios-widget-for-axure.rplib"则是一款专门为Axure设计的iOS设备组件库,专为在Axure6.5版本中构建逼真的iOS应用原型而打造。 首先,我们来深入了解"ios-widget-for-axure.rplib"这个组件库。这是一个.rplib文件...
在音乐播放器中,Widget可以包含播放/暂停、上一首/下一首等快捷控制按钮,让用户可以直接在桌面管理音乐播放。 4. **媒体播放框架**:Android提供了Media Player类和ExoPlayer库,用于处理音频和视频的播放。音乐...
资源分类:Python库 所属语言:Python 资源全名:django-cascading-dropdown-widget-0.2.6.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
实际上,许多Widget引擎都是基于WebKit构建的,这主要是因为WebKit提供了强大的渲染引擎和JavaScript引擎,能够有效地处理复杂的Web内容,并支持最新的Web标准。 综上所述,Widget作为一种独特的应用形式,结合了...
在安卓平台上开发一款音乐播放器时,歌词同步显示是一个重要的功能。这个压缩包文件提供了一个示例,展示了如何实现歌词始终显示在屏幕顶部,并且允许用户通过点击和上下拖动来浏览歌词。以下是对这个功能的详细解释...
资源来自pypi官网。 资源全名:clustergrammer_widget2-0.4.1-py2.py3-none-any.whl
Android音乐播放器项目(含Widget小挂件、Notification通知栏)代码详解博客:https://blog.csdn.net/jal517486222/article/details/88994863
在Android系统中,Widget是应用小部件的简称,它是一种可以在主屏幕上展示简化的应用程序界面元素,用户无需打开完整应用就能直接与之交互。在给定的“widget文件--上键无法聚焦”问题中,核心问题似乎是用户在手机...
可以通过桌面Widget控制后台音乐的播放,也可以点击Widget上面的LOGO进入应用程序。 涉及到了,一个基本的widget程序的大部分知识点,包括widget和service如何交换数据,service如何利用RemoteView来控制widget上的...
在安卓平台上,开发一款音乐播放器涉及到多个技术层面和组件的整合。这款“安卓音乐播放器相关-缺少包”项目,据描述,包含了实现随机切歌、列表循环、歌手分类、抽屉布局、设置铃声以及删除歌曲等功能的源代码。...
在Android平台上,开发一款桌面音乐播放器Widget是一个有趣且实用的实践项目。本文将深入解析如何利用Android的App Widget API创建一个能够在用户桌面运行并控制音乐播放的应用组件。通过源码分析,我们可以学习到...
Ecmall Widget是一种在Ecmall电子商务平台中用于构建可重用、可配置的界面元素的技术。通过Widget,开发者可以创建自定义的挂件,这些挂件能够方便地嵌入到不同的页面上,以实现特定的功能或者展示内容。本文将详细...
**dcharts-widget** 是一个基于 **dcharts** 库构建的可视化组件库,它为开发者提供了丰富的图表选项,便于在Web应用中实现交互式的数据可视化。dcharts-widget旨在简化数据展示的过程,使得开发者无需深入了解底层...
《PyPI官网下载的Oasys-Widget-Core-1.0.0.tar.gz:深入了解Python库的构建与使用》 PyPI(Python Package Index)是Python开发者的重要资源库,它为全球的Python开发者提供了一个发布、查找和安装Python软件包的...