VideoView播放视频

本文介绍了一个简单的Android应用,用于播放本地资源视频。通过使用VideoView组件并设置相应的视频资源路径,可以实现视频播放功能。此外,文章还展示了如何保存视频暂停位置并在活动恢复时继续播放。

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_vertical"
    android:orientation="vertical" >

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

</LinearLayout>

public class MediaActivity extends Activity {

	VideoView videoView;
	private int mPositionWhenPaused = -1;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// Create VideoView
		videoView = (VideoView) this.findViewById(R.id.videoView);
		// Create MediaController
		// MediaController mc = new MediaController(this);
		// Set MediaController to VideoView
		// videoView.setMediaController(mc);
		// Set video path of SD Card
		// videoView.setVideoURI(Uri.parse("file:///sdcard/samplemp4.mp4"));
		// Set video web path
		// videoView.setVideoURI(Uri.parse("http://www.xyz.com/../sample3gp.3gp"));
		videoView.setVideoURI(Uri.parse("android.resource://"
				+ getPackageName() + "/" + R.raw.media2));
		// Set requestFocus
		videoView.requestFocus();
		videoView
				.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

					@Override
					public void onCompletion(MediaPlayer arg0) {
						// TODO Auto-generated method stub
						// Intent intent=new
						// Intent(MediaActivity.this,AdsActivity.class);
						// startActivity(intent);
					}
				});

		// Play Video
		videoView.start();

	}

	public void onPause() {
		// 在活动时是停止视频的停顿.
		mPositionWhenPaused = videoView.getCurrentPosition();
		videoView.stopPlayback();

		super.onPause();
	}

	public void onResume() {
		// 恢复视频播放器
		if (mPositionWhenPaused >= 0) {
			videoView.seekTo(mPositionWhenPaused);
			mPositionWhenPaused = -1;
		}
		videoView.start();
		super.onResume();
	}
}



### VideoView 播放视频时黑屏和加载失败的解决方案 #### 使用自定义视图替代默认背景 为了改善用户体验,在`VideoView`加载期间可以设置一个占位符图片来代替黑色屏幕。这可以通过创建一个带有ImageView作为占位符布局文件并将其应用到包含`VideoView`的容器上来实现。 ```xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/video_container" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- Placeholder image --> <ImageView android:id="@+id/place_holder_image" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/default_placeholder"/> <!-- The actual video view --> <VideoView android:id="@+id/videoview" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout> ``` 当媒体准备完毕后隐藏该图像: ```java videoView.setOnPreparedListener(mp -> { placeHolderImage.setVisibility(View.GONE); }); ``` 这种方法不仅解决了初始黑屏问题,还提高了用户的视觉感受[^2]。 #### 设置缓冲监听器处理加载超时情况 对于可能出现的加载失败状况,建议添加对MediaPlayer.BufferingUpdate事件的支持,以便能够及时响应长时间未能成功获取数据的情况,并向用户提供反馈信息。 ```java videoView.setOnBufferingUpdateListener((mp, percent) -> { if (percent == 0 && !isFirstTime){ Toast.makeText(context,"Loading...",Toast.LENGTH_SHORT).show(); isFirstTime = true; } }); // Reset flag when playback starts or stops. videoView.setOnCompletionListener(mp->isFirstTime=false); videoView.setOnErrorListener((mp, what, extra)->{ isFirstTime=false; return false; // Let the default error handler handle it. }); ``` 通过这种方式可以在遇到网络不稳定或其他异常情况下给用户提示正在尝试重新连接或告知他们发生了错误[^4]。 #### 预加载机制提前下载部分资源 如果应用程序允许的话,考虑在网络条件较好的时候预先缓存一部分即将播放的内容。这样即使后续网络质量下降也能保证流畅观看而不至于完全卡住等待加载完成。 ```java Uri uri = Uri.parse(videoUrl); MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(getApplicationContext(),uri); byte[] frameAtTime = retriever.getEmbeddedPicture(); // Get thumbnail data from metadata. Bitmap bitmap = BitmapFactory.decodeByteArray(frameAtTime,0,frameAtTime.length); placeHolderImage.setImageBitmap(bitmap); // Use as placeholder until real content loads. ``` 此代码片段展示了如何利用`MediaMetadataRetriever`类提取视频缩略图用于预览目的,从而减少首次启动时的空白时间[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值