获取手机音乐的信息

1. 先在布局文件中添加一个ListView

<ListView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:divider="@color/list_pressed"android:dividerHeight="1px"android:listSelector="@android:color/transparent"android:id="@+id/listview">

2. 在fragment中初始化这个ListView

private ListView listView;listView = (ListView) view.findViewById(R.id.listview);

3. 创建一个用于设置数据的adapter

public class AudioListAdapter extends CursorAdapter{public AudioListAdapter(Context context, Cursor c) {super(context, c);}//设置需要显示的布局文件@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {return null;}//设置相关的数据的显示@Overridepublic void bindView(View view, Context context, Cursor cursor) {}}

4. 优化adapter并为其设置数据的显示

4.1 创建一个viewHolder

class ViewHolder{//这里是用于显示相关歌曲的名称与艺术家名称的控件,TextView mTitleTextView,mArtistTextView;public ViewHolder(View view){mTitleTextView = (TextView) view.findViewById(R.id.tv_title);mArtistTextView = (TextView) view.findViewById(R.id.tv_artist);}

4.2 创建一个方法用于获取上面的viewHolder

private ViewHolder getHolder(View view){ViewHolder viewHolder = (ViewHolder) view.getTag();if(viewHolder==null){viewHolder = new ViewHolder(view);view.setTag(viewHolder);}return viewHolder;}

4.3 在adapter中使用viewHolder

public class AudioListAdapter extends CursorAdapter{public AudioListAdapter(Context context, Cursor c) {super(context, c);}@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {//设置显示音乐信息的列表内容return View.inflate(context, R.layout.adapter_audio_list, null);}ViewHolder holder;@Overridepublic void bindView(View view, Context context, Cursor cursor) {holder = getHolder(view);//这里是通过对象保存数据的方式将cursor中的数据取出并设置相关显示AudioItem audioItem = AudioItem.fromCursor(cursor);holder.mTitleTextView.setText(StringUtil.formatAudioName(audioItem.getTitle()));holder.mArtistTextView.setText(audioItem.getArtist());}}

4.4 这里是使用的对象保存数据的方法

public class AudioItem implements Serializable{private String title;private String artist;private String path;private long duration;//将cursor的数据封装于对象public static AudioItem fromCursor(Cursor cursor){AudioItem audioItem = new AudioItem();audioItem.setArtist(cursor.getString(cursor.getColumnIndex(Media.ARTIST)));audioItem.setDuration(cursor.getLong(cursor.getColumnIndex(Media.DURATION)));audioItem.setPath(cursor.getString(cursor.getColumnIndex(Media.DATA)));audioItem.setTitle(cursor.getString(cursor.getColumnIndex(Media.DISPLAY_NAME)));return audioItem;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public long getDuration() {return duration;}public void setDuration(long duration) {this.duration = duration;}}

5 在fragment中初使化adapter并使用这个adapter

    private AudioListAdapter mAudioAdapter;mAudioAdapter = new AudioListAdapter(getActivity(), null);

6 将adapter设置给ListView

   listView.setAdapter(adapter);

7 查询数据并将数据传输给mAudioAdapter

private SimpleQueryHandler queryHandler;queryHandler = new SimpleQueryHandler(getActivity().getContentResolver());//查询的音乐相关的信息String[] projection = {Media._ID,Media.DISPLAY_NAME,Media.ARTIST,Media.DATA,Media.DURATION};//数据查询queryHandler.startQuery(0, adapter, Media.EXTERNAL_CONTENT_URI, projection, null, null, null);

8 使用到的相关查询辅助类

    public class SimpleQueryHandler  extends AsyncQueryHandler{public SimpleQueryHandler(ContentResolver cr) {super(cr);}@Overrideprotected void onQueryComplete(int token, Object cookie, Cursor cursor) {super.onQueryComplete(token, cookie, cursor);if(cookie!=null && cookie instanceof CursorAdapter){CursorAdapter adapter = (CursorAdapter) cookie;adapter.changeCursor(cursor);//相当于notify}}}
走到这里,我们就可以将手机中的音乐相关信息显示加载出来了

2 播放音乐的操作

9 创建用于播放音乐的显示页面(这里使用一个activity来显示)

public class AudioPlayerActivity extends  Activity{}

在这里设置自定的播放音乐的显示页面

10 在AudioPlayerActivity的onCreate方法中获取传递的数据

//当前点击要播放的位置int currentPosition = getIntent().getExtras().getInt("currentPosition");//所有音乐信息的集合ArrayList<AudioItem> audioList = (ArrayList<AudioItem>) getIntent().getExtras().getSerializable("audioList");

11 这里使用的是后台可以进行音乐播放,那么就需要使用到与服务的交互

创建用于播放音乐的服务并进行清单文件中的注册

public class AudioPlayService extends Service{private AudioServiceBinder audioServiceBinder;@Overridepublic IBinder onBind(Intent intent) {return audioServiceBinder;}}@Overridepublic void onCreate() {super.onCreate();audioServiceBinder = new AudioServiceBinder();}//数据相关的绑定操作public class AudioServiceBinder extends Binder{}}

12 在播放音乐的activity中开启服务

AudioPlayerActivity的onCreate方法中
Intent intent = new Intent(this,AudioPlayService.class);Bundle bundle = new Bundle();//传输的数据int currentPosition = getIntent().getExtras().getInt("currentPosition");ArrayList<AudioItem> audioList = (ArrayList<AudioItem>) getIntent().getExtras().getSerializable("audioList");//数据封装bundle.putInt("currentPosition", currentPosition);bundle.putSerializable("audioList", audioList);intent.putExtras(bundle);//服务绑定serviceConnection = new AudioServiceConnection();bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);startService(intent);//为了给service传递数据
使用到对象 serviceConnection,类似一个中间人对象,是实现ServiceConnection接口的
class AudioServiceConnection implements ServiceConnection{//当服务连接的时候会调用这个方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {}//当服务断开时候会调用这个方法@Overridepublic void onServiceDisconnected(ComponentName name) {}}

13 activity 与 service方法的交互

在activity中 通过 serviceConnection 来获取 服务 AudioPlayService 中的AudioServiceBinder
这样我们就可以通过AudioServiceBinder这个对象来进行activity与service中方法的交互

private AudioServiceBinder audioServiceBinder;class AudioServiceConnection implements ServiceConnection{//当服务连接的时候会调用这个方法,那么可以在这个方法中获取binder的对象(通过它来操作服务中的相关方法)@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {audioServiceBinder = (AudioServiceBinder) service;}//当服务断开时候会调用这个方法@Overridepublic void onServiceDisconnected(ComponentName name) {}}

14 在service中进行播放音乐的操作

    首先获取传递的数据 复写service的方法 onStartCommand  来获取传递的数据 private int currentPosition;private ArrayList<AudioItem> audioList;private AudioServiceBinder audioServiceBinder ;@Overridepublic void onCreate() {super.onCreate();audioServiceBinder = new AudioServiceBinder();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//获取数据currentPosition = intent.getExtras().getInt("currentPosition");audioList = (ArrayList<AudioItem>) intent.getExtras().getSerializable("audioList");//设置音乐播放audioServiceBinder.playAudio();return START_STICKY;//如果服务被杀死,会自动重启}在AudioServiceBinder 中设置与播放音乐相关的操作逻辑 设置播放音乐的操作方法 public class AudioServiceBinder extends Binder{/*** 播放音乐*/public void playAudio(){//判断一下是否有音乐资源if(audioList==null || audioList.size()==0)return;if(mediaPlayer!=null){mediaPlayer.release();mediaPlayer = null;}AudioItem audioItem = audioList.get(currentPosition);//创建mediaPlayer对象mediaPlayer = new MediaPlayer();//设置相关的监听mediaPlayer.setOnPreparedListener(mOnPreparedListener);mediaPlayer.setOnCompletionListener(mOnCompletionListener);//设置数据源try {mediaPlayer.setDataSource(audioItem.getPath());mediaPlayer.prepareAsync();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//创建相关的加载播放监听 并设置音乐的播放private OnPreparedListener mOnPreparedListener = new OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mediaPlayer.start();}};private OnCompletionListener mOnCompletionListener = new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {}};}

15 在服务中通过发送广播通知Activity中更新页面显示数据

定义我们用到的广播接收者

class AudioServiceReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {}}

在activity的OnCreate方法中进行注册

/*** 注册AudioService中的广播接受者*/private void registerAudioServiceReceiver() {receiver = new AudioServiceReceiver();IntentFilter filter = new IntentFilter(AudioPlayService.ACTION_NOTIFY_PREPARED);//参数是广播接收的标识//filter.addAction(AudioPlayService.ACTION_COMPLATION); 这里可以添加多个活动registerReceiver(receiver, filter);}

在服务中,当音乐开始进行播放的时候,发送广播,并将音乐的信息发给activity中

private void notifyPrepared(){Intent intent = new Intent(ACTION_NOTIFY_PREPARED);intent.putExtra("audioItem", audioList.get(currentPosition));//这里面就是携带的数据sendBroadcast(intent);}

当广播发送后,我们在对应的广播接收者中进行消息的接收

class AudioServiceReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (AudioPlayService.ACTION_NOTIFY_PREPARED.equarrayLists(intent.getAction())) {AudioItem audioItem = (AudioItem) intent.getSeriarrayListizableExtra("audioItem");} else if (AudioPlayService.ACTION_COMPLATION.equarrayLists(intent.getAction())) {}}}

Android音乐播放器高级开发相关推荐

  1. Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达

    Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 拿好素材之后,打开你们的开发工具,小达这里用的是android studio1.0, 新建一个项目,打开activity_main ...

  2. Android音乐播放器的开发实例(2021新版-Java版)

    Android音乐播放器的开发实例 介绍 该项目旨在引导喜爱 Android 开发爱好者入门教程实例,可以一步一步的跟着来完成属于自己的项目开发过程. 此项目为基于 Java 语言开发,使用 Recy ...

  3. Android 音乐播放器的开发教程(二)反编译apk ----- 小达

    Android 音乐播放器的开发教程(二)基本布局 在上一篇中简单的介绍了下小卷毛播放器的基本情况,现在就正式的开始一步一步的做播放器.首先想要一个漂亮的UI(不是我的这个...),就需要好的素材,没 ...

  4. android音乐播放器的开发与设计,Android音乐播放器的设计与实现

    内容简介: Android音乐播放器的设计与实现,毕业论文,共21页,7729字. 摘要:本文主要介绍了一个基于Andriod的音乐播放器的设计与实现.主要包括可行性分析,需求分析,App功能设计及实 ...

  5. Android音乐播放器eclipse,简单的Android音乐播放器 eclipse开发的基于Android平台的音乐播放器 - 下载 - 搜珍网...

    压缩包 : 音乐播放器.zip 列表 音乐播放器/ 音乐播放器/.classpath 音乐播放器/.project 音乐播放器/.settings/ 音乐播放器/.settings/org.eclip ...

  6. Android 音乐播放器的开发教程(六)service的运用及音乐列表点击播放 ----- 小达

    service的运用及音乐列表点击播放 按照前几篇博客的步骤,应该能看到自己手机里的音乐列表了,但是现在还只能看,不能点,还需要再给ListView添加点击事件的监听,接着启动一个Service来播放 ...

  7. android 小卷毛播放器,Android 音乐播放器的开发教程(四)Activity和Fragment的通信以及Fragment的切换 ----- 小达...

    Activity和Fragment的通信以及Fragment的切换 在上一篇的博客中讲到了,播放器的主界面布局,是由一个activity和一个fragment构成的,activity启动的时候,在其o ...

  8. Android 音乐播放器的开发教程(十)通知栏Notification的使用 ----- 小达

    通知栏Notification的使用         在这一片博客中,小达将自己学习Notification的一些想法和大家分享一哈,学的不是很深,所有有些东西可能解释的不是特别到位,还请各位谅解哈. ...

  9. Android音乐播放器开发(2)—登录

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

最新文章

  1. HDU1874(SPFA算法)
  2. JAVA IO - RandomAccessFile Seek学习
  3. java获取id值_从另一页获取ID值[重复]
  4. HTML5元素周期表
  5. Android Wifi方法大全
  6. 使用boost.python进行混合开发
  7. 经典的卷积神经网络简介
  8. 中继代理 server2008R2
  9. HOW TO: Troubleshoot development errors in MOSS 2007
  10. Python——高阶函数
  11. python主要数据变量_python的数据类型和变量
  12. 理解position:relative 与 position:absolute
  13. windows安装JDK步骤
  14. 森林防火监控系统解决方案
  15. ue4 4.27源码下载
  16. 外贸营销网站系统开发功能案例制作
  17. 怎么看电脑支持多少兆网速_电脑网速怎么看(电脑怎么看网速多少兆)
  18. 猴子摘香蕉-人工智能实验的思考
  19. 《非线性成长》阅读笔记
  20. 3d布衣天下1手机调试html,真精华布衣天下3d

热门文章

  1. 剪枝实践:图像检索如何加速和省显存 ?
  2. TextScanner:旷视新作文字识别新突破,确保字符阅读顺序
  3. 机器学习中数据清洗预处理入门完整指南
  4. css+html弄出哆啦a梦,祝儿童节快乐(DIV+CSS绘制哆啦A梦)
  5. 为什么我不推荐Python初学者直接看项目源码?工作五年的程序员给的忠告
  6. 招聘 | 大疆算法类未来大咖招聘
  7. odps mapreduce学习笔记
  8. 自动驾驶计算本车离期望轨迹距离的方法
  9. Bezier(贝塞尔)曲线(五阶)的轨迹规划在自动驾驶中的应用(五)
  10. Log4j、Log4j 2、JUL、JCL 、SFL4J 、Logback 与 Lombok 的使用