,本项目主要有如下功能:
(1):支持播放在线音乐(2):按住home键退出页面后显示通知栏部分播放提示, (3) : 支持切换上下首歌曲本项目来自:https://github.com/googlesamples/android-MediaBrowserService 首先配置如下服务: <service :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; } }}
运行效果:
效果源码: