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


更多相关文章

  1. (2.2.8.1)关于Android(安卓)Studio里的Gradle,你所需要知道的都在这
  2. Android(安卓)Studio3.0配置Butterknife8.8.1及大坑
  3. Android(安卓)使用自定义字体
  4. Android运行Socket项目 Error: ShouldNotReachHere()
  5. Android(安卓)3D翻转效果实践
  6. android 自定义输入框,禁止输入表情符号,或者特殊字符
  7. Android(安卓)程式开发:(九)使用活动栏 —— 9.3自定义ActionBar项
  8. Android二维码开源项目zxing编译
  9. Android(安卓)Studio开发工具的使用

随机推荐

  1. android实现屏幕滑动(类似主屏滑动第一屏
  2. cocos2d-x for android:CCSprite 精灵动画
  3. Android隐喻(三) 图形绘制: Canvas、Surfa
  4. android的照相图片压缩
  5. Android(安卓)OpenGLES2.0(七)——着色器语
  6. 键盘按下和抬起事件(keydown,keyup)——原创
  7. android自定义button样式【转】
  8. Android拼图游戏的设计逻辑,从切图到交互
  9. Android中直播视频技术探究之---摄像头Ca
  10. Android支付宝模块的ali64错误解决