Android中的3中视频播放方式:
A自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
BVideoView播放。在布局文件中使用VideoView结合MediaController来实现对其控制。
C使用MediaPlayer类和SurfaceView来实现,这种方式很灵活。
前两种都比较简单和理解,今天进SurfaceView在线播放视频来进行讲解。
1.首先,来看一下布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context="com.rocky.utouu.PlayerActivity"> <SurfaceView android:id="@+id/vedio_surfaceview" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:id="@+id/play_back" android:layout_width="100dp" android:layout_height="40dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="20dp" android:layout_marginRight="20dp" android:background="@drawable/playshow_shape" android:gravity="center" android:text="返回" android:textColor="#fff" android:textSize="17sp" android:visibility="gone" /> </RelativeLayout>没什么好说的,就是个surfaceView和一个返回按钮,我没给按钮添加以一些自定义的背景样式
2.我们是来进行视屏横屏全屏播放,那么就要设置隐藏标题栏,因为它的确是太丑了,有能力的话可以去使用google推出的design包下的Toolbar来自定义自己的标题栏
<!-- 设置没有标题栏和title--> <item name="android:windowActionBar">false</item> <item name="android:windowNoTitle">true</item>清单文件中设置Activity为横屏,还有要添加网络访问权限,这里就不上代码了
<!-- s视屏横屏播放--> <activity android:name=".MainActivity" android:launchMode="singleTask" android:screenOrientation="landscape">...</activity>3.重点来了,一大堆代码来袭
MainActivity.java
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnVideoSizeChangedListener, SurfaceHolder.Callback, View.OnClickListener { private int mVideoWidth; private int mVideoHeight; private MediaPlayer mMediaPlayer; private SurfaceHolder holder; private String path; private boolean mIsVideoSizeKnown = false; private boolean mIsVideoReadyToBePlayed = false; private SurfaceView surfaceView; private TextView play_back; @Override protected void onCreate(Bundle savedInstanceState) { //设置全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //视频地址 path="http://api.utouu.com/video/mobile/1449825853853.mp4"; surfaceView = ((SurfaceView) findViewById(R.id.vedio_surfaceview)); play_back = ((TextView) findViewById(R.id.play_back)); play_back.setOnClickListener(this); holder = surfaceView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override protected void onResume() { //设置为横屏 if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); startVideoPlayback(); } super.onResume(); } @Override protected void onPause() { super.onPause(); releaseMediaPlayer(); doCleanUp(); } @Override protected void onDestroy() { super.onDestroy(); releaseMediaPlayer(); doCleanUp(); } @Override public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); Log.v("tag", " == ---ConfigurationChanged"); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.i("tag", "-------->surfareCreated开始播放"); playVideo(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i("tag", "------->surfaceChanged"); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.i("tag", "------->surfaceDestroyed"); } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { Log.i("tag", "----->缓冲" + percent + "%"); if (percent == 100) { Toast.makeText(this, "缓存完毕", Toast.LENGTH_SHORT).show(); } } @Override public void onCompletion(MediaPlayer mp) { Log.i("tag", "----->oncompletion"); Toast.makeText(this, "播放完毕", Toast.LENGTH_SHORT).show(); play_back.setVisibility(View.VISIBLE); } @Override public void onPrepared(MediaPlayer mp) { Log.i("tag", "----->onprepared"); mIsVideoReadyToBePlayed = true; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { Log.i("tag", "----->onVedioSizeChanged"); if (width == 0 || height == 0) { Log.e("tag", "invalid video width(" + width + ") or height(" + height + ")"); return; } mIsVideoSizeKnown = true; mVideoWidth = width; mVideoHeight = height; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } private void playVideo() { doCleanUp(); try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(path); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnVideoSizeChangedListener(this); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { Log.i("tag", "error: " + e.getMessage(), e); } } private void doCleanUp() { mVideoWidth = 0; mVideoHeight = 0; mIsVideoReadyToBePlayed = false; mIsVideoSizeKnown = false; } private void startVideoPlayback() { Log.v("tag", "-------->startVideoPlayback"); holder.setFixedSize(mVideoWidth, mVideoHeight); mMediaPlayer.start(); } private void releaseMediaPlayer() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } } @Override public void onClick(View v) { int itemid = v.getId(); switch (itemid) { case R.id.play_back: finish(); break; } } }
最后我们来看一下效果图吧
好了,具体的我在来补充,先去吃饭了,改天再战!