1. 权限
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

activity_main.xml //gisoracle 版权所有

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6.  
  7. <LinearLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:orientation="horizontal">
  11.  
  12. <EditText
  13. android:id="@+id/et_path"
  14. android:layout_width="500px"
  15. android:layout_height="wrap_content"
  16. android:text="/sdcard/a.mp4" />
  17.  
  18. <Button
  19. android:id="@+id/btn_browse"
  20. android:layout_width="0dip"
  21. android:layout_height="wrap_content"
  22. android:layout_weight="1"
  23. android:text="浏览" />
  24. </LinearLayout>
  25.  
  26. <SeekBar
  27. android:id="@+id/seekBar"
  28. android:layout_width="match_parent"
  29. android:layout_height="wrap_content" />
  30.  
  31. <LinearLayout
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:orientation="horizontal">
  35.  
  36. <Button
  37. android:id="@+id/btn_play"
  38. android:layout_width="0dip"
  39. android:layout_height="wrap_content"
  40. android:layout_weight="1"
  41. android:text="播放" />
  42.  
  43. <Button
  44. android:id="@+id/btn_pause"
  45. android:layout_width="0dip"
  46. android:layout_height="wrap_content"
  47. android:layout_weight="1"
  48. android:text="暂停" />
  49.  
  50. <Button
  51. android:id="@+id/btn_replay"
  52. android:layout_width="0dip"
  53. android:layout_height="wrap_content"
  54. android:layout_weight="1"
  55. android:text="重播" />
  56.  
  57. <Button
  58. android:id="@+id/btn_stop"
  59. android:layout_width="0dip"
  60. android:layout_height="wrap_content"
  61. android:layout_weight="1"
  62. android:text="停止" />
  63. <TextView
  64. android:id="@+id/textView"
  65. android:layout_width="match_parent"
  66. android:layout_height="wrap_content"
  67. android:text="时间:" />
  68. </LinearLayout>
  69.  
  70. <VideoView
  71. android:id="@+id/vv_videoview"
  72. android:layout_width="fill_parent"
  73. android:layout_height="fill_parent" />
  74.  
  75. </LinearLayout>

java //gisoracle 版权所有

  1. package com.example.yanlei.myapplication;
  2.  
  3. import android.media.MediaMetadataRetriever;
  4. import android.media.MediaPlayer;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.os.Bundle;
  7. import android.app.Activity;
  8. import android.content.Intent;
  9. import android.content.pm.ActivityInfo;
  10. import android.database.Cursor;
  11. import android.net.Uri;
  12. import android.os.Bundle;
  13. import android.provider.MediaStore;
  14. import android.support.v7.app.AppCompatActivity;
  15. import android.view.View;
  16. import android.widget.Button;
  17. import android.widget.EditText;
  18. import android.widget.SeekBar;
  19. import android.widget.TextView;
  20. import android.widget.Toast;
  21. import android.widget.VideoView;
  22. import android.app.Activity;
  23. import android.media.MediaPlayer;
  24. import android.media.MediaPlayer.OnCompletionListener;
  25. import android.media.MediaPlayer.OnErrorListener;
  26. import android.os.Bundle;
  27. import android.util.Log;
  28. import android.view.View;
  29. import android.widget.Button;
  30. import android.widget.EditText;
  31. import android.widget.SeekBar;
  32. import android.widget.Toast;
  33. import android.widget.VideoView;
  34. import android.widget.SeekBar.OnSeekBarChangeListener;
  35.  
  36. import java.io.File;
  37. import java.util.HashMap;
  38.  
  39. import android.os.Handler;
  40.  
  41. public class MainActivity extends AppCompatActivity {
  42.  
  43. private final String TAG = "main";
  44. private EditText et_path;
  45. private Button btn_play, btn_pause, btn_replay, btn_stop, btn_browse;
  46. private SeekBar seekBar;
  47. private VideoView vv_video;
  48. private boolean isPlaying;
  49. private TextView pTextView = null;
  50. private Handler handler = null;
  51.  
  52. @Override
  53. protected void onCreate(Bundle savedInstanceState) {
  54. super.onCreate(savedInstanceState);
  55. setContentView(R.layout.activity_main);
  56.  
  57. seekBar = (SeekBar) findViewById(R.id.seekBar);
  58. et_path = (EditText) findViewById(R.id.et_path);
  59. vv_video = (VideoView) findViewById(R.id.vv_videoview);
  60. pTextView = (TextView) findViewById(R.id.textView);
  61.  
  62. btn_play = (Button) findViewById(R.id.btn_play);
  63. btn_pause = (Button) findViewById(R.id.btn_pause);
  64. btn_replay = (Button) findViewById(R.id.btn_replay);
  65. btn_stop = (Button) findViewById(R.id.btn_stop);
  66. btn_browse = (Button) findViewById(R.id.btn_browse);
  67.  
  68. btn_play.setOnClickListener(click);
  69. btn_pause.setOnClickListener(click);
  70. btn_replay.setOnClickListener(click);
  71. btn_stop.setOnClickListener(click);
  72. btn_browse.setOnClickListener(click);
  73.  
  74. // 为进度条添加进度更改事件
  75. seekBar.setOnSeekBarChangeListener(change);
  76.  
  77. //创建属于主线程的handler
  78. handler = new Handler();
  79.  
  80. }
  81.  
  82. private OnSeekBarChangeListener change = new OnSeekBarChangeListener() {
  83.  
  84. @Override
  85. public void onStopTrackingTouch(SeekBar seekBar) {
  86. // 当进度条停止修改的时候触发
  87. // 取得当前进度条的刻度
  88. int progress = seekBar.getProgress();
  89. if (vv_video != null && vv_video.isPlaying()) {
  90. // 设置当前播放的位置
  91. vv_video.seekTo(progress);
  92. }
  93. }
  94.  
  95. @Override
  96. public void onStartTrackingTouch(SeekBar seekBar) {
  97.  
  98. }
  99.  
  100. @Override
  101. public void onProgressChanged(SeekBar seekBar, int progress,
  102. boolean fromUser) {
  103.  
  104. }
  105. };
  106. private View.OnClickListener click = new View.OnClickListener() {
  107.  
  108. @Override
  109. public void onClick(View v) {
  110.  
  111. switch (v.getId()) {
  112. case R.id.btn_play:
  113. play(0);
  114. break;
  115. case R.id.btn_pause:
  116. pause();
  117. break;
  118. case R.id.btn_replay:
  119. replay();
  120. break;
  121. case R.id.btn_stop:
  122. stop();
  123. break;
  124. case R.id.btn_browse:
  125. browse();
  126. break;
  127. default:
  128. break;
  129. }
  130. }
  131. };
  132.  
  133. //获得MP4时长
  134. private int getTimeLong(String videoPath) {
  135.  
  136. MediaMetadataRetriever retr = new MediaMetadataRetriever();
  137. retr.setDataSource(videoPath);
  138. //String height = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); // 视频高度
  139. //String width = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); // 视频宽度
  140. //String rotation = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); // 视频旋转方向
  141. String timelong = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);//时长,单位为毫秒
  142. retr.release();
  143. int l = Integer.parseInt(timelong);
  144. return l;
  145.  
  146. }
  147.  
  148. String myText = "";
  149.  
  150. protected void play(int msec) {
  151. Log.i(TAG, " 获取视频文件地址");
  152. String path = et_path.getText().toString().trim();
  153. File file = new File(path);
  154. if (!file.exists()) {
  155. Toast.makeText(this, "视频文件路径错误", 0).show();
  156. return;
  157. }
  158.  
  159. Log.i(TAG, "指定视频源路径");
  160. vv_video.setVideoPath(file.getAbsolutePath());
  161. Log.i(TAG, "开始播放");
  162. vv_video.start();
  163.  
  164. // 按照初始位置播放
  165. vv_video.seekTo(msec);
  166. // 设置进度条的最大进度为视频流的最大播放时长
  167. final int time = getTimeLong(file.getAbsolutePath()) / 100;
  168. seekBar.setMax(time);
  169. Toast.makeText(this, "长度:" + time, Toast.LENGTH_LONG).show();
  170. // 开始线程,更新进度条的刻度
  171. new Thread() {
  172.  
  173. @Override
  174. public void run() {
  175. try {
  176. isPlaying = true;
  177. while (isPlaying) {
  178. // 如果正在播放,0.1.毫秒更新一次进度条
  179. final int current = vv_video.getCurrentPosition() / 100;
  180. seekBar.setProgress(current);
  181. /* try {
  182. myText = "总时间:" + time / 10 + "秒,目前:" + current / 10 + "秒";
  183. // pTextView.setText("总时间:" + time / 10 + "秒,目前:" + current / 10 + "秒");
  184. new WorkThread().start();
  185. } catch (Exception ex) {
  186.  
  187. Log.d("错误:", ex.getMessage().toString());
  188. }*/
  189.  
  190. new Thread() {
  191. public void run() {
  192. myText = "总时间:" + time / 10 + "秒,目前:" + current / 10 + "秒";
  193. handler.post(updateUIRunnable);
  194. }
  195. }.start();
  196.  
  197. //Toast.makeText(this, "当前:"+current,Toast.LENGTH_LONG).show();
  198. sleep(100);
  199. }
  200. } catch (Exception e) {
  201. e.printStackTrace();
  202. }
  203. }
  204. }.start();
  205. // 播放之后设置播放按钮不可用
  206. btn_play.setEnabled(false);
  207.  
  208. vv_video.setOnCompletionListener(new OnCompletionListener() {
  209.  
  210. @Override
  211. public void onCompletion(MediaPlayer mp) {
  212. // 在播放完毕被回调
  213. btn_play.setEnabled(true);
  214. }
  215. });
  216.  
  217. vv_video.setOnErrorListener(new OnErrorListener() {
  218.  
  219. @Override
  220. public boolean onError(MediaPlayer mp, int what, int extra) {
  221. // 发生错误重新播放
  222. play(0);
  223. isPlaying = false;
  224. return false;
  225. }
  226. });
  227. }
  228.  
  229. // 构建Runnable对象,并在runnable中更新UI
  230. Runnable updateUIRunnable = new Runnable() {
  231. @Override
  232. public void run() {
  233. try {
  234.  
  235. pTextView.setText(myText);
  236. } catch (Exception ex) {
  237. Log.e("严重错误:", ex.getMessage().toString());
  238.  
  239. }
  240. }
  241. };
  242.  
  243. /**
  244. * 重新开始播放
  245. */
  246. protected void replay() {
  247. if (vv_video != null && vv_video.isPlaying()) {
  248. vv_video.seekTo(0);
  249. Toast.makeText(this, "重新播放", 0).show();
  250. btn_pause.setText("暂停");
  251. return;
  252. }
  253. isPlaying = false;
  254. play(0);
  255.  
  256. }
  257.  
  258. protected void browse() {
  259. Intent it = new Intent(Intent.ACTION_GET_CONTENT); //创建动作为 "选取" 的 Intent
  260. it.setType("video/*"); //要选取所有视频类型
  261. startActivityForResult(it, 101);
  262.  
  263. }
  264.  
  265. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  266. super.onActivityResult(requestCode, resultCode, data);
  267.  
  268. if (resultCode == Activity.RESULT_OK) {
  269.  
  270. Uri uri = convertUri(data.getData()); //获取选取文件的 Uri 并进行 Uri 格式转换
  271. et_path.setText(uri.getPath()); //显示文件名 (Uri 最后的节点文字)
  272. // txvUri.setText("文件位置:" + uri.getPath());//显示文件的路径
  273. }
  274. }
  275.  
  276. Uri convertUri(Uri uri) { //将 "content://" 类型的 Uri 转换为 "file://" 的 Uri
  277. if (uri.toString().substring(0, 7).equals("content")) { //如果是以 "content" 开头
  278. String[] colName = {MediaStore.MediaColumns.DATA}; //声明要查询的字段
  279. Cursor cursor = getContentResolver().query(uri, colName, //以 uri 进行查询
  280. null, null, null);
  281. cursor.moveToFirst(); //移到查询结果的第一个记录
  282. uri = Uri.parse("file://" + cursor.getString(0)); //将路径转为 Uri
  283. cursor.close(); //关闭查询结果
  284. }
  285. return uri; //返回 Uri 对象
  286. }
  287.  
  288. /**
  289. * 暂停或继续
  290. */
  291. protected void pause() {
  292. if (btn_pause.getText().toString().trim().equals("继续")) {
  293. btn_pause.setText("暂停");
  294. vv_video.start();
  295. Toast.makeText(this, "继续播放", 0).show();
  296. return;
  297. }
  298. if (vv_video != null && vv_video.isPlaying()) {
  299. vv_video.pause();
  300. btn_pause.setText("继续");
  301. Toast.makeText(this, "暂停播放", 0).show();
  302. }
  303. }
  304.  
  305. /*
  306. * 停止播放
  307. */
  308. protected void stop() {
  309. if (vv_video != null && vv_video.isPlaying()) {
  310. vv_video.stopPlayback();
  311. btn_play.setEnabled(true);
  312. isPlaying = false;
  313. }
  314. }
  315. }

andriod 播放mp4的更多相关文章

  1. video.js播放mp4文件

    HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...

  2. 关于Windows2008服务器设置MIME后仍然无法播放MP4的解决方法

    最近遇到了一个非常邪门的故障,重新安装了Windows2008服务器后 Mp4无法正常播放: 整个互联网中关于设置MP4的方法基本都是教你如何在IIS中设置MIME 本文讨论的不是如何教你设置MIME ...

  3. cocos2d-x 3.0 播放MP4视频

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=545 很久以前写的一个2dx播放 ...

  4. 解决html5中video标签无法播放mp4问题的办法

    这篇文章主要给大家介绍了关于解决html5中video标签无法播放mp4问题的办法,文中介绍的非常详细,相信会对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 最近发现了一个 ...

  5. 视频播放效果--video.js播放mp4文件

    HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...

  6. html5播放mp4视频代码

    1.nginx支持flv和mp4格式播放 默认yum安装nginx centos7安装nginx时候应该是默认安装nginx_mod_h264_streaming模块的 # nginx -V查看是否安 ...

  7. html制作简单框架网页二 实现自己的影音驿站 操作步骤及源文件下载 (可播放mp4、avi、mpg、asx、swf各种文件的视频播放代码)

    新增视频播放功能如下图: 左侧网页left.html代码如下: <meta charset="utf-8"> <body style="backgrou ...

  8. Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型

    转自原文 Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型 播放mp4格式的时候提示 Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型 原因是在IIS中 ...

  9. 在线播放mp4

    在线播放mp4 1.准备好支持再网页上播放的mp4格式 AVC(h264) 格式的mp4 2.用ckplayer控制播放 (1)到ckplayer下载js.如:http://www.ckplayer. ...

随机推荐

  1. GreenPlum学习笔记:split_part与string_to_array字符截取

    偶遇一个需求:想按某个指定符号分割之后,提取字符. 例如:tag = '休闲,娱乐,运动,玩耍',想提取"休闲"这个词. 方法一:string_to_array select st ...

  2. GUC-9 ReadWriteLock : 读写锁

    import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWrit ...

  3. Hive(一)Hive初识

    一 Hive 简介 什么是Hive 1.Hive 由 Facebook 实现并开源 2.是基于 Hadoop 的一个数据仓库工具 3.可以将结构化的数据映射为一张数据库表 4.并提供 HQL(Hive ...

  4. 百度Webuploader 大文件分片上传(.net接收)

    前阵子要做个大文件上传的功能,找来找去发现Webuploader还不错,关于她的介绍我就不再赘述. 动手前,在园子里找到了一篇不错的分片上传的帖子,参考之后,踏出了第一步.此文记录我这次实践的点滴,仅 ...

  5. Git 简史

    同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代.Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991 ...

  6. js constructor 和 instanceof

    说到这两个属性,那不得不说一下_proto_这个属性,通常这个属性是隐藏属性,是不允许被暴露的,而某些浏览器为了开发者能够很好的理解,而将这个属性暴露出来,比如Mozilla FireFox,这就是为 ...

  7. Android手机系统设置页面跳转

    android.provider.Settings. 1.   ACTION_ACCESSIBILITY_SETTINGS :    // 跳转系统的辅助功能界面 Intent intent = ne ...

  8. 一个人也可以建立 TCP 连接呢

    今天(恰巧是今天)看到有人在 SegmentFault 上问「TCP server 为什么一个端口可以建立多个连接?」.提问者认为 client 端就不能使用相同的本地端口了.理论上来说,确定一条链路 ...

  9. [ 转载 ] Java基础11--Java总结篇系列:Java泛型

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...

  10. requests爬取百度音乐

    使用requests爬取百度音乐,我想把当前热门歌手的音乐信息爬下来. 首先进行url分析,可以看到: 歌手网页: 薛之谦网页: 可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码: # -*- ...