** Mediaplay最详细使用方法**
在前几个星期吧 小编的公司 一直有播放音频的这个 模块 但是因为小编 接触这块比较少 所以走了很多的 “丸子” 比如 狂点 播放 暂停按钮 会崩掉 new出好几个 meidiaplay 的 辣鸡操作 但是都改正了 而且 很全面 使用起来 也很简单
**首先我先说明一下我们公司的需求 **
进入背诵界面之后 先判断本地有没有 当前需要播放的音频文件 有的话 直接播放 没有 下载完成之后 播放 可以暂停 ok 那么 咱们开始
先看下效果 因为我是平板 录完视频之后是竖着的 所以大家凑活看
1.这个是本地文件有的情况下 直接播放 可以暂停结束

2.本地没有的情况下会下载 下载完成之后 播放

下边粘上我的代码
xml 布局 是一个Checkbox 进度条就是 系统的 seekbar 就是自己加了一个 样式

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/llyt_play"android:layout_width="match_parent"android:layout_height="70dp"android:layout_margin="5dp"android:gravity="center_vertical"android:orientation="horizontal"><CheckBoxandroid:id="@+id/chk_play_btn"android:layout_width="25dp"android:layout_height="25dp"android:layout_marginLeft="20dp"android:background="@drawable/play_btn_play_pause_selector"android:button="@null" /><SeekBarandroid:id="@+id/audio_play_bar"android:layout_width="0dp"android:layout_weight="16"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:maxHeight="3dp"android:minHeight="3dp"android:progressDrawable="@drawable/shape_seek_bg"android:thumb="@mipmap/ann1" /><LinearLayoutandroid:id="@+id/llyt_time"android:layout_width="0dp"android:layout_weight="3"android:layout_height="70dp"android:layout_alignParentRight="true"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:gravity="center_vertical"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_start_time_show"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:textSize="17sp"android:text="00:00" /><TextViewandroid:id="@+id/tv_xie"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="3dp"android:layout_marginRight="3dp"android:text="/" /><TextViewandroid:id="@+id/tv_stop_show_time"android:layout_width="wrap_content"android:textSize="17sp"android:layout_height="wrap_content"android:layout_centerVertical="true"android:text="00:00" /></LinearLayout></LinearLayout>
</RelativeLayout>

然后 check box 的选择器 以及 seekbar的 设置
首先 checkbox 的 @drawable/play_btn_play_pause_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/iv_stop"  android:state_checked="true"/>  <item android:drawable="@drawable/iv_start"  />
</selector>
//这边图片的大家可以替换自己的

接下来是 seekbar的 @drawable/shape_seek_bg 是一个层次集合 里边都有注解

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@android:id/background" android:height="5dp" >   <!--整体进度条的颜色 背景 --><shape><corners android:radius="5dp" /><solid android:color="#CFDCF6" /></shape></item><item android:id="@android:id/secondaryProgress" android:height="5dp" >   <!--二进度条进度条的颜色 背景 --><clip><shape><corners android:radius="5dp" /><solid android:color="#CFDCF6" /></shape></clip></item><item android:id="@android:id/progress" android:height="5dp" > <!-- 一 进度条的颜色 背景 --><clip><shape><corners android:radius="5dp" /><solid android:color="@color/login_tit" /></shape></clip></item>
</layer-list>

然后 下边粘上我的代码因为这个是我项目中的代码 所以大家“烤”的时候需要自己 过滤一下

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;import com.example.juanshichang.utils.ToastUtil;
import com.xhly.easystud.utils.Util;
import com.flyco.roundview.RoundTextView;
import com.xhkjedu.xhstudy.utils.L;
import com.xhly.easystud.R;
import com.xhly.easystud.base.BaseMvpActivity;
import com.xhly.easystud.bean.ReciteResultBean;
import com.xhly.easystud.config.BaseConfig;
import com.xhly.easystud.http.Content;
import com.xhly.easystud.utils.DownloadUtil;
import com.xhly.easystud.utils.ZJFileUtil;
import com.xhly.easystud.zhan.recite.presenter.ReciteResultPresenterImpl;
import com.xhly.easystud.zhan.recite.recitecontract.ReciteResultContract;import java.io.File;
import java.util.ArrayList;public class ReciteResultActivity extends BaseMvpActivity<ReciteResultPresenterImpl> implements View.OnClickListener, ReciteResultContract.MyView {private static final String TAG = "ReciteResultActivity";private TextView tvBack;private TextView tvNumberReally;private CheckBox chkPlaybtn;private SeekBar andioPlayBtn;private Integer mRsid;private ReciteResultPresenterImpl reciteResultPresenter;private TextView tvTitle;private TextView tvContent;private TextView tvFinishTime;private RoundTextView tvAnswer;private RoundTextView tvOrigin;private String answertxt;private String recitecont;private Integer costtime;private TextView tvStopShowTime;private String answerpath;private boolean isStop;//线程标志位private boolean isPlaying = false;private ArrayList<String> wavfileurllist = new ArrayList<>();private ProgressDialog progressDialog;private Integer costtime1;private String getsubwavfilename;private String wavfileurl;private TextView tvStartTimeShow;public MediaPlayer mediaPlayer = null;private Thread thread;@Overrideprotected int getContentView() {return R.layout.activity_recite_result;}//运用Handler中的handleMessage方法接收子线程传递的信息@SuppressLint("HandlerLeak")private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);// 将SeekBar位置设置到当前播放位置andioPlayBtn.setProgress(msg.what);//获得音乐的当前播放时间tvStartTimeShow.setText(Util.Companion.getTimeMS(msg.what / 1000));}};@Overrideprotected void initView() {changeStatusColor(true);Intent intent = getIntent();mRsid = intent.getIntExtra(Content.PSID, 0);tvBack = findViewById(R.id.tv_back);tvNumberReally = findViewById(R.id.tv_number_really);chkPlaybtn = findViewById(R.id.chk_play_btn);andioPlayBtn = findViewById(R.id.audio_play_bar);tvTitle = findViewById(R.id.tv_title);tvContent = findViewById(R.id.tv_content);tvStartTimeShow = findViewById(R.id.tv_start_time_show);tvNumberReally = findViewById(R.id.tv_number_really);tvFinishTime = findViewById(R.id.tv_finish_time);tvAnswer = findViewById(R.id.tv_answer);tvOrigin = findViewById(R.id.tv_origin);tvStopShowTime = findViewById(R.id.tv_stop_show_time);tvAnswer.getDelegate().setBackgroundColor(getResources().getColor(R.color.logBut));tvAnswer.setTextColor(this.getResources().getColor(R.color.white));reciteResultPresenter = new ReciteResultPresenterImpl();reciteResultPresenter.attachView(this);initonclicklistener();}private void initonclicklistener() {tvBack.setOnClickListener(this);tvOrigin.setOnClickListener(this);tvAnswer.setOnClickListener(this);chkPlaybtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {if (b) {if (mediaPlayer != null) {if(!mediaPlayer.isPlaying()){isStop = false;mediaPlayer.start();if (thread != null) {thread.start();} else {thread = new Thread(new MuiscThread());thread.start();}}} else {satrtPlayWav(); //刚开始为播放的时候 点击开始播放 并且更换状态}} else {//如果在播放中,立刻暂停。chkPlaybtn.setChecked(false);if (mediaPlayer != null) {mediaPlayer.pause();}}}});}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.tv_back:finish();isStop = true;break;case R.id.tv_answer:tvAnswer.getDelegate().setStrokeColor(getResources().getColor(R.color.logBut));tvAnswer.getDelegate().setBackgroundColor(getResources().getColor(R.color.logBut));tvAnswer.setTextColor(getResources().getColor(R.color.white));tvOrigin.getDelegate().setBackgroundColor(getResources().getColor(R.color.white));tvOrigin.getDelegate().setStrokeColor(getResources().getColor(R.color.gray_border));tvOrigin.setTextColor(getResources().getColor(R.color.black));tvContent.setText(answertxt);break;case R.id.tv_origin:tvOrigin.getDelegate().setStrokeColor(getResources().getColor(R.color.logBut));tvOrigin.getDelegate().setBackgroundColor(getResources().getColor(R.color.logBut));tvOrigin.setTextColor(getResources().getColor(R.color.white));tvAnswer.getDelegate().setBackgroundColor(getResources().getColor(R.color.white));tvAnswer.getDelegate().setStrokeColor(getResources().getColor(R.color.gray_border));tvAnswer.setTextColor(getResources().getColor(R.color.black));tvContent.setText(recitecont);break;}}@Overrideprotected void initData() {showLoading();reciteResultPresenter.getReciteResultData(mRsid);}@Overridepublic void getReciteResultView(ReciteResultBean reciteResultBean) {answerpath = reciteResultBean.getAnswerpath();String recitetitle = reciteResultBean.getRecitetitle();recitecont = reciteResultBean.getRecitecont();answertxt = reciteResultBean.getAnswertxt();Integer userscore = reciteResultBean.getUserscore();Integer stoptime = reciteResultBean.getStoptime();costtime1 = reciteResultBean.getCosttime();   //后台获取到的时间String Stringstoptime = Util.Companion.getTimedate(stoptime);tvFinishTime.setText("完成时间 : " + Stringstoptime);tvTitle.setText(recitetitle);tvContent.setText(answertxt);tvNumberReally.setText(String.valueOf(userscore));tvTitle.setText(recitetitle);}private void satrtPlayWav() {wavfileurl = ZJFileUtil.AUDIO_WAV_DIR(this);File file = new File(wavfileurl);File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {File file1 = files[i];if (file1 != null) {wavfileurllist.add(file1.getName());} else {}}getsubwavfilename = answerpath.substring(answerpath.lastIndexOf("/") + 1);if (wavfileurllist != null && wavfileurllist.contains(getsubwavfilename)) {startplsywav(getsubwavfilename);} else {chkPlaybtn.setChecked(false);progressDialog = new ProgressDialog(ReciteResultActivity.this);progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.setTitle("正在下载");progressDialog.setMessage("请稍后...");progressDialog.setProgress(0);progressDialog.setMax(100);progressDialog.show();progressDialog.setCancelable(false);DownloadUtil.get().download(BaseConfig.showImageUrl + answerpath, ZJFileUtil.AUDIO_WAV_DIR(this), getsubwavfilename, new DownloadUtil.OnDownloadListener() {@Overridepublic void onDownloadSuccess(File file) {runOnUiThread(new Runnable() {@Overridepublic void run() {String getokwavurl = file.getName().substring(file.getName().lastIndexOf("/") + 1);if (getokwavurl.equals(getsubwavfilename)) {ToastUtil.Companion.showToast(ReciteResultActivity.this, "下载完成");chkPlaybtn.setChecked(true);}}});}@Overridepublic void onDownloading(int progress) {runOnUiThread(new Runnable() {@Overridepublic void run() {progressDialog.setProgress(progress);if (progress == progressDialog.getMax()) {progressDialog.dismiss();}}});}@Overridepublic void onDownloadFailed(Exception e) {runOnUiThread(new Runnable() {@Overridepublic void run() {ToastUtil.Companion.showToast(ReciteResultActivity.this, "下载失败");progressDialog.dismiss();}});}});}}private void startplsywav(String filename) {isStop = false;chkPlaybtn.setChecked(true);mediaPlayer = new MediaPlayer();try {mediaPlayer.setDataSource(wavfileurl + File.separator + filename);mediaPlayer.prepareAsync();} catch (Exception e) {e.printStackTrace();}mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mediaPlayer) {mediaPlayer.start();andioPlayBtn.setMax(mediaPlayer.getDuration());int stopshowtime = mediaPlayer.getDuration() / 1000; //h直接获取本地的 文件时间String Stringfinishtime = Util.Companion.getTimeMS(stopshowtime);tvStopShowTime.setText(Stringfinishtime);chkPlaybtn.setClickable(true);}});thread = new Thread(new MuiscThread());// 启动线程thread.start();mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {isStop = true;if (mediaPlayer != null) {if (mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();}}if (thread != null) {thread.interrupt();}
//                tvStartTimeShow.setText("00:00");
//                andioPlayBtn.setProgress(0);chkPlaybtn.setChecked(false);}});}@Overrideprotected void onDestroy() {super.onDestroy();if (mediaPlayer != null && handler != null && thread != null) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;thread.interrupt();isStop = true;handler.removeCallbacks(thread);}}//建立一个子线程实现Runnable接口class MuiscThread implements Runnable {@Override//实现run方法public void run() {//判断音乐的状态,在不停止与不暂停的情况下向总线程发出信息while (mediaPlayer != null && !isStop) {try {//发出的信息handler.sendEmptyMessage(mediaPlayer.getCurrentPosition());// 每100毫秒更新一次位置Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}if (isStop) {thread.interrupt();break;}}}}}

加上我使用的下载工具类

/*** 文件下载工具类(单例模式)* Created on 2017/10/16.*/public class DownloadUtil {private static DownloadUtil downloadUtil;private final OkHttpClient okHttpClient;public static DownloadUtil get() {if (downloadUtil == null) {downloadUtil = new DownloadUtil();}return downloadUtil;}private DownloadUtil() {okHttpClient = new OkHttpClient();}/*** @param url          下载连接* @param destFileDir  下载的文件储存目录* @param destFileName 下载文件名称* @param listener     下载监听*/public void download(final String url, final String destFileDir, final String destFileName, final OnDownloadListener listener) {Request request = new Request.Builder().url(url).build();okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// 下载失败监听回调listener.onDownloadFailed(e);}@Overridepublic void onResponse(Call call, Response response) throws IOException {InputStream is = null;byte[] buf = new byte[2048];int len = 0;FileOutputStream fos = null;// 储存下载文件的目录File dir = new File(destFileDir);if (!dir.exists()) {dir.mkdirs();}File file = new File(dir, destFileName);try {is = response.body().byteStream();long total = response.body().contentLength();fos = new FileOutputStream(file);long sum = 0;while ((len = is.read(buf)) != -1) {fos.write(buf, 0, len);sum += len;int progress = (int) (sum * 1.0f / total * 100);// 下载中更新进度条listener.onDownloading(progress);}fos.flush();// 下载完成listener.onDownloadSuccess(file);} catch (Exception e) {listener.onDownloadFailed(e);} finally {try {if (is != null)is.close();} catch (IOException e) {}try {if (fos != null)fos.close();} catch (IOException e) {}}}});}public interface OnDownloadListener {/*** @param file 下载成功后的文件*/void onDownloadSuccess(File file);/*** @param progress 下载进度*/void onDownloading(int progress);/*** @param e 下载异常信息*/void onDownloadFailed(Exception e);}
}

大家 看了有不懂的 可以问我 问我我的地方 我到时候加个注释 再给大家说一下 这样写的好处

Android——Mediaplay音频播放最详细最全面使用方法-以及自定义seekbar 样式相关推荐

  1. android exo解码问题,Android Exoplayer音频播放异常

    我使用ExoPlayer播放声音时遇到问题.即快速切换"停止 - 启动"异常发生Android Exoplayer音频播放异常 java.lang.NullPointerExcep ...

  2. 视频教程-FFmpeg打造Android万能音频播放器-Android

    FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...

  3. Android录音笔-音频播放器,不止适用于保存的录音

    Android录音笔-音频播放器,不止适用于保存的录音 功能说明 点击录音列表项弹出播放对话框 对话框碎片的布局dialog_fragment.xml 对话框碎片MyDialog.java 对话框碎片 ...

  4. Android N音频播放延迟

    背景 在Android N上使用MediaPlayer进行高频率的音频播放,会出现很严重的声音播放延迟的问题.比如快递业务场景,在业务员正确扫描快递面单后,需要播放一个声音来提示业务员该面单已经扫描完 ...

  5. android 以音频播放器为例实现通知栏显示通知,并实现切歌、暂停、播放,并实现加载网络图片,并实现关闭第三方APP音频

    首先先给大家看下效果 接下来我们看下具体如何实施 1.首先我们创建一个音频的单例对象,这样能保证每次在播放的的音频是唯一的(类名如:MediaPlayerUtil.java) package xxx; ...

  6. android 视频+音频播放器Demo

    程序主界面 MainActivity.java 1.主界面,头部是两个TextView(自定义类似指针效果),底部是ViewPager.ViewPager中每个页面对应的是一个Fragment.这样就 ...

  7. android MediaPlayer音频播放demo

    网上搜了些关于MediaPlayer的资料 1)如何获得MediaPlayer实例: 可以使用直接new的方式: MediaPlayer mp = new MediaPlayer(); 也可以使用cr ...

  8. android自定义seekbar样式,自定义SeekBar样式

    系统默认的seekbar很多时候不符合开发需求,那么就需要自定义seekbar的样式,方法并不复杂,下面记录一下: 布局文件中:android:thumb="@drawable/sanjia ...

  9. android蓝牙和线同时播放,Android蓝牙音频播放和录制

    我有一个蓝牙耳机(它可以播放立体声音乐)连接到我的Android手机(Android 4.4.3) . 现在我希望我的代码能够以高采样率(44100)播放立体声音乐并从该耳机录制音频 . 我按照以下帖 ...

最新文章

  1. Hadoop之ReduceTask工作机制
  2. linux中磁盘的iused,Linux 磁盘与文件系统管理
  3. 如何重新安装win2008服务器系统分区,怎么解决安装server2008后磁盘分区消失的方法步骤...
  4. C-Free 您不能使用调试解决方案
  5. POJ读书笔记2.1 —— 鸡兔同笼
  6. 锻造恒生O45:致广大而尽精微
  7. OpenCV-图像处理(06、调整图像亮度与对比度)
  8. 已知圆上两点坐标和半径求圆心
  9. 公文写作神器 v2.8.1.20 去更新去广告版
  10. WP模板,WP网站模板,WP网站主题模板
  11. Chrome扩展 - 百度识图
  12. 不良事件总结怎么写_年度不良事件总结
  13. SCI写作之-结构和写作顺序
  14. Oracle的逻辑读和物理读
  15. UDP/TCP实时传输图像
  16. [CF1336F]Journey
  17. 项目中报错:Warning: count():Parameter must be an array or an object that implements Countable的解决方案
  18. 微软 CTO 韦青:“程序员 35 岁就被淘汰”是个伪概念
  19. 布朗大学计算机专业怎么样,布朗大学计算机专业怎么样?过来人告诉你
  20. HarmonyOS应用开发第一次培训

热门文章

  1. OC中JSON解析与XML解析
  2. wps 图片批量排序,批量使用题注修改图片序号
  3. 服务器返回响应http短语,关于服务器返回的十四种常见HTTP状态码详解
  4. Power BI API调用注意事项 (By Power Automate)
  5. 阿里云Ubuntu安装部署EMQX物联网MQTT服务器
  6. 软件测试之黑盒测试用例
  7. python里的英文歌叫什么_用Python分析韩国女团最喜欢的英文单词
  8. 小米10pro第二个摄像头下面_小米10 Pro真机体验,憋了一肚子心里话,不吐不快...
  9. js导出html页面到excel表格,JavaScript将页面表格导出为Excel的具体实现
  10. 微信公众号代运营攻略 !粉丝分析、内容策略、营销策略、数据分析