安卓使用MediaPlayer和SurfaceView播放视频
来源:互联网 发布:大数据在传媒界的应用 编辑:程序博客网 时间:2024/04/30 17:09
效果
代码
package com.javen.devicemange.CrazyOne.media;import android.Manifest;import android.media.AudioManager;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Environment;import android.support.annotation.Nullable;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.Button;import com.javen.devicemange.R;import java.io.File;import java.io.IOException;/** * Created by Administrator on 2017/2/27 0027. * 使用MediaPlayer和SurfaceView播放视频 */public class SurfaceViewPlayVideo extends AppCompatActivity implements View.OnClickListener { private SurfaceView surface_view; private Button play; private Button pause; private Button stop; private MediaPlayer mediaPlayer; private int position; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.surfaceviewplayvideo); initView(); requestPermission(); mediaPlayer = new MediaPlayer(); //设置surface自己不管理的缓冲区 surface_view.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //设置播放时打开屏幕 surface_view.getHolder().setKeepScreenOn(true); //设置监听 surface_view.getHolder().addCallback(new SurfaceListner()); } private void requestPermission() { String[] needPermission = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, }; ActivityCompat.requestPermissions(this, needPermission, 1); } private void initView() { surface_view = (SurfaceView) findViewById(R.id.surface_view); play = (Button) findViewById(R.id.play); pause = (Button) findViewById(R.id.pause); stop = (Button) findViewById(R.id.stop); play.setOnClickListener(this); pause.setOnClickListener(this); stop.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { //播放 case R.id.play: try { playMediaPlayer(); } catch (IOException e) { e.printStackTrace(); Log.d("GsonUtils", "Exception=" + e.toString()); } break; //暂停 case R.id.pause: if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } else { mediaPlayer.start(); } break; //停止 case R.id.stop: if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } break; } } private class SurfaceListner implements SurfaceHolder.Callback { @Override public void surfaceCreated(SurfaceHolder holder) { Log.d("GsonUtils", "surfaceCreated_position=" + position); if (position > 0) { Log.d("GsonUtils", "seekTo="); try { playMediaPlayer(); //跳到上次继续播放 mediaPlayer.seekTo(position); position = 0; } catch (Exception e) { e.printStackTrace(); Log.d("GsonUtils", "Exception=" + e.toString()); } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } } private void playMediaPlayer() throws IOException { mediaPlayer.reset(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //获取sd卡根目录下的test.mp4文件 File file = new File(Environment.getExternalStorageDirectory().toString() + "/test.mp4"); if (file.exists()) { mediaPlayer.setDataSource(file.getAbsolutePath()); //把视频画面输出到surfaceView mediaPlayer.setDisplay(surface_view.getHolder()); mediaPlayer.prepare(); mediaPlayer.start(); } } //当打开其它activity或者最小化回到桌面时候 @Override protected void onPause() { if (mediaPlayer.isPlaying()) { //保存视频播放的位置 position = mediaPlayer.getCurrentPosition(); mediaPlayer.stop(); } super.onPause(); } @Override protected void onDestroy() { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } mediaPlayer.release(); super.onDestroy(); }}
sd卡mp4的位置
布局xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="300dp" /> <Button android:id="@+id/play" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="play"/> <Button android:id="@+id/pause" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="pause"/> <Button android:id="@+id/stop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="stop"/></LinearLayout>
AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
。。。
0 0
- 安卓使用MediaPlayer和SurfaceView播放视频
- 安卓本地视频播放SurfaceView+MediaPlayer
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView播放视频
- Android:使用MediaPlayer和SurfaceView播放视频
- 使用MediaPlayer和SurfaceView结合播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用SurfaceView和MediaPlayer播放视频
- 使用MediaPlayer和SurfaceView播放视频
- 使用SurfaceView&MediaPlayer播放视频
- SQLServer 中发布与订阅
- ConcurrentHashMap总结
- 第十一讲项目四 玩数字
- 自定义函数名和命名空间存在的函数名同名的解决方法
- escape()、encodeURI()、encodeURIComponent()区别详解
- 安卓使用MediaPlayer和SurfaceView播放视频
- git学习笔记
- 搜索的的原理代码
- Loadrunner11的一些总结
- java Servlet(二)生命周期
- 最短路径(弗洛伊德算法)
- Output Un-compensite Point Feature to TEXT file/将未补偿测量点输出到文本文件的宏
- 自定义View-之Path类
- 第五届校内选拔javaC组-第五题位平方和