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

时间:2022-12-01 11:58:28

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" >

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/textview"
android:textColor="#9999CC"
android:textSize="21sp" />

<!-- 定义SurfaceView组件 -->

<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="match_parent"
android:layout_height="380dp"
android:keepScreenOn="true" />

<!-- 在水平线性布局里 定义3个按钮组件,分别为播放,暂停,停止,退出按钮 -->

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:orientation="horizontal" >

<Button
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="@string/play" />

<Button
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="@string/pause" />

<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="@string/stop" />

<Button
android:id="@+id/finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="@string/finish" />
</LinearLayout>

</LinearLayout>

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

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

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;

@Override
protected 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);// 开始服务
}

@Override
public 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;
}

@Override
public 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对象

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}

// 创建服务
@Override
public void onCreate() {
// TODO Auto-generated method stub
if (player == null) {
try {
player = new MediaPlayer();//实例化MediaPlayer对象
player.setDataSource("/sdcard/wf2.mp4");// 设置要播放的视频
player.setLooping(false);// 设置视频不循环播放
super.onCreate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

// 开始服务
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras();// 获得从MainActivity传来的bundle对象
int op = bundle.getInt("middle");// 获得从MainActivity.java里传递过来的op
switch (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 stub
if (player != null && !player.isPlaying()) {
player.setDisplay(com.example.videotest1.MainActivity.sv
.getHolder());//把视频画面显示出来
try {
player.prepare();//预加载视频
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
player.start();// 开始播放音乐
}
}

private void pause() {
// TODO Auto-generated method stub
if (player != null && player.isPlaying()) {
player.pause();// 暂停视频的播放
}
}

private void stop() {
// TODO Auto-generated method stub
if (player != null) {
player.seekTo(0);//如果点击播放按钮的话会从头播放
player.stop();// 停止音乐的播放
}
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
if (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-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android: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.以上就是全部内容,仅供学习参考,写得不好,请见谅,如有错误请指出,谢谢!