
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:app="http://schemas.androID.com/apk/res-auto" xmlns:tools="http://schemas.androID.com/tools" androID:orIEntation="vertical" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" tools:context=".SurfaceVIEwActivity"> <SurfaceVIEw androID:layout_wIDth="match_parent" androID:layout_height="300dp" androID:ID="@+ID/suf" /> <Seekbar androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_marginRight="10dp" androID:layout_marginleft="10dp" androID:ID="@+ID/seek_suf" /> <button androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="播放" androID:ID="@+ID/btn_suf" androID:layout_gravity="center" /></linearLayout>java代码:package com.example.androIDmedia26;import androIDx.annotation.NonNull;import androIDx.appcompat.app.AppCompatActivity;import androID.media.AudioManager;import androID.media.MediaPlayer;import androID.os.Bundle;import androID.os.Environment;import androID.os.Handler;import androID.os.Message;import androID.vIEw.SurfaceHolder;import androID.vIEw.SurfaceVIEw;import androID.vIEw.VIEw;import androID.Widget.button;import androID.Widget.Seekbar;import java.io.file;import java.io.IOException;public class SurfaceVIEwActivity extends AppCompatActivity implements VIEw.OnClickListener, Seekbar.OnSeekbarchangelistener, SurfaceHolder.Callback {// 创建一个表面支架,相当于显示器 private SurfaceVIEw suf; private button btn_suf;// 创建一个进度条 private Seekbar seek_suf;// 创建媒体播放器,相当于控制器,对音视频的所有 *** 作都由它来控制 private MediaPlayer mediaPlayer;// 定义一个处理程序来控制进度条读秒走动 private Handler handler = new Handler() { @OverrIDe public voID handleMessage(@NonNull Message msg) { super.handleMessage(msg);// 获取视频当前播放位置 int process = mediaPlayer.getCurrentposition();// 设置进度条位置 seek_suf.setProgress(process);// 再次调用发送空消息的延迟方法,设置下一秒的进度条位置 handler.sendEmptyMessageDelayed(0, 1000); } }; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_sufactivity); btn_suf = findVIEwByID(R.ID.btn_suf); seek_suf = findVIEwByID(R.ID.seek_suf); suf = findVIEwByID(R.ID.suf); btn_suf.setonClickListener(this); seek_suf.setonSeekbarchangelistener(this);// 启用或禁用选项以在显示此表面时保持屏幕开启。 默认值为 false,允许它关闭。 从任何线程调用都是安全的 suf.getHolder().setKeepScreenOn(true);// 为这个持有者添加一个回调接口。 一个持有者可以有多个回调接口。 suf.getHolder().addCallback(this); } @OverrIDe public voID onClick(VIEw v) {// 监听播放按钮的点击事件 if (v.getID() == R.ID.btn_suf) { if (btn_suf.getText().equals("播放")) { btn_suf.setText("暂停");// 如果视频不为空,且未处于播放状态 if (mediaPlayer != null && !mediaPlayer.isPlaying()) {// 调用发送空消息的延迟方法,让进度条开始读秒 handler.sendEmptyMessageDelayed(0, 1000);// 视频开始播放 mediaPlayer.start(); } } else { btn_suf.setText("播放");// 如果视频不为空,且处于播放状态 if (mediaPlayer != null && mediaPlayer.isPlaying()) {// 让进度条停止读秒 handler.removeMessages(0);// 视频暂停 mediaPlayer.pause(); } } } } @OverrIDe public voID onProgressChanged(Seekbar seekbar, int progress, boolean fromUser) { } @OverrIDe public voID onStartTrackingtouch(Seekbar seekbar) { }// 当停止拖动进度条时 @OverrIDe public voID onStopTrackingtouch(Seekbar seekbar) {// 获取进度条当前位置 int process=seekbar.getProgress();// 让视频跳转到进度条位置 mediaPlayer.seekTo(process);// 开始播放 mediaPlayer.start(); }// 这在首次创建表面后立即调用 @OverrIDe public voID surfaceCreated(@NonNull SurfaceHolder holder) {// 创建媒体控件 mediaPlayer = new MediaPlayer();// 获取要播放的文件 file file = new file(Environment.getExternalStorageDirectory() + "/dmx.mp4"); try {// 把文件绝对路径给到媒体控件 mediaPlayer.setDataSource(file.getabsolutePath());// 指定要 *** 作的文件的流类型// 指定类型里没有单独的视频类型,音视频类型都使用STREAM_MUSIC mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 绑定mediaPlayer到surfaceVIEw,mediaPlayer相当于控制器,surfaceVIEw相当于显示器 mediaPlayer.setdisplay(suf.getHolder());// 就绪媒体控件,这个方法会阻塞程序,直到mediaPlayer做好播放准备 mediaPlayer.prepare();// 设置进度条最大值为视频的时长 seek_suf.setMax(mediaPlayer.getDuration()); } catch (IOException e) { e.printstacktrace(); } } @OverrIDe public voID surfaceChanged(@NonNull SurfaceHolder holder, int format, int wIDth, int height) { }// 这在表面被破坏之前立即调用 @OverrIDe public voID surfaceDestroyed(@NonNull SurfaceHolder holder) {// 当媒体不为空,且媒体正在播放 if (mediaPlayer != null && mediaPlayer.isPlaying()) {// 停止播放 mediaPlayer.stop();// 进度条停止 handler.removeMessages(0);// 释放媒体 mediaPlayer.release();// 媒体置空 mediaPlayer = null; } }}效果: 总结 以上是内存溢出为你收集整理的AndroidMedia26 安卓媒体 使用 MediaPlayer 和 SurfaceView 实现自定义复杂播放器全部内容,希望文章能够帮你解决AndroidMedia26 安卓媒体 使用 MediaPlayer 和 SurfaceView 实现自定义复杂播放器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)