您的位置:首页 > 移动开发 > Android开发

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

2014-12-22 21:44 776 查看
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>

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




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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐