本地视频播放,包括播放、暂停,继续等,还有显示播放的进度。效果如下:

1.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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"android:orientation="vertical"tools:context="com.zhang.videoplay.MainActivity"><LinearLayoutandroid:id="@+id/line"android:layout_width="match_parent"android:layout_height="40dp"android:layout_margin="10dp"android:orientation="horizontal"><Buttonandroid:id="@+id/playstart"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="播放"/><Buttonandroid:id="@+id/pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="暂停"/><Buttonandroid:id="@+id/rebroadcast"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="重播"/><Buttonandroid:id="@+id/playstop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="停止"/></LinearLayout><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="300dp"android:layout_height="300dp"android:layout_margin="20dp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/startime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:gravity="center"android:text="00:00"/><SeekBarandroid:id="@+id/seekBar"android:layout_height="wrap_content"android:layout_width="match_parent"android:layout_weight="6"/><TextViewandroid:id="@+id/sumTime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:gravity="center"android:text="hello"/></LinearLayout></LinearLayout>

2.MainActivity.java

package com.zhang.videoplay;import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button plastart, pause, playstop, rebroadcast;private SurfaceView surfaceView;private SeekBar seekBar;private MediaPlayer mediaPlayer;private int currentPosition = 0;private boolean isPlaying;private TextView startTime,sumTime;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();// 为SurfaceHolder添加回调surfaceView.getHolder().addCallback(callback);// 设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到界面surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 为进度条添加进度更改事件seekBar.setOnSeekBarChangeListener(change);}private void initView() {plastart = (Button) findViewById(R.id.playstart);plastart.setOnClickListener(this);pause = (Button) findViewById(R.id.pause);pause.setOnClickListener(this);playstop = (Button) findViewById(R.id.playstop);playstop.setOnClickListener(this);rebroadcast = (Button) findViewById(R.id.rebroadcast);rebroadcast.setOnClickListener(this);sumTime= (TextView) findViewById(R.id.sumTime);startTime= (TextView) findViewById(R.id.startime);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);seekBar = (SeekBar) findViewById(R.id.seekBar);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.playstart://开始play(0);plastart.setEnabled(false);break;case R.id.playstop://停止stop();break;case R.id.rebroadcast://重播replay();break;case R.id.pause://暂停pause();break;}}// 添加一个Callback对象监听SurfaceView的变化private Callback callback = new Callback() {// SurfaceHolder被修改的时候回调@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {Log.i("info", "SurfaceHolder 被销毁");// 销毁SurfaceHolder的时候记录当前的播放位置并停止播放if (mediaPlayer != null && mediaPlayer.isPlaying()) {currentPosition = mediaPlayer.getCurrentPosition();mediaPlayer.stop();}}//SurfaceView创建时触发@Overridepublic void surfaceCreated(SurfaceHolder holder) {Log.i("info", "SurfaceHolder 被创建");if (currentPosition > 0) {// 创建SurfaceHolder的时候,如果存在上次播放的位置,则按照上次播放位置进行播放play(currentPosition);currentPosition = 0;}}//SurfaceView改变时触发@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {Log.i("info", "SurfaceHolder 大小被改变");}};private OnSeekBarChangeListener change = new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// 当进度条停止修改的时候触发// 取得当前进度条的刻度int progress = seekBar.getProgress();if (mediaPlayer != null && mediaPlayer.isPlaying()) {// 设置当前播放的位置mediaPlayer.seekTo(progress);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {Log.i("info","onStopTrackingTouch--"+progress);shiftTime(startTime,progress);}};/*** 开始播放** @param msec 播放初始位置*/protected void play(final int msec) {// 获取视频文件地址String path = "/storage/emulated/0/Download/video.mp4";File file = new File(path);if (!file.exists()) {Toast.makeText(this, "视频文件路径错误", Toast.LENGTH_LONG).show();return;}try {mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 设置播放的视频源Log.i("info", "1111111" + file.getAbsolutePath());mediaPlayer.setDataSource(file.getAbsolutePath());// 设置显示视频的SurfaceHolder,指定视频画面输出到SurfaceView之上mediaPlayer.setDisplay(surfaceView.getHolder());Log.i("info", "开始装载");mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(new OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {Log.i("info", "装载完成");mediaPlayer.start();// 按照初始位置播放mediaPlayer.seekTo(msec);// 设置进度条的最大进度为视频流的最大播放时长seekBar.setMax(mediaPlayer.getDuration());Log.i("info","2222222222-----"+mediaPlayer.getDuration());//将刻度转换成时间mm:ssshiftTime(sumTime,mediaPlayer.getDuration());// 开始线程,更新进度条的刻度new Thread() {@Overridepublic void run() {try {isPlaying = true;while (isPlaying) {int current = mediaPlayer.getCurrentPosition();seekBar.setProgress(current);sleep(1000);}} catch (Exception e) {e.printStackTrace();}}}.start();//将停止按钮设置不可点击playstop.setEnabled(false);}});mediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {// 在播放完毕被回调playstop.setEnabled(true);}});mediaPlayer.setOnErrorListener(new OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {// 发生错误重新播放Log.i("info","onError---"+what);play(0);isPlaying = false;return false;}});} catch (Exception e) {e.printStackTrace();}}/*** 重新开始播放*/protected void replay() {if (mediaPlayer != null&& mediaPlayer.isPlaying()){mediaPlayer.seekTo(0);Toast.makeText(this,"重新播放",Toast.LENGTH_LONG).show();pause.setText("暂停");return;}play(0);isPlaying = false;}/*** 暂停或继续*/protected void pause() {if (pause.getText().toString().trim().equals("继续")) {pause.setText("暂停");mediaPlayer.start();Toast.makeText(this, "继续播放", Toast.LENGTH_SHORT).show();return;}if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.pause();pause.setText("继续");Toast.makeText(this,"暂停播放",Toast.LENGTH_SHORT).show();}}/*** 停止播放*/protected void stop() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;playstop.setEnabled(true);isPlaying = false;}}//将刻度转换为时间private void shiftTime(TextView view,int time){Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");date.setTime(time);String str = sdf.format(date);Log.i("info","33333333-----"+str);view.setText(str);}}

3.加入权限

 <!-- 写外部存储即sdcard的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 打开关闭sdcard的权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

android视频播放的代码相关推荐

  1. 安卓视频播放器 一行代码快速实现视频播放,Android视频播放,AndroidMP3播放,安卓视频播放一行代码搞定,仿今日头条 Android视频播放器

    一行代码快速实现视频播放,Android视频播放,AndroidMP3播放,安卓视频播放一行代码搞定,真正实现Android的全屏功能 github地址:https://github.com/qius ...

  2. Android视频播放之VideoView

    Android视频播放之VideoView 1.VideoView类介绍 Android的VideoView组件可以从不同的来源(例如资源文件或内容提供器)读取图像,计算和维护视频的画面尺寸以使其适用 ...

  3. Android 视频播放器 (二):使用MediaPlayer播放视频

    在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容.也知道VideoView内部封装的就是Med ...

  4. android播放视频来源库,一个强悍而优美的Android视频播放器

    最近项目中有需要用在线视频播放.之前有关于视频播放介绍了一些工具使用.如ijkplayer ,ExoPlayer,Vitamio,android-UniversalMusicPlayer. 想要了解更 ...

  5. flv f4v mp4 视频播放器代码

    flv f4v mp4 视频播放器代码 ckplayer是一款在网页上播放视频的免费的播放器,功能强大,体积小巧,跨平台,使用起来随心所欲. 播放器主要以adobe的flash(所使用的版本是CS5) ...

  6. android视频播放器 http 206,一个强悍而优美的Android视频播放器

    最近项目中有需要用在线视频播放.之前有关于视频播放介绍了一些工具使用.如ijkplayer ,ExoPlayer,Vitamio,android-UniversalMusicPlayer. 想要了解更 ...

  7. 一个强悍而优美的Android视频播放器

    最近项目中有需要用在线视频播放.之前有关于视频播放介绍了一些工具使用.如ijkplayer ,ExoPlayer,Vitamio,android-UniversalMusicPlayer. 想要了解更 ...

  8. Android视频播放器ExoPlayer

    Android视频播放器ExoPlayer SimpleExoPlayer 1. app gradle dependencies { implementation 'com.google.androi ...

  9. 基于ffmpeg+opengl+opensl es的android视频播放器

    最近做了一个android视频播放器,在jni中采用c/c++现了播放器的播放,暂停,快进等基本的播放器功能. 使用开源库FFMpeg来解码,得到音视频数据,FFMPEG是一个功能强大的音视频解码,编 ...

  10. android视频播放器报告,android视频播放器实训报告.doc

    实训报告书 实训名称: Android视频播放器 系 (部): 专业班级: 学生姓名: 学 号: 指导教师: 完成日期: 实训课题Android视频播放器实训人姓名 同组人员实训日期 实训成绩指导教师 ...

最新文章

  1. mysql/mariadb centos7 修改root用户密码及配置参数
  2. C++虚继承(八) --- 虚继承与继承的差异
  3. AMD cpu 下 Pytorch 多卡并行卡死问题解决
  4. vista任务栏透明_增加Windows Vista任务栏预览大小的赏金(付费!)
  5. Java旧版不断发展
  6. python域名转ip_Python 实现域名解析为ip的方法
  7. php大量数据库抽象,数据库的数据抽象有几个级别
  8. Kitura —— 基于 Swift 的 Web 框架
  9. tx2开发板接口详解_Linux CAN编程详解
  10. Word VBA:查找隐藏字符
  11. 机器学习面试知识点总结
  12. LaTeX 长度和单位 Lengths Units
  13. Excel 地址 行列转换
  14. 开放的在线客服系统Live Zilla
  15. python github 12306 文贤平_抢票工具成了GitHub热榜第一,最新支持候补抢票,Python跑起来...
  16. 习题5.4 找出4*5矩阵中值最小和最大元素,并分别输出其值及所在的行号和列号。
  17. “有心杀敌,无力回天”的无奈
  18. NSDP协议PORTAL服务器源码
  19. 我注册的163邮箱收信地址格式怎么写?邮箱163注册申请后怎么登录?
  20. 006基于近似熵、递归量化分析和卷积神经网络的癫痫发作自动检测-2019

热门文章

  1. 抖音html动态时钟,三分钟教会!火爆抖音的“动态时钟屏保”,个性十足!
  2. DS18B20使用说明
  3. QCC频率校准工具定频
  4. 软件测试的功能点理解
  5. 全国大学生数学建模竞赛论文格式规范
  6. 【视频分享】尚硅谷HTML5前端视频_React视频
  7. 安装torch与luarocks的一些问题
  8. 初学者对于SVM的一点点学习心得
  9. Vue删除表格中的某一行数据
  10. matlab:夫琅禾费衍射简单仿真