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文件代码:
布局后的效果如下图所示:
3.接着先在项目的src目录下新建一个包,这里我新建的包名为com.example.service,再在这个包下新建一个类,类名为ServiceTest,把视频播放的操作放到后台服务去,在打开另一个包下的MainActivity.java文件:
首先附上MainActivity.java文件的代码:
ServiceTest.java文件的代码:
4.接下来附上字符串资源文件strings.xml的代码:
5.这里最容易忘记的一步,就是我们把播放视频的操作放在Service后台服务里面,必须在AndroidManifest.xml文件声明这个服务类,即 <service android:name="com.example.service.ServiceTest" />这一行,属性可自己添加:
AndroidManifest.xml文件代码:
6.这样就把代码写完了,模拟器不能显示视频画面,所以用真机测试,真机测试很简单,用手机数据线连接你的计算机,打开手机设置,开发者选项里面有个usb调试,手机不同那个地方也不同,我的Android 2.3版本的,比较低,没钱买好手机,打开设置,有个应用程序,点击后选择开发,勾选usb调试即可,之后安装驱动连接到计算机之后,还必须把你的视频文件放到相对应的真实手机里面,这里我直接放在sdcard下,然后部署该项目到你的真机里面,打开界面后,点击播放按钮视频画面就出来了,点击暂停按钮视频暂停播放,点击停止按钮后停止播放,点击退出按钮停止服务,关闭该界面,这里就没附上图了,经本人亲自测试,可成功播放视频,并显示画面!
7.以上就是全部内容,仅供学习参考,写得不好,请见谅,如有错误请指出,谢谢!
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.以上就是全部内容,仅供学习参考,写得不好,请见谅,如有错误请指出,谢谢!
相关文章推荐
- Android之使用VideoView组件播放一个简单的视频
- 28、从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- android中使用MediaPlayer和SurfaceView播放视频
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——2.2 使用GLSurfaceView和MediaPlayer播放一个平面视频(中)
- 4.10 从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——2.2 使用GLSurfaceView和MediaPlayer播放一个平面视频(中)
- Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——2.1 使用GLSurfaceView和MediaPlayer播放一个平面视频(上)
- Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
- Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- 从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- Android:使用MediaPlayer和SurfaceView播放视频
- Android里面使用MediaPlayer通过SurfaceView播放视频的示例
- Android 使用MediaPlayer与SurfaceView进行视频播放
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——2.3 使用GLSurfaceView和MediaPlayer播放一个平面视频(下)
- 从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——2.3 使用GLSurfaceView和MediaPlayer播放一个平面视频(下)
- MediaPlayer简单使用,绑定surfaceView实现播放视频的功能
- 从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- Android使用SurfaceView播放视频 简单介绍