Android开发使用SurfaceView和Mediaplayer播放网络视频(功能齐全)

本文介绍如何利用SurfaceView和MediaPlayer在Android应用中播放网络视频。支持多种视频格式,并具备播放、暂停、拖动等基本功能及全屏切换、播放记录保存等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇播客主要说明如何使用SurfaceView和Mediaplayer来播放网络视频。

支持视频格式:实测支持的有mp3、mp4、rmvb、avi、3gp、flv……。

带有功能:播放、暂停、视频拖动,播放时长显示、全屏、恢复全屏、双击暂停/播放功能、保存播放记录继续播放等等。

界面运行效果如下:




主要代码如下:

1、activity_mainvideo.xml的内容如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:orientation="vertical"
    android:background="@color/bg_white" >

	<Button
            android:id="@+id/bt_playUrl1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="播放网络多媒体"
            android:visibility="gone" />	
    <RelativeLayout 
        android:id="@+id/rlayout_video"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        >
        
        <SurfaceView
	        android:id="@+id/sv"
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        
	        />
        <ImageView 
            android:id="@+id/image_clickplay_moren"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="center"
            android:src="@drawable/videoplayer_clickplay"
            />
        
        <ImageView 
            android:id="@+id/image_clickplay"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="center"
            android:src="@drawable/videoplayer_clickplay"
            android:visibility="gone"
            />
        <LinearLayout
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:layout_alignParentBottom="true"
	        android:orientation="horizontal" 
	        android:padding="10dp">
            
            <Button
	            android:id="@+id/bt_pause"
	            android:layout_width="30dp"
	            android:layout_height="30dp"
	            android:background="@drawable/videoplayer_pause"
	            android:layout_gravity="center_vertical"
	            android:layout_marginRight="10dp"/>
            <TextView 
                android:id="@+id/tv_currentProgress"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="9dp"
                android:text="00:00"
                android:textColor="@color/text_white"
                android:layout_gravity="center_vertical"
                />
            
            <SeekBar
		        android:id="@+id/seekBar"
		        android:layout_width="0dp"
		        android:layout_height="wrap_content" 
		        android:layout_weight="1"
		        android:layout_gravity="center_vertical"/>
            
            <TextView 
                android:id="@+id/tv_totalProgress"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="9dp"
                android:textColor="@color/text_white"
                android:layout_gravity="center_vertical"
                />
            
            <Button
	            android:id="@+id/bt_maxsize"
	            android:layout_width="25dp"
	            android:layout_height="25dp"
	            android:background="@drawable/videoplayer_maxsize"
	            android:layout_gravity="center_vertical"
	            android:layout_marginLeft="10dp"/>
            <Button
	            android:id="@+id/bt_minisize"
	            android:layout_width="25dp"
	            android:layout_height="25dp"
	            android:background="@drawable/videoplayer_minisize"
	            android:layout_gravity="center_vertical"
	            android:layout_marginLeft="10dp"
	            android:visibility="gone"/>
            
        </LinearLayout>
        
    </RelativeLayout>

</LinearLayout>

2、MainVideoActivity.java的主要代码如下:

主要实现以下的接口的相应方法:

OnClickListener, OnCompletionListener, OnPreparedListener, OnErrorListener,OnSeekBarChangeListener。

OnClickListener:处理点击事件。

OnCompletionListener:当视频播放完毕的时候的事件处理。

OnPreparedListener:当视频准备完成的事件处理。

OnSeekBarChangeListener:seekbar进度条的相关事件处理。

@Override
 public void onClick(View v) {
     switch (v.getId()) {
     case R.id.image_clickplay_moren:
         playUrl();
         iv_clickplay_moren.setVisibility(View.GONE);
         bt_pause.setBackgroundResource(R.drawable.videoplayer_play);
         break;
     case R.id.image_clickplay:
         if (mediaPlayer != null) {
             if (mediaPlayer.isPlaying()) {
                 mediaPlayer.pause();
                 //bt_pause.setText(STATE_CONTINUE);
                 videoPlayStateImageRefresh(true);
                 bt_pause.setBackgroundResource(R.drawable.videoplayer_pause);
             } else {
                 mediaPlayer.start();
                 //bt_pause.setText(STATE_PAUSE);
                 videoPlayStateImageRefresh(false);
                 bt_pause.setBackgroundResource(R.drawable.videoplayer_play);
                 return;
             }
         }
         break;
     case R.id.bt_pause:
         pause();
         break;
         ......//等等其他功能
     default:
         break;
     }
 }

@Override
 public boolean onError(MediaPlayer mp, int what, int extra) {
     //Toast.makeText(MainVideoActivity.this, "报错了--" + what + "--" + extra, 0).show();
     return false;
 }
 @Override
 public void onPrepared(MediaPlayer mp) {//只有准备好以后才能处理很多逻辑
     mediaPlayer.start();
     //=============
     mediaPlayer.seekTo(savedPosition);//开始时是从0开始播放,恢复时是从指定位置开始播放
     seekBar.setMax(mediaPlayer.getDuration());//将进度条的最大值设为文件的总时长
     tv_currentprogress.setText("00:05");
     tv_totalprogress.setText(String.valueOf(msConvertToMinute(mediaPlayer.getDuration())));
     timer = new Timer();
     task = new TimerTask() {
         public void run() {
             seekBar.setProgress(mediaPlayer.getCurrentPosition());//将媒体播放器当前播放的位置赋值给进度条的进度
             //tv_currentprogress.setText("00:05");
         }
     };
     timer.schedule(task, 0, 100);//0秒后执行,每隔100ms执行一次
     //Toast.makeText(MainVideoActivity.this, "开始播放!", 0).show();
 }
 
 @Override
 public void onCompletion(MediaPlayer mp) {
     Toast.makeText(MainVideoActivity.this, "本视频播放完毕!", 0).show();
     videoPlayStateImageRefresh(true);
     bt_pause.setBackgroundResource(R.drawable.videoplayer_pause);
     //mediaPlayer.reset();
     //bt_playUrl.setEnabled(true);
 }
 @Override
 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {//进度发生变化时
	 tv_currentprogress.setText(String.valueOf(msConvertToMinute(progress)));
 }
 @Override
 public void onStartTrackingTouch(SeekBar seekBar) {
 }
 @Override
 public void onStopTrackingTouch(SeekBar seekBar) {//停止拖拽时回调
     mediaPlayer.seekTo(seekBar.getProgress());//停止拖拽时进度条的进度
     tv_currentprogress.setText(String.valueOf(msConvertToMinute(seekBar.getProgress())));
 }

3、添加用户权限:(否则播放网络视频出错)

   <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

   <uses-permission android:name="android.permission.INTERNET"/>

4、在AndroidManifest.xml给MainVideoActivity添加属性:

android:configChanges="keyboardHidden|orientation|screenSize"

这一步是为了避免 全屏/恢复 时,每次切换该activity都要oncreate(  )一下,这样会出错。添加之后,完美切换,没有任何影响。


完整demo下载网址:https://download.youkuaiyun.com/download/lpcrazyboy/10331900

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值