简易音乐播放器,带seekBar,可滑动调节播放进度
发布日期:2021-11-12 07:57:39
浏览次数:26
分类:技术文章
本文共 5897 字,大约阅读时间需要 19 分钟。
原文地址:http://blog.csdn.net/qq_35414804/article/details/52934885
闲言少叙,进入正题,这个也不能称之为播放器,只是播放 /res/raw 下的音乐文件。
因为是初学者,所以遇到的问题比较多,很多都是不应该出现的问题,但是好在都解决了
我在代码中的注释我觉得够详细的了,希望跟我一样的初学者能少走一些弯路
遇到的问题:
1. 暂停之后恢复播放不能在暂停位置播放 2. 当滑动SeekBar时会因为和播放时不断更新的SeekBar进度发生冲突XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
JAVA
package com.example.yipai.musicplay;import android.content.Context;import android.media.MediaPlayer;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.SeekBar;import android.widget.TextView;import java.io.IOException;public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { private TextView now_time; private SeekBar audio_seekBar; private Button btn_start_audio; private Button btn_stop_audio; private MediaPlayer m; private Context context = MainActivity.this; private Thread thread; //记录播放位置 private int time; //记录是否暂停 private boolean flage = false, isChanging = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Media控件设置 m = new MediaPlayer(); init(); } //Activity从后台重新回到前台时被调用 @Override protected void onRestart() { super.onRestart(); if (m != null) { if (m.isPlaying()) { m.start(); } } } //Activity被覆盖到下面或者锁屏时被调用 @Override protected void onPause() { super.onPause(); if (m != null) { if (m.isPlaying()) { m.pause(); } } } @Override protected void onResume() { super.onResume(); if (m != null) { if (!m.isPlaying()) { m.start(); } } } //Activity被销毁 protected void onDestroy() { if (m.isPlaying()) { m.stop();//停止音频的播放 } m.release();//释放资源 super.onDestroy(); } class ClickEvent implements View.OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { case R.id.Button01: if (m.isPlaying()) { //m.getCurrentPosition();获取当前播放位置 time = m.getCurrentPosition(); // 如果正在播放,则暂停,并把按钮上的文字设置成“暂停” m.pause(); btn_start_audio.setText("暂停"); flage = true;//flage 标记为 ture } else if (flage) { m.start();//先开始播放 m.seekTo(time);//设置从哪里开始播放 btn_start_audio.setText("播放"); flage = false; } else { m.reset();//恢复到未初始化的状态 m = MediaPlayer.create(context, R.raw.kids);//读取音频 audio_seekBar.setMax(m.getDuration());//设置SeekBar的长度 try { m.prepare(); //准备 } catch (IllegalStateException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } m.start(); //播放 // 创建一个线程 btn_start_audio.setText("播放"); } thread = new Thread(new SeekBarThread()); // 启动线程 thread.start(); break; case R.id.Button02: m.stop(); audio_seekBar.setProgress(0); break; } } } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { now_time.setText("当前播放时间" + ShowTime(progress)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { //防止在拖动进度条进行进度设置时与Thread更新播放进度条冲突 isChanging = true; } @Override public void onStopTrackingTouch(SeekBar seekBar) { now_time.setText("当前播放时间" + ShowTime(seekBar.getProgress())); //将media进度设置为当前seekbar的进度 m.seekTo(seekBar.getProgress()); isChanging = false; thread = new Thread(new SeekBarThread()); // 启动线程 thread.start(); } // 自定义的线程 class SeekBarThread implements Runnable { @Override public void run() { while (!isChanging && m.isPlaying()) { // 将SeekBar位置设置到当前播放位置 audio_seekBar.setProgress(m.getCurrentPosition()); try { // 每100毫秒更新一次位置 Thread.sleep(100); //播放进度 } catch (InterruptedException e) { e.printStackTrace(); } } } } //时间显示函数,我们获得音乐信息的是以毫秒为单位的,把把转换成我们熟悉的00:00格式 public String ShowTime(int time) { time /= 1000; int minute = time / 60; int hour = minute / 60; int second = time % 60; minute %= 60; return String.format("%02d:%02d", minute, second); } private void init() { audio_seekBar = (SeekBar) findViewById(R.id.seekBar); btn_start_audio = (Button) findViewById(R.id.Button01); btn_stop_audio = (Button) findViewById(R.id.Button02); now_time = (TextView) findViewById(R.id.now_time); btn_start_audio.setOnClickListener(new ClickEvent()); btn_stop_audio.setOnClickListener(new ClickEvent()); audio_seekBar.setOnSeekBarChangeListener(this); }}
转载地址:https://blog.csdn.net/happy_love1990/article/details/78318004 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年03月27日 06时35分33秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
一文讲明Dubbo Remoting模块
2019-04-27
OAuth 2.0实战(一)-通俗光速入门
2019-04-27
OAuth 2.0实战(二)-为什么要先获取授权码code?
2019-04-27
授权服务是如何颁发授权码和访问令牌的?
2019-04-27
OAuth2.0实战(三)-使用JWT
2019-04-27
你确定懂OAuth 2.0的三方软件和受保护资源服务?
2019-04-27
你真的深知JWT(JSON Web Token)了吗?
2019-04-27
Mac下查看、切换JDK版本及其安装目录
2019-04-27
在Mac上安装consolas字体
2019-04-27
阿里P8面试:微服务项目如何校验参数
2019-04-27
判断URL字符串是否合法
2019-04-27
图文+代码讲解带你攻克OAuth 2.0授权流程的三座大山
2019-04-27
VirtualBox添加ISO文件
2019-04-27
图文+代码带你攻克OAuth 2.0三大核心授权类型
2019-04-27
@Value注解不能注入static修饰的属性
2019-04-27
spring boot 2.x 接口返回时间类型不再自动序列化为timestamp
2019-04-27