• 本程序为直接在Activity中计算并更新后台服务音乐播放进度,没有使用到广播

  • 在学习广播之前,艰难的通过这个方法来实现了更新音乐播放进度,不推荐使用,不过感兴趣的可以研究一下。

  • 大概的思路就是通过异步任务类来模拟耗时操作,然后计算出开始播放的时间与当前时间的差,然后跟音乐的总时间相比得到ProgressBar的进度,然后每一秒更新一次。

  • 暂停时可以将暂停的时间加到开始时间上,实现无断点更新

  • 效果图如下:

  • 主函数代码:MusicActivity.java

public class MusicActivity extends AppCompatActivity {private ListView lv;private List lvList;private List<Mp3Info> mp3InfoList;private ImageButton bt1,bt2;private ImageView iv1;private TextView tv1,tv2;private ProgressBar pb;private Boolean flag;private int location;private long startTime;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_music);lv= (ListView) findViewById(R.id.lv);bt1= (ImageButton) findViewById(R.id.bt1);bt2= (ImageButton) findViewById(R.id.bt2);tv1= (TextView) findViewById(R.id.tv1);tv2= (TextView) findViewById(R.id.tv2);iv1= (ImageView) findViewById(R.id.iv1);pb= (ProgressBar) findViewById(R.id.pb);location=0;flag=false;LoadLvList();ArrayAdapter aa=new ArrayAdapter(this,android.R.layout.simple_list_item_1,lvList);lv.setAdapter(aa);lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {location=position;setPlay(position);}});bt1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MusicActivity.this, MyService.class);intent.putExtra("tag",1);startService(intent);if(flag==true){bt1.setImageResource(R.mipmap.btn_pause);flag=false;}else{bt1.setImageResource(R.mipmap.btn_play);flag=true;}}});bt2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {location=location+1;setPlay(location);}});}public void LoadLvList() {mp3InfoList=new ArrayList<Mp3Info>();mp3InfoList= MediaUtil.getMusicInfo(this);lvList=new ArrayList();for(int i=0;i<mp3InfoList.size();i++){lvList.add(mp3InfoList.get(i).getTitle());}}public void setPlay(int location){Intent intent=new Intent(MusicActivity.this, MyService.class);Mp3Info mp3Info=mp3InfoList.get(location);intent.putExtra("tag",0);intent.putExtra("url",mp3Info.getUrl());intent.putExtra("id",mp3Info.getId());intent.putExtra("title",mp3Info.getTitle());intent.putExtra("artist",mp3Info.getArtist());intent.putExtra("albumId",mp3Info.getAlbumId());startService(intent);tv1.setText(mp3Info.getTitle());tv2.setText(mp3Info.getArtist());Bitmap bitmap = MediaUtil.getArtwork(getBaseContext(), mp3Info.getId(),mp3Info.getAlbumId(), true, false);iv1.setImageBitmap(bitmap);if(flag==false){bt1.setImageResource(R.mipmap.btn_play);flag=true;}int duration=(int)mp3Info.getDuration();new MyProgress().execute(duration);}public class MyProgress extends AsyncTask<Integer,Integer,Integer> {@Overrideprotected void onPreExecute() {super.onPreExecute();startTime=System.currentTimeMillis();pb.setMax(100);pb.setProgress(0);}@Overrideprotected Integer doInBackground(Integer... params) {int i=0;while(true){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if(flag==true) {Long currentTime = System.currentTimeMillis();int progress = (int) ((currentTime - startTime) * 100 / params[0]);Log.d("===progress", "" + progress);Log.d("===currentTime", "" + currentTime);Log.d("===startTime", "" + startTime);Log.d("===duration", "" + params[0]);if (progress <= 100) {publishProgress(progress);}}else{startTime=startTime+1000;continue;}if(1000*i>=params[0]){break;}i++;}return 0;}@Overrideprotected void onProgressUpdate(Integer... values) {Log.d("===","更新进度"+values[0]);super.onProgressUpdate(values[0]);pb.setMax(100);pb.setProgress(values[0]);}@Overrideprotected void onPostExecute(Integer integer) {Log.d("===","异步类执行完毕");super.onPostExecute(integer);setPlay(location);}}
}
  • service部分的代码:MyService.java
public class MyService extends Service {private MediaPlayer mediaPlayer;private NotificationManager nm;private NotificationCompat.Builder builder;private Notification nf;public MyService() {}public class MyBind extends Binder {public MyService getService() {return MyService.this;}}public void test() {Log.d("====", "我是Service里的方法");stopSelf();}@Overridepublic void onCreate() {super.onCreate();mediaPlayer = new MediaPlayer();Log.d("====", "服务创建");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d("====", "服务启动--非绑定方式");if(intent!=null){int tag=intent.getIntExtra("tag",3);switch (tag){case 0:String url=intent.getStringExtra("url");String title=intent.getStringExtra("title");String artist=intent.getStringExtra("artist");long id=intent.getLongExtra("id",0);long albumId=intent.getLongExtra("albumId",0);try {if(mediaPlayer!=null){mediaPlayer.reset();}mediaPlayer.setDataSource(this, Uri.parse(url));mediaPlayer.prepare();mediaPlayer.setLooping(true);mediaPlayer.start();showNotification(title,artist,id,albumId);} catch (IOException e) {e.printStackTrace();}break;case 1:if(mediaPlayer!=null){if(mediaPlayer.isPlaying()){mediaPlayer.pause();}else{mediaPlayer.start();}}break;default:break;}}return super.onStartCommand(intent, flags, startId);}private void showNotification(String title, String artist,long id,long albumId) {nm= (NotificationManager) getSystemService(Activity.NOTIFICATION_SERVICE);builder= new NotificationCompat.Builder(getBaseContext());RemoteViews contentView=new RemoteViews(getPackageName(),R.layout.notification_music_layout);contentView.setTextViewText(R.id.tv1,title);contentView.setTextViewText(R.id.tv2,artist);Bitmap bitmap = MediaUtil.getArtwork(this, id,albumId, true, false);// 获取专辑位图对象,为大图contentView.setImageViewBitmap(R.id.iv1,bitmap);builder.setContent(contentView).setSmallIcon(R.mipmap.ic_launcher);nf=builder.build();nm.notify(0,nf);}@Overridepublic IBinder onBind(Intent intent) {Log.d("====", "服务启动--绑定方式");return new MyBind();}@Overridepublic boolean onUnbind(Intent intent) {Log.d("====", "服务启动--绑定方式--解除绑定");return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();mediaPlayer.stop();Log.d("====", "服务销毁");}}
  • 布局代码(用到的两个布局差不多):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.ygd.jreduch10.MusicActivity"><ListView
        android:id="@+id/lv"android:layout_above="@+id/pb"android:layout_width="match_parent"android:layout_height="match_parent"></ListView><ProgressBar
        android:id="@+id/pb"android:background="#FFFF"style="?android:attr/progressBarStyleHorizontal"android:layout_above="@+id/rl"android:layout_width="match_parent"android:layout_height="wrap_content" /><RelativeLayout
        android:id="@+id/rl"android:background="#a19f9f"android:layout_alignParentBottom="true"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageView
            android:id="@+id/iv1"android:src="@mipmap/ic_launcher"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextView
            android:layout_marginLeft="20dp"android:id="@+id/tv1"android:textSize="20sp"android:text="HelloMusic"android:textColor="#FFFF"android:layout_toRightOf="@+id/iv1"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextView
            android:id="@+id/tv2"android:layout_marginLeft="20dp"android:textColor="#FFFF"android:layout_toRightOf="@+id/iv1"android:layout_below="@+id/tv1"android:text="HelloSinger"android:layout_width="wrap_content"android:layout_height="wrap_content" /><ImageButton
            android:id="@+id/bt1"android:layout_marginRight="20dp"android:layout_toLeftOf="@+id/bt2"android:src="@mipmap/btn_pause"android:layout_width="wrap_content"android:layout_height="wrap_content" /><ImageButton
            android:id="@+id/bt2"android:layout_alignParentRight="true"android:layout_marginRight="10dp"android:src="@mipmap/btn_next"android:layout_width="wrap_content"android:layout_height="wrap_content" /></RelativeLayout></RelativeLayout>

Android开发之本地音乐播放器(简单粗暴版)相关推荐

  1. Android开发之本地音乐播放器(二)

    此次音乐播放器是针对上一个:https://blog.csdn.net/qq_43433255/article/details/88084420 开发出来的一个功能增强型,基本实现功能为: 通过列表管 ...

  2. Android开发之简易音乐播放器(一)

    这里介绍一个简易的音乐播放器, 效果图如下: 但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死, 但,操作却十分简单,方便理解! 这是代码的主要设计: 音乐主要存放在这一个文件中: ...

  3. Android 编程案例-本地音乐播放器源码及使用注意事项

    说一下代码在用的时候注意事项以及在运行的时候可能遇到的问题: 首先代码可以在创建相应文件后直接复制,这个案例用到了RecyclerView,所以需要先添加依赖.添加下面两个: implementati ...

  4. Android 简单的本地音乐播放器Demo

    一个小小的本地音乐播放器,花了几个小时完成的,帮朋友做的毕业作业. 包含基本播放功能.进度条显示和拖拽.时间倒计.后台播放.一键刷新.收藏操作.单独播放收藏页的音乐.... 代码没有一定的模式和注释, ...

  5. 我的音乐(Musicoco)- 本地音乐播放器开发总结

    开源一个功能相对齐全的本地音乐播放器 简述 从五月末就开始利用空余时间开发这款 app ,不知不觉三个月过去了. App 名称:我的音乐,我给取了个别名:Musicoco. Android 手机本地音 ...

  6. Android端本地音乐播放器(一)---前言

    前言: 2018时的记录:大概一周多以前(现在是2018.11.26   15:24)android平台开发的课程结束了,要写大作业,最后决定写这个音乐播放器,因为老师在课堂上讲的例子也是这个,前面的 ...

  7. [HTML5]简单网页本地音乐播放器

    既然HTML5提出与本地交互方便,就想写个HTML5的本地音乐播放器.一开始问题主要集中在怎么读取本地文件路径,我想肯定可以用JS实现去操作本地文件(因为node.js很容易实现读取本地文件,但是原生 ...

  8. 基于 Qt5 ( C++ ) 开发的一个小巧精美的本地音乐播放器

    LightMusicPlayer --南京大学2019秋季学期 "高级程序设计" 课程设计三 基于Qt5开发的一个小巧精美的本地音乐播放器 代码注释详细,适合作为一个用于入门的Qt ...

  9. 一款简单的本地音乐播放器,界面美观、包括主题切换、歌单管理等等

    MeetMusic 项目地址:lijunyandev/MeetMusic  简介:一款简单的本地音乐播放器,界面美观.包括主题切换.歌单管理等等 音乐-播放器-主题切换- App 效果图        ...

  10. unity开发简易的本地音乐播放器

    由于项目需要,做了个简单的本地音乐播放器demo,记录一下,万一以后就用到了. UI不方便贴图,只贴关键功能的代码. 功能1:从本地选择音频文件. 这部分代码是在网上搜索到的,由于不知道原创是哪位前辈 ...

最新文章

  1. KNN 最近邻算法(K近邻)
  2. pandas中的reset_index()
  3. 学习计划20190509
  4. 多线程pthread_join()的作用
  5. [优先队列][堆] Luogu P4505 组合子逻辑
  6. 八个角最多可以把平面分成多少部分?_一个空间最多能被分成几块?
  7. Latente Wärme
  8. STM32 flash 大小
  9. 数字图像处理第二次试验:图像增强
  10. 【JavaMailWeb】用户注册通过邮箱激活案例
  11. 论文笔记二 Positive, Negative and Neutral: Modeling Implicit Feedback inSession-based News Recommendatio。
  12. html中颜色的编码,css颜色编码对照表
  13. 2020京东校园招聘笔试编码题小分享--大小写切换
  14. 风再起时?风继续吹........
  15. python爬虫网易云_Python爬虫网易云音乐Top50热门歌单
  16. MT5 EA交易期货-市价单开仓平仓
  17. 2020年“磐云杯”网络空间安全技能竞赛全国拉赛
  18. DonkeySim挑战赛
  19. PM981/PM981a安装黑苹果-Disk Genius教程
  20. 阿里云ECS服务器部署javaweb项目整个流程

热门文章

  1. c语言2010试题答案,2010年c语言试题及答案
  2. java毕业设计户籍管理系统(附源码、数据库)
  3. 关于使用VBA调用AutoCAD的学习
  4. 一个不知名前辈的创业史(血泪)
  5. macfee怎么生成释放代码_批处理应用:使用FLASHGET检查Mcafee SuperDat更新
  6. 安卓psp模拟器哪个好_手机psp模拟器哪个好_安卓PSP模拟器中文官方版下载_66游戏网...
  7. Python env
  8. 一年级美术下册教案(新人美版)
  9. Excel·VBA破解密码
  10. 如何用maxdos网刻,MAXDOS网刻教程(转)