一、布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="#FFFFFF"
  6. android:orientation="vertical" >
  7.  
  8. <TextView
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/filename" />
  12.  
  13. <EditText
  14. android:id="@+id/filename"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:text="11.RMVB" />
  18.  
  19. <LinearLayout
  20. android:layout_width="fill_parent"
  21. android:layout_height="wrap_content"
  22. android:orientation="horizontal" >
  23.  
  24. <ImageButton
  25. android:id="@+id/play"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:src="@drawable/play" />
  29.  
  30. <ImageButton
  31. android:id="@+id/pause"
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:src="@drawable/pause" />
  35.  
  36. <ImageButton
  37. android:id="@+id/reset"
  38. android:layout_width="wrap_content"
  39. android:layout_height="wrap_content"
  40. android:src="@drawable/reset" />
  41.  
  42. <ImageButton
  43. android:id="@+id/stop"
  44. android:layout_width="wrap_content"
  45. android:layout_height="wrap_content"
  46. android:src="@drawable/stop" />
  47. </LinearLayout>
  48.  
  49. <SurfaceView
  50. android:id="@+id/surfaceView"
  51. android:layout_width="fill_parent"
  52. android:layout_height="240dip" />
  53.  
  54. </LinearLayout>

二、代码实现:

  1. package com.example.video;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6.  
  7. import android.R.integer;
  8. import android.app.Activity;
  9. import android.media.AudioManager;
  10. import android.media.MediaPlayer;
  11. import android.media.MediaPlayer.OnPreparedListener;
  12. import android.os.Bundle;
  13. import android.util.Log;
  14. import android.view.Menu;
  15. import android.view.SurfaceHolder;
  16. import android.view.SurfaceView;
  17. import android.view.View;
  18. import android.widget.EditText;
  19. import android.widget.ImageButton;
  20. import android.widget.Toast;
  21.  
  22. public class MainActivity extends Activity {
  23. private static final String TAG = "VideoActivity";
  24. private EditText filenameText;
  25. private SurfaceView surfaceView;
  26. private MediaPlayer mediaPlayer;
  27. private String filename;// 当前播放文件的名称
  28. private int position;// 记录播放位置
  29. private boolean pause=false;//是否被暂停
  30. private File file;
  31.  
  32. @Override
  33. public void onCreate(Bundle savedInstanceState) {
  34. super.onCreate(savedInstanceState);
  35. setContentView(R.layout.activity_main);
  36.  
  37. this.mediaPlayer = new MediaPlayer();
  38. this.filenameText = (EditText) this.findViewById(R.id.filename);
  39. this.surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
  40. ImageButton playButton = (ImageButton) this.findViewById(R.id.play);
  41. ImageButton pauseButton = (ImageButton) this.findViewById(R.id.pause);
  42. ImageButton resetButton = (ImageButton) this.findViewById(R.id.reset);
  43. ImageButton stopButton = (ImageButton) this.findViewById(R.id.stop);
  44.  
  45. ButtonClickListener listener = new ButtonClickListener();
  46. playButton.setOnClickListener(listener);
  47. pauseButton.setOnClickListener(listener);
  48. resetButton.setOnClickListener(listener);
  49. stopButton.setOnClickListener(listener);
  50.  
  51. /* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */
  52. this.surfaceView.getHolder().setType(
  53. SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  54. this.surfaceView.getHolder().setFixedSize(176, 144);// 设置分辨率
  55. //让屏幕高亮,不要锁频
  56. this.surfaceView.getHolder().setKeepScreenOn(true);
  57. this.surfaceView.getHolder().addCallback(new SurfaceListener());
  58. }
  59.  
  60. private class ButtonClickListener implements View.OnClickListener {
  61. @Override
  62. public void onClick(View v) {
  63. try {
  64. switch (v.getId()) {
  65. case R.id.play:// 来自播放按钮
  66. filename = filenameText.getText().toString();
  67. file=new File("/storage/sdcard0/Music",filename);
  68. if (file.exists()) {
  69. play(0);
  70. }else {
  71. Toast.makeText(getApplicationContext(), "文件不存在", Toast.LENGTH_LONG).show();
  72. }
  73. break;
  74.  
  75. case R.id.pause:// 来自暂停按钮
  76. if (mediaPlayer.isPlaying()) {
  77. mediaPlayer.pause();
  78. pause=true;
  79. } else {
  80. if (pause) {
  81. mediaPlayer.start();
  82. pause=false;
  83. }
  84. }
  85. break;
  86.  
  87. case R.id.reset:// 来自重新播放按钮
  88. if (mediaPlayer.isPlaying()) {
  89. mediaPlayer.seekTo(0);
  90. }else {
  91. if(file!=null){
  92. play(0);
  93. }
  94. }
  95. break;
  96. case R.id.stop:// 来自停止按钮
  97. if (mediaPlayer.isPlaying())
  98. mediaPlayer.stop();
  99. break;
  100. }
  101. } catch (Exception e) {
  102. Log.e(TAG, e.toString());
  103. }
  104. }
  105. }
  106.  
  107. /**
  108. * 播放视频
  109. */
  110. private void play(int position) throws IOException {
  111. mediaPlayer.reset();
  112. //mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  113. mediaPlayer.setDataSource(file.getAbsolutePath());// 设置需要播放的视频
  114. mediaPlayer.setDisplay(surfaceView.getHolder());// 把视频画面输出到SurfaceView
  115. mediaPlayer.prepare();//进行缓冲处理,完成之后播放
  116. mediaPlayer.setOnPreparedListener(new PrepareListener(position));
  117.  
  118. }
  119. private final class PrepareListener implements OnPreparedListener{
  120. private int position;
  121. public PrepareListener(int position) {
  122. this.position=position;
  123. }
  124.  
  125. //当缓冲完成之后就会调用onPrepared方法
  126. @Override
  127. public void onPrepared(MediaPlayer mp) {
  128. mediaPlayer.start();//播放
  129. if (position>0) {
  130. mediaPlayer.seekTo(position);
  131. }
  132. }
  133. }
  134.  
  135. private class SurfaceListener implements SurfaceHolder.Callback {
  136. @Override
  137. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  138. int height) {
  139. }
  140.  
  141. //当画面再次回到前台时调用
  142. @Override
  143. public void surfaceCreated(SurfaceHolder holder) {// 方法在onResume()后被调用
  144. Log.i(TAG, "surfaceCreated()");
  145. if (position > 0 && filename != null) {
  146. try {
  147. play(position);
  148. position = 0;
  149. } catch (Exception e) {
  150. Log.e(TAG, e.toString());
  151. }
  152. }
  153. }
  154.  
  155. @Override
  156. public void surfaceDestroyed(SurfaceHolder holder) {
  157. if (mediaPlayer.isPlaying()) {
  158. position = mediaPlayer.getCurrentPosition();// 得到播放位置
  159. mediaPlayer.stop();
  160. }
  161. Log.i(TAG, "surfaceDestroyed()");
  162. }
  163. }
  164.  
  165. @Override
  166. protected void onDestroy() {
  167. if (mediaPlayer.isPlaying())
  168. mediaPlayer.stop();
  169. mediaPlayer.release();
  170. super.onDestroy();
  171. }
  172.  
  173. @Override
  174. public boolean onCreateOptionsMenu(Menu menu) {
  175. getMenuInflater().inflate(R.menu.main, menu);
  176. return true;
  177. }
  178.  
  179. }

Android学习笔记_25_多媒体之在线播放器的更多相关文章

  1. Android学习笔记_24_多媒体MediaPlayer对象之音乐播放器与SoundPool声音池

    一.MediaPlayer对象常用方法介绍: MediaPlayer mediaPlayer = new MediaPlayer(); if (mediaPlayer.isPlaying()) { m ...

  2. Android学习笔记进阶十一图片动画播放(AnimationDrawable)

    大家平时见到的最多的可能就是Frame动画了,Android中当然也少不了它.它的使用更加简单,只需要创建一个 AnimationDrawabledF对象来表示Frame动画,然后通过addFrame ...

  3. Android学习笔记_27_多媒体之视频刻录

    一.配置文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android= ...

  4. Android学习笔记_26_多媒体之拍照

    一.配置文件: 需要引入摄像头权限,sdcard读写权限. <?xml version="1.0" encoding="utf-8"?> <m ...

  5. JS学习笔记(6)--音乐播放器

    说明(2017.3.15): 1. lrc.js里面存储LRC歌词的格式的数组,获取里面的时间轴,转为秒数. 2. 通过audio.currentTime属性,setinterval每秒获取歌曲播放的 ...

  6. udacity android 学习笔记: lesson 4 part b

    udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  7. 【转】 Pro Android学习笔记(七七):服务(2):Local Service

    目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...

  8. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  9. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

随机推荐

  1. jenkins~管道Pipeline里使用公用类库

    Pipeline使用了groovy语法,同时可以使用所有jenkins插件在groovy里进行调用,可以说通过UI可以实现的功能使用pipeline也可以实现,这一点我在上一篇文章里已经说明,今天主要 ...

  2. TOJ 1717 WOJ

    描述 Alex likes solving problems on WOJ (http://acm.whu.edu.cn/oak). As we all know, a beautiful ballo ...

  3. Basic Data Structures and Algorithms in the Linux Kernel--reference

    http://luisbg.blogalia.com/historias/74062 Thanks to Vijay D'Silva's brilliant answer in cstheory.st ...

  4. 如何优雅地进行错误处理(clean code阅读笔记之六)

    错误处理是十分必要的,但是如果对错误处理使用不当则会让代码变得十分臃肿,让阅读者看不清代码的逻辑,更严重的是,这也会让程序变得十分脆弱.本文中将列出一些使用错误处理的技巧,帮助你写出既简洁又健壮的代码 ...

  5. [转]ASP.NET Core Exception Filters and Resource Filters

    本文转自:https://damienbod.com/2015/09/30/asp-net-5-exception-filters-and-resource-filters/ This article ...

  6. 实现JFileChooser的多种文件类型限制(设置过滤器)

    使用时直接调用方法. // 多类型时使用 public void FileFilter(JFileChooser F) { String[][] fileNames = { { ".java ...

  7. 如何更新maven需要的jar包

    第一次使用maven,检出项目生成时出现缺少xxx.jar,目录在C盘下: 拿mybatis-spring-1.2.2.jar来说,发现在C:\Users\Administrator\.m2\repo ...

  8. 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)

    当我们从网络中获取一个URL的图片我们要存储到本地或者是私有的云时,我们可以这样操作  把url中的图片文件下载到本地(或者上传到私有云中)  public String uploadUrlToOss ...

  9. Java程序员应该知道的linux命令

    1.查看Java进程:ps -ef|grep java,ps auxf|grep jva; 2.杀死所有Java进程: pkill java, kill -9 进程ID: 3.进入目录:cd /usr ...

  10. Celery-------项目目录

    在实际应用中Celery的目录是有规则的 要满足这样的条件才可以 目录Celery_task这个名字可以随意,但是这个目录下一定要有一个celery.py这个文件 from celery import ...