前言:由于视频源的尺寸导致播放的时候不能全屏,需要重写VideoView的onMeasure方法,所以我们创建ConditionVideoView继承于VideoView。
ConditionVideoView类代码如下:
1. public class ConditionVideoView extends VideoView { 2. public ConditionVideoView(Context context) { 3. super(context); 4. } 5. 6. public ConditionVideoView(Context context, AttributeSet attrs) { 7. super(context, attrs); 8. } 9. 10. public ConditionVideoView(Context context, AttributeSet attrs, int defStyleAttr) { 11. super(context, attrs, defStyleAttr); 12. } 13. 14. @Override 15. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 16. //使视频全屏播放 17. int width = getDefaultSize(0, widthMeasureSpec); 18. int height = getDefaultSize(0, heightMeasureSpec); 19. setMeasuredDimension(width, height); 20. } 21. }
之后在activity_video_play.xml中引入重写后的VideoView
1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. xmlns:app="http://schemas.android.com/apk/res-auto" 4. xmlns:tools="http://schemas.android.com/tools" 5. android:layout_width="match_parent" 6. android:layout_height="match_parent" 7. tools:context=".VideoPlayActivity"> 8. 9. <com.example.daydemo.view.ConditionVideoView 10. android:id="@+id/videoView" 11. android:layout_width="match_parent" 12. android:layout_height="match_parent" /> 13. </LinearLayout>
之后在VideoPlayActivity中实现播放本地视频的功能:
具体注释已经在代码中给出
1. public class VideoPlayActivity extends AppCompatActivity { 2. private ConditionVideoView videoView; 3. 4. @Override 5. protected void onCreate(Bundle savedInstanceState) { 6. super.onCreate(savedInstanceState); 7. setContentView(R.layout.activity_video_play); 8. videoView = findViewById(R.id.videoView); 9. 10. //获取文件对象 11. File file = new File(Environment.getStorageDirectory() + "/live.mp4"); 12. if (file.exists()) { 13. //如果文件存在,则指定要播放的视频 14. videoView.setVideoPath(file.getAbsolutePath()); 15. } else { 16. Toast.makeText(this, "要播放的视频文件不存在", Toast.LENGTH_SHORT).show(); 17. } 18. /** 19. * 控制视频的播放 主要通过MediaController控制视频的播放 20. */ 21. //创建MediaController对象 22. MediaController mediaController = new MediaController(this); 23. videoView.setMediaController(mediaController); //让videoView 和 MediaController相关联 24. videoView.setFocusable(true); //让VideoView获得焦点 25. videoView.start(); //开始播放视频 26. //给videoView添加完成事件监听器,监听视频是否播放完毕 27. videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 28. @Override 29. public void onCompletion(MediaPlayer mp) { 30. Toast.makeText(VideoPlayActivity.this, "该视频播放完毕!", Toast.LENGTH_SHORT).show(); 31. } 32. }); 33. } 34. }
最后不要忘了在AndroidManifest.xml清单文件中加入允许访问SD卡的权限:
1. <!--允许访问SD卡的权限--> 2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 3. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" 4. tools:ignore="ProtectedPermissions" />
注意:如果按照如上步骤播放视频时,出现无法播放视频的提示框,那么可能就是文件路径出现了错误,或者指定的文件路径下没有视频资源。而且VideoView 只支持播放.mp4和.3GP格式
mp4格式:优点:分辨率高,大小适中
3GP格式:体积小,移动性强,适合在移动设备上使用。缺点:在电脑上兼容性差。
这样就能实现使用VideoView实现播放本地视频的功能~ 如有任何问题,可以在评论区指正!