MediaBrowserService 音乐播放项目
MediaBrowserService 音乐播放项目,本项目主要有如下功能:
(1):支持播放在线音乐
(2):按住home键退出页面后显示通知栏部分播放提示,
(3) : 支持切换上下首歌曲
本项目来自:https://github.com/googlesamples/android-MediaBrowserService
首先配置如下服务:
<service
android:name=".service.MusicService"
android:exported="true">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
主要代码如下:
public class BrowseFragment extends Fragment {
private static final String TAG = LogHelper.makeLogTag(BrowseFragment.class.getSimpleName());
public static final String ARG_MEDIA_ID = "media_id";
public static interface FragmentDataHelper {
void onMediaItemSelected(MediaBrowser.MediaItem item);
}
// The mediaId to be used for subscribing for children using the MediaBrowser.
private String mMediaId;
private MediaBrowser mMediaBrowser;
private BrowseAdapter mBrowserAdapter;
private MediaBrowser.SubscriptionCallback mSubscriptionCallback = new MediaBrowser.SubscriptionCallback() {
@Override
public void onChildrenLoaded(String parentId, List<MediaBrowser.MediaItem> children) {
mBrowserAdapter.clear();
mBrowserAdapter.notifyDataSetInvalidated();
for (MediaBrowser.MediaItem item : children) {
mBrowserAdapter.add(item);
}
mBrowserAdapter.notifyDataSetChanged();
}
@Override
public void onError(String id) {
Toast.makeText(getActivity(), R.string.error_loading_media,
Toast.LENGTH_LONG).show();
}
};
private MediaBrowser.ConnectionCallback mConnectionCallback =
new MediaBrowser.ConnectionCallback() {
@Override
public void onConnected() {
LogHelper.d(TAG, "onConnected: session token " + mMediaBrowser.getSessionToken());
if (mMediaId == null) {
mMediaId = mMediaBrowser.getRoot();
}
mMediaBrowser.subscribe(mMediaId, mSubscriptionCallback);
if (mMediaBrowser.getSessionToken() == null) {
throw new IllegalArgumentException("No Session token");
}
MediaController mediaController = new MediaController(getActivity(),
mMediaBrowser.getSessionToken());
getActivity().setMediaController(mediaController);
}
@Override
public void onConnectionFailed() {
LogHelper.d(TAG, "onConnectionFailed");
}
@Override
public void onConnectionSuspended() {
LogHelper.d(TAG, "onConnectionSuspended");
getActivity().setMediaController(null);
}
};
public static BrowseFragment newInstance(String mediaId) {
Bundle args = new Bundle();
args.putString(ARG_MEDIA_ID, mediaId);
BrowseFragment fragment = new BrowseFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_list, container, false);
mBrowserAdapter = new BrowseAdapter(getActivity());
View controls = rootView.findViewById(R.id.controls);
controls.setVisibility(View.GONE);
ListView listView = (ListView) rootView.findViewById(R.id.list_view);
listView.setAdapter(mBrowserAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MediaBrowser.MediaItem item = mBrowserAdapter.getItem(position);
try {
FragmentDataHelper listener = (FragmentDataHelper) getActivity();
listener.onMediaItemSelected(item);
} catch (ClassCastException ex) {
Log.e(TAG, "Exception trying to cast to FragmentDataHelper", ex);
}
}
});
Bundle args = getArguments();
mMediaId = args.getString(ARG_MEDIA_ID, null);
mMediaBrowser = new MediaBrowser(getActivity(),
new ComponentName(getActivity(), MusicService.class),
mConnectionCallback, null);
return rootView;
}
@Override
public void onStart() {
super.onStart();
mMediaBrowser.connect();
}
@Override
public void onStop() {
super.onStop();
mMediaBrowser.disconnect();
}
// An adapter for showing the list of browsed MediaItem's
private static class BrowseAdapter extends ArrayAdapter<MediaBrowser.MediaItem> {
public BrowseAdapter(Context context) {
super(context, R.layout.media_list_item, new ArrayList<MediaBrowser.MediaItem>());
}
static class ViewHolder {
ImageView mImageView;
TextView mTitleView;
TextView mDescriptionView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.media_list_item, parent, false);
holder = new ViewHolder();
holder.mImageView = (ImageView) convertView.findViewById(R.id.play_eq);
holder.mImageView.setVisibility(View.GONE);
holder.mTitleView = (TextView) convertView.findViewById(R.id.title);
holder.mDescriptionView = (TextView) convertView.findViewById(R.id.description);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
MediaBrowser.MediaItem item = getItem(position);
holder.mTitleView.setText(item.getDescription().getTitle());
holder.mDescriptionView.setText(item.getDescription().getDescription());
if (item.isPlayable()) {
holder.mImageView.setImageDrawable(
getContext().getDrawable(R.drawable.ic_play_arrow_white_24dp));
holder.mImageView.setVisibility(View.VISIBLE);
}
return convertView;
}
}
}
运行效果:
MediaBrowserService 音乐播放项目的更多相关文章
- Andriod小项目——在线音乐播放器
转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...
- [个人项目] 使用 Vuejs 完成的音乐播放器
Foreword 虽然音乐播放这类的项目的静态展示居多,业务逻辑并不复杂,但是对于我这种后端出身的前端萌新来说,能使用vuejs完成大部分功能, 也会有许多收获. api:我使用的是一个开源的 nod ...
- swift 音乐播放器项目-《lxy的杰伦情歌》开发实战演练
近期准备将项目转化为OC与swift混合开发.试着写一个swift音乐播放器的demo,体会到了swift相对OC的优势所在.废话不多说.先上效果图: watermark/2/text/aHR0cDo ...
- 音乐播放器之myeclipse项目
音乐播放器: 这个音乐播放器是用myeclipse打开的项目.假设有问题记得改掉文件的路径名.还有假设图片不显示也可能是图片的路径名不正确,如音乐无法播放也可能是路径名不正确.总之这个游戏有文件的引用 ...
- 项目源码--Android类似酷狗音乐播放器
下载源码 知识技能概要: 1.音乐文件的扫描与管理 2.音频流的解码 3. UI控件的综合使用 4.播放列表方式管理 5.随机播放方式 6.源码带详细的中文注释 ...... 详细介绍 1. 音乐文件 ...
- 项目源码--Android本地音乐播放器
下载源码 技术要点: 1.本地音乐播放与管理 2.支持在线下载 3.非库音频流的解码 4. UI控件的综合使用 5. HTTP通信模块 6. Mysql数据库的综合使用 7. 后台服务技术 8. 源码 ...
- 团队项目 NABCD分析java音乐播放器
NABCD分析java音乐播放器 程设计题目:java音乐播放器 一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中 ...
- HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器
HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ...
- android 音乐播放器
本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...
随机推荐
- (PHP)程序中如何判断当前用户终端是手机等移动终端
推荐: Mobile-Detect:https://github.com/serbanghita/Mobile-Detect/blob/master/Mobile_Detect.php Detect ...
- ORM框架详解
.Net开源微型ORM框架测评 什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象 ...
- Spark之SQL解析(源码阅读十)
如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么.之前总结的已经写了传统数据库与Spark的sql解析之间的差别.那么我们下来直切主题~ 如今的Spark已经支持多 ...
- shell中bc expr [ ] (( ))的使用方法
http://blog.chinaunix.net/uid-20671208-id-3552751.html
- 【javascript基础】系列
这是本人记录的javascript基础知识,希望能给大家的学习带来一点帮助. [javascript基础]1.基本概念 [javascript基础]2.函数 [javascript基础]3.变量和作用 ...
- javascript 获取iframe中的dom
太扯了,一个多小时都没搞定,获取不到iframe中的dom元素. <div id="one"> this is one </div> <div> ...
- Laravel学习笔记(三)数据库 数据库迁移
该章节内容翻译自<Database Migration using Laravel>,一切版权为原作者. 原作者:Stable Host, LLC 翻译作者:Bowen Huang 正文: ...
- JAVA编程规范(下)
JAVA编程规范(下) 2016-03-27 6. 代码的格式化 6.1 对代码进行格式化时,要达到的目的 1. 通过代码分割成功能块和便于理解的代码段,使代码更容易阅读和理解: 2. ...
- javascript 中slice,substr,substring方法的对比
实际开发过程中,字符串是一种最常用的一种数据类型,而在程序中对字符串的操作也是十分繁琐,javascript中就提供了很多字符串相关的方法,然而由于方法过多,很多方法功能有交叉,参数有雷同,容易使用混 ...
- 采用TCP协议实现PIC18F97J60 ethernet bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). TCP/IP Stac ...