1.MediaPlayer除了可以播放音乐外,还可以播放视频,但是使用MediaPlayer播放音乐时,没有提供图像输出界面,可以使用SurfaceView组件来显示视频画面,首先,必须在布局文件activity_main.xml文件中定义SurfaceView组件,第二步就是创建MediaPlayer对象,加载要播放的视频,第三步就是将所要播放的视频画面输出到SurfaceView,使用MediaPlayer对象的setDisplay()方法可以输出视频画面到SurfaceView,setDisplay()方法的格式为:mediaplayer.setDisplay(surfaceview.getHolder()); 里面带的参数是SurfaceView对象的getHolder()方法。第四步,调用MediaPlayer对象的play(),pause(),stop()分别播放,暂停,停止视频的播放。

2.接下来新建一个安卓项目,项目名称为VideoTest1,这个例子将演示如何把视频放在后台服务,进行播放,暂停,停止视频播放,首先,打开项目下res目录下的layout目录下的activity_main.xml文件,详细看代码:

activity_main.xml文件代码:

<LinearLayout xmlns: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" ><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/textview"android:textColor="#9999CC"android:textSize="21sp" /><!-- 定义SurfaceView组件 --><SurfaceViewandroid:id="@+id/surfaceView1"android:layout_width="match_parent"android:layout_height="380dp"android:keepScreenOn="true" /><!-- 在水平线性布局里 定义3个按钮组件,分别为播放,暂停,停止,退出按钮 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_vertical|center_horizontal"android:orientation="horizontal" ><Buttonandroid:id="@+id/play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click"android:text="@string/play" /><Buttonandroid:id="@+id/pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click"android:text="@string/pause" /><Buttonandroid:id="@+id/stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click"android:text="@string/stop" /><Buttonandroid:id="@+id/finish"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click"android:text="@string/finish" /></LinearLayout></LinearLayout>

布局后的效果如下图所示:

3.接着先在项目的src目录下新建一个包,这里我新建的包名为com.example.service,再在这个包下新建一个类,类名为ServiceTest,把视频播放的操作放到后台服务去,在打开另一个包下的MainActivity.java文件:

首先附上MainActivity.java文件的代码:

package com.example.videotest1;import com.example.service.ServiceTest;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;public class MainActivity extends Activity {public static SurfaceView sv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sv = (SurfaceView) findViewById(R.id.surfaceView1);// 获得SurfaceView控件}/**点击那4个按钮后触发的事件 */public void click(View v) {Intent intent = new Intent(MainActivity.this, ServiceTest.class);int op = -1;// 定义一个中间变量switch (v.getId()) {case R.id.play:op = 1;Toast.makeText(MainActivity.this, "视频正在播放...", Toast.LENGTH_SHORT).show();break;case R.id.pause:op = 2;Toast.makeText(MainActivity.this, "视频暂停播放...", Toast.LENGTH_SHORT).show();break;case R.id.stop:op = 3;Toast.makeText(MainActivity.this, "视频停止播放...", Toast.LENGTH_SHORT).show();break;case R.id.finish:if (intent != null) {stopService(intent);}finish();break;default:break;}Bundle bundle = new Bundle();// 声明一个Bundle对象并实例化bundle.putInt("middle", op);// 把中间变量op放置到middle这个键intent.putExtras(bundle);// 用intent把bundle放入进去startService(intent);// 开始服务}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

ServiceTest.java文件的代码:

package com.example.service;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.IBinder;public class ServiceTest extends Service {public static MediaPlayer player;// 声明MediaPlayer对象@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}// 创建服务@Overridepublic void onCreate() {// TODO Auto-generated method stubif (player == null) {try {player = new MediaPlayer();//实例化MediaPlayer对象player.setDataSource("/sdcard/wf2.mp4");// 设置要播放的视频player.setLooping(false);// 设置视频不循环播放super.onCreate();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}// 开始服务@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubBundle bundle = intent.getExtras();// 获得从MainActivity传来的bundle对象int op = bundle.getInt("middle");// 获得从MainActivity.java里传递过来的opswitch (op) {case 1:// 当op为1,即点击了播放按钮play();// 调用play()方法break;case 2:// 当op为2,即点击了暂停按钮pause();// 调用pause()方法break;case 3:// 当op为3,即点击了停止按钮stop();// 调用stop()方法break;default:break;}return super.onStartCommand(intent, flags, startId);}// 播放视频play()方法private void play() {// TODO Auto-generated method stubif (player != null && !player.isPlaying()) {player.setDisplay(com.example.videotest1.MainActivity.sv.getHolder());//把视频画面显示出来try {player.prepare();//预加载视频} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}player.start();// 开始播放音乐}}private void pause() {// TODO Auto-generated method stubif (player != null && player.isPlaying()) {player.pause();// 暂停视频的播放}}private void stop() {// TODO Auto-generated method stubif (player != null) {player.seekTo(0);//如果点击播放按钮的话会从头播放player.stop();// 停止音乐的播放}}@Overridepublic void onDestroy() {// TODO Auto-generated method stubif (player != null) {player.stop();//停止播放视频player.release();// 释放资源player = null;}super.onDestroy();}
}

4.接下来附上字符串资源文件strings.xml的代码:

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="app_name">VideoTest1</string><string name="hello_world">Hello world!</string><string name="action_settings">Settings</string><string name="textview">播放一首简单的视频,欢迎欣赏!</string><string name="play">播放</string><string name="pause">暂停</string><string name="stop">停止</string><string name="finish">退出</string>
</resources>

5.这里最容易忘记的一步,就是我们把播放视频的操作放在Service后台服务里面,必须在AndroidManifest.xml文件声明这个服务类,即 <service android:name="com.example.service.ServiceTest" />这一行,属性可自己添加:

AndroidManifest.xml文件代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.videotest1"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="19" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.example.videotest1.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name="com.example.service.ServiceTest" /></application><!-- 添加读写sd卡的权限--><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>

6.这样就把代码写完了,模拟器不能显示视频画面,所以用真机测试,真机测试很简单,用手机数据线连接你的计算机,打开手机设置,开发者选项里面有个usb调试,手机不同那个地方也不同,我的Android 2.3版本的,比较低,没钱买好手机,打开设置,有个应用程序,点击后选择开发,勾选usb调试即可,之后安装驱动连接到计算机之后,还必须把你的视频文件放到相对应的真实手机里面,这里我直接放在sdcard下,然后部署该项目到你的真机里面,打开界面后,点击播放按钮视频画面就出来了,点击暂停按钮视频暂停播放,点击停止按钮后停止播放,点击退出按钮停止服务,关闭该界面,这里就没附上图了,经本人亲自测试,可成功播放视频,并显示画面!

7.以上就是全部内容,仅供学习参考,写得不好,请见谅,如有错误请指出,谢谢!



Android之使用MediaPlayer和SurfaceView组件播放一个简单的视频相关推荐

  1. Android之使用VideoView组件播放一个简单的视频

    1.在Android开发中,提供了VideoView组件用来播放视频文件.首先,要使用这个组件来播放视频,必须在布局文件下添加VideoView组件,然后再到Activity里获取这个组件,然后调用这 ...

  2. 利用递归组件实现一个简单的树组件(vue3)

    1. 简言 闲来无事不从容,睡觉东窗日已红. 万物静观皆自得,四时佳兴与认同. 最近学习vue3组件的时候实现了一个简单的树组件.话不多说,直接上代码. 2.效果 这个数组件实现了展开.选中和选择三个 ...

  3. android-实现一个简单的视频弹幕,Android已死

    android:id="@+id/edit_text" android:layout_width="0dp" android:layout_height=&qu ...

  4. android用kotlin制作计算器,使用Kotlin做一个简单计算器

    样式如下图: 1.布局文件: xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http: ...

  5. 用vue element-ui分页组件构建一个简单的分页 ( 超详细 )

    element-ui分页组件: 以下代码都是干货,欢迎大家互相评论学习 方法一 数据绑在div上: <template> <div><div v-for="(v ...

  6. Android开发中父类与子类通讯的一个简单实现

    在给出解决方案之前,提出一个问题:Android开发中如何将父类的改变及时通知给子类? 好吧,开始抓耳挠腮,可算是找出了解决方案: 1.在子类内注册父类的监听器 2.通过广播接收者(Broadcast ...

  7. html5 点一个按钮,播放一个相应的视频

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Android动态日志,一个简单的Android日志类

    Android自带的日志类不支持显示文件名和行号,调试时很不方便.而第三方日志库往往又太重.所以自己对Android自带的日志类做了一个简单的封装,主要是调试时使用,不考虑日志丢失和性能问题.日志的输 ...

  9. h5播放m3u8格式的视频

    前提: 最近有个需求需要 h5界面 播放一个1G的视频,害怕卡顿 解决方式: 用视频切片的方式解决 操作验证 我们先来一个m3u8 格式的视频文件 随便找一个视频文件,按照这个操作 我们就成功得到了 ...

最新文章

  1. idea缩写快捷键_IDEA快捷键大全 快速页面重构
  2. 【失败的尝试】C++中使用string进行switch判断
  3. NS3_Tutorial 中文版: 第一章 简介 第二章 资源
  4. 解决Maven打包怪异异常:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.6:resource...
  5. Redis可视化工具 Redis Desktop Manager
  6. OpenCV OMZ MTCNN人脸检测的实例(附完整代码)
  7. 数据类型转换_强制转换
  8. iOS 定位功能的实现
  9. 新手关于如何看编程经典书的一些疑惑?
  10. 计算机等级和计算应用区别,2020上半年软考问答:计算机等级考试和软考有什么区别?...
  11. 国外大牛开发者创造出Siri第三方服务器
  12. 创投“黑帮”,必须的
  13. 亚泰盛世携NB物理实验邀你莅临第66届中国教育装备展
  14. matlab 复化求积公式,matlab复化Simpson求积公式计算数值积分
  15. 软件测试面试题:所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗?
  16. 插值法(最邻近,双线性,双三次),图像放缩 python实现
  17. WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK!的分析
  18. 仿最新BiliBili客户端(已开源)
  19. 7-20 打印九九口诀表(15 分)
  20. Coursera Algorithm Ⅱ week4 编程作业 Boggle

热门文章

  1. (三)、dubbo环境的搭建
  2. 微服务写的最全的一篇文章
  3. 进入快速通道的委托(深入理解c#)
  4. 微信支付get_brand_wcpay_request:fail
  5. C#网络版斗地主——出牌权限的传递
  6. axios从入门到源码分析 -http-xhr
  7. Linux内核(1)--从开机到main函数
  8. input Type
  9. 7-172 抓老鼠啊~亏了还是赚了? (20 分)
  10. 面试题 01.01. 判定字符是否唯一