Android 播放SD卡视频 Demo
来源:互联网 发布:湘妹子的特点 知乎 编辑:程序博客网 时间:2024/05/29 13:37
Android播放视频有好几种方式,比如VideoView,SurfaceView,Android自带的播放器,第三方播放器(比如vitamio等等 之前毕设用过,挺不错)
公司需要编写相关的测试代码,简单研究了一下。做做笔记,备忘。(注:部分代码来源于互联网)
使用VideoView播放视频:
布局文件:很简单,VideoView+几个button,用线性布局简单控制一下
<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" tools:context=".MainActivity" > <VideoView android:id="@+id/videoview" android:layout_width="fill_parent" android:layout_height="200dp" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/play" android:text="play" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <Button android:id="@+id/pause" android:text="pause" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <Button android:id="@+id/replay" android:text="replay" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout></LinearLayout>
继续操作之前,先在SD卡根目录放置一个视频文件1.mp4(先使用固定路径,之后再使用动态设置的路径)
下面继续写MainActivity:
public class MainActivity extends Activity implements OnClickListener { private static final String TAG = "MainActivity"; VideoView video; Button play; Button pause; Button replay; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); video = (VideoView) findViewById(R.id.videoview); play = (Button) findViewById(R.id.play); pause = (Button) findViewById(R.id.pause); replay = (Button) findViewById(R.id.replay); play.setOnClickListener(this); pause.setOnClickListener(this); replay.setOnClickListener(this); logcat("onCreate"); initVediopath(); } @Override protected void onDestroy() { super.onDestroy(); if (null != video) { video.suspend(); } } private void initVediopath() { logcat("initVediopath"); File file = new File(Environment.getExternalStorageDirectory(), "1.mp4"); logcat("" + Environment.getExternalStorageDirectory()); if (file.exists()) { logcat("setPath"); video.setVideoPath(file.getPath()); } else { Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show(); logcat("file not exsit"); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.play: if (!video.isPlaying()) { video.start(); } break; case R.id.pause: if (video.isPlaying()) { video.pause(); } break; case R.id.replay: if (video.isPlaying()) { video.resume(); } break; default: break; } } public void logcat(String log) { Log.i(TAG, log); }}
MainActivity也很简单,findv的iew,设置listener,设置视频路径,Activity销毁时将VideoView挂起。按钮 的点击事件也就简单的调用VideoView的相关方法。
最后别忘了添加读取SD卡的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
使用 SurfaceView+MediaPlayer播放视频
MediaPlayer控制视频,SurfaceView负责显示(个人理解,有误请帮忙指出,另外此部分代码大部分参考某篇博客,但是暂时找不到原文了。。。)
布局文件:和上面类似,不过把VideoView换成SurfaceView,另外多了几个button
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:weightSum="1" android:orientation="vertical" > <SurfaceView android:id="@+id/surfaceVIew" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="0.15" tools:context=".MainActivity" /> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="0.85"> <Button android:id="@+id/btn_play" android:text="开始" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_pause" android:text="暂停" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_stop" android:text="停止" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_low" android:text="调低" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_hight" android:text="调高" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout></LinearLayout>
与上面一样,先使用死路径,在SD卡根目录放置1.mp4。同时先把访问SD卡的权限加上吧。
主Activity:
和上面的步骤类似,不过稍微复杂些。主要是SurfaceView有三个callback
surfaceCreated
surfaceChanged
surfaceDestroyed
在SurfaceView创建时做一些视频的初始化操作。
在SurfaceView销毁时释放资源
横竖屏的地方暂时可以忽略。大体上和上面还是一样的。
public class MainActivity extends Activity implements OnClickListener { /* 功能按钮 */ private Button btn_play, btn_pause, btn_stop, btn_low, btn_height; /* SurfaceView */ private SurfaceView mSurfaceView; /* 播放视频对象 */ private MediaPlayer mediaPlayer; /* 系统声音 */ private AudioManager audioManager; /* 记录播放位置 */ private int position; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 设置窗口无title */ requestWindowFeature(Window.FEATURE_NO_TITLE); /* 全屏显示 */ this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); findViews(); setListeners(); mediaPlayer = new MediaPlayer(); setSurfaceView(); } // 横竖屏切换时的处理 @Override protected void onSaveInstanceState(Bundle outState) { if (mediaPlayer != null && mediaPlayer.isPlaying()) {// 如果在播放的时候切换屏幕则保存当前观看的位置 outState.putInt("position", mediaPlayer.getCurrentPosition()); } super.onSaveInstanceState(outState); } // 横竖屏切换后的处理 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { if (savedInstanceState.containsKey("position")) { position = savedInstanceState.getInt("position");// 取得切换屏幕时保存的位置 } super.onRestoreInstanceState(savedInstanceState); } /* 实例化UI */ private void findViews() { btn_play = (Button) findViewById(R.id.btn_play); btn_pause = (Button) findViewById(R.id.btn_pause); btn_stop = (Button) findViewById(R.id.btn_stop); btn_low = (Button) findViewById(R.id.btn_low); btn_height = (Button) findViewById(R.id.btn_hight); mSurfaceView = (SurfaceView) findViewById(R.id.surfaceVIew); audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); } /* 为5个按钮设置监听 */ private void setListeners() { btn_play.setOnClickListener(this); btn_pause.setOnClickListener(this); btn_stop.setOnClickListener(this); btn_low.setOnClickListener(this); btn_height.setOnClickListener(this); } /* 播放视频 */ private void playMedia() { /* 初始化状态 */ mediaPlayer.reset(); /* 设置声音流类型 */ mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); /* 设置mp3\mp4加载路径 */ File file = new File(Environment.getExternalStorageDirectory(), "1.mp4"); try { mediaPlayer.setDataSource(file.getAbsolutePath()); // 缓冲 mediaPlayer.prepare(); // 开始播放 mediaPlayer.start(); // 具体位置 Log.i("position", position + "------"); mediaPlayer.seekTo(position); // 视频输出到View mediaPlayer.setDisplay(mSurfaceView.getHolder()); // 重置位置为0 position = 0; } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* 设置surfaceView视图 */ private void setSurfaceView() { // creates a "push" surface mSurfaceView.getHolder().setType( SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 设置事件,回调函数 mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { /* SurfaceView创建时 */ @Override public void surfaceCreated(SurfaceHolder holder) { if (position > 0) { playMedia(); position = 0; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } /* SurfaceView销毁视图 */ @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } /* Activity销毁时停止播放,释放资源。不做这个操作,即使退出,还是能听到视频的声音 */ mediaPlayer.release(); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_play:// 播放 if (mediaPlayer != null && mediaPlayer.isPlaying()) { return; } else { playMedia(); } break; case R.id.btn_pause:// 暂停 if (mediaPlayer != null && mediaPlayer.isPlaying()) { position = mediaPlayer.getCurrentPosition(); mediaPlayer.pause(); } else { return; } break; case R.id.btn_stop:// 停止 if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); position = 0; } else { return; } break; case R.id.btn_low:// 调小音量 // 获取当前的音乐音量 int volume = audioManager .getStreamVolume(AudioManager.STREAM_MUSIC); Log.v("Volume", "volume" + volume); // 音量>0 if (volume > 0) { audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0); } else { return; } break; case R.id.btn_hight:// 调大音量 volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); // 音量<100 if (volume < audioManager .getStreamMaxVolume(AudioManager.STREAM_MUSIC)) { audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0); } else { return; } break; } }}
下一篇说下如何扫描SD卡的视频文件,并会附上本文中的案例和一个播放MP3的demo
- Android 播放SD卡视频 Demo
- android视频播放简单demo
- Android网络视频播放器DEMO
- Android 播放网络视频的一个demo
- android 视频+音频播放器Demo
- android 视频+音频播放器Demo
- android 一个视频播放的demo
- HTML5 视频播放demo
- ios--视频播放demo
- ios播放视频demo
- flv视频播放demo
- Android MediaPlayer+SurfaceView播放视频(附Demo)
- 基于VLC框架的Android视频播放器Demo
- VideoView播放SD卡上视频的例子
- 插拔sd卡引起视频播放或流媒体 退出
- VideoView 播放sd卡目录下视频的路径问题
- ios 视频播放代码Demo
- iOS视频播放Demo VideoPlayerDemo
- 异常,异常的使用,Throw和Throws的区别,
- 菜鸟笔记#2.获取注册码
- 1017. A除以B (20)-大整数运算
- 微信支付商户号的调研
- Hbase笔记二之Hbase Shell基本操作
- Android 播放SD卡视频 Demo
- 基本概念
- 水仙花数
- E. Mahmoud and a xor trip----树形DP
- python中assert的使用
- Maven 菜鸟教程 5 常用插件配置
- Android contentProvider 访问手机联系人的的两种方法
- [机器学习][1]--PLA算法
- 蓝桥杯-第七届省赛javaC组- 骰子游戏