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;
}
}
}

运行效果:


下载地址:http://www.itlanbao.com/code/20151123/10000/100656.html

相关代码

  • MediaBrowserService 音乐播放项目

  • 很简单却很酷的粒子破碎效果

  • 一个不错的订餐软件

  • android一个不错的图片浏览效果

  • DragToSortImage相册加载和图片拖拽

  • 仿微信下拉录制视频

  • 一个很酷的加载loading效果

  • RecyclerView加载不同view实现效果

  • 超酷的时间选择控件

  • 漂亮的时光轴


更多相关文章

  1. Android热修复原理及实现
  2. Android实验一(在Android(安卓)Studio中创建项目和模拟器)
  3. android弹出式菜单(效果爆炸)
  4. Android文本框实现搜索和清空效果
  5. 错误总结1,动态加载部分不能显示的原因
  6. Android实现文字垂直滚动、纵向走马灯效果的实现方式汇总
  7. Android(安卓)仿百度网页音乐播放器圆形图片转圈播放效果
  8. DexClassLoader 实现 Android(安卓)插件加载
  9. Android布局文件的加载过程分析:Activity.setContentView()源码

随机推荐

  1. Android(安卓)USB 开发
  2. 在android studio中配置GreenDao
  3. Dagger 2 完全解析(四),Android(安卓)中使用
  4. android 常见bug ~ lock ~ 模拟器有问题
  5. Android(安卓)的WebView长按保存图片
  6. Android(安卓)Camera2 之 CameraCharacte
  7. Android实践 -- Apktool 的使用
  8. 【Android(安卓)应用开发】Android中使用
  9. android USB OTG功能实现
  10. Android(Java) ArrayList更改顺序