[Android学习笔记八] 使用VideoView屏幕方向发生变化,视频方向自动切换

简介:

一个Activity主要用来做播放视频使用,并且是全屏播放的话,主要采用横屏(Landscape orientation 显示宽度大于高度)显示视频,那么可以指定Activity的属性android:screenOrientation="landscape"让Activity在设备上以横屏显示。


    本文使用VideoView来显示视屏,Potrait(竖屏)时布局样式中宽匹配父布局,高匹配内容;Landscape(横屏)时布局样式中宽匹配内容,高匹配布局。视屏播放中,用户调正设备方向时,导致屏幕方向发生变化,视屏能够适应布局样式显示视频,并正常继续播放。


   示例图:

   

   wKiom1Zdg-mzW21DAAFN6BAzmRY216.pngwKiom1Zdg-6AD8gFAAH5Fcl99HI244.png



 1. 构建布局

    Potrait: res/layout/activity_videoview.xml

   

1
2
3
4
5
6
7
8
9
10
11
<? 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" >
 
     < VideoView
         android:id = "@+id/videoView"
         android:layout_width = "match_parent"
         android:layout_height = "wrap_content"  android:layout_gravity = "center_horizontal"  android:layout_margin = "5dp" />
</ LinearLayout >


   Landscape: res/layout-land/activity_videoview.xml

1
2
3
4
5
6
7
8
9
10
<? xml  version = "1.0"  encoding = "utf-8" ?>
< LinearLayout  xmlns:android = "http://schemas.android.com/apk/res/android"
               android:orientation = "vertical"
               android:layout_width = "match_parent"
               android:layout_height = "match_parent" >
     < VideoView
         android:layout_width = "wrap_content"
         android:layout_height = "match_parent"
         android:id = "@+id/videoView"  android:layout_gravity = "center_horizontal"  android:layout_margin = "5dp" />
</ LinearLayout >

  

   2.创建Activity

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package  secondriver.sdk.activity;
 
import  android.app.Activity;
import  android.app.ProgressDialog;
import  android.content.res.Configuration;
import  android.media.MediaPlayer;
import  android.net.Uri;
import  android.os.Bundle;
import  android.util.Log;
import  android.widget.MediaController;
import  android.widget.Toast;
import  android.widget.VideoView;
 
import  secondriver.sdk.R;
 
 
/**
  * Author : secondriver
  * Created : 2015/11/30
  */
public  class  VideoViewActivity  extends  Activity  implements
         MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
 
     private  final  String TAG = VideoViewActivity. class .getName();
 
     public  VideoView videoView;
     public  MediaController mediaController;
     public  int  videoPosition =  0 ;
     public  ProgressDialog dialog;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         Log.d(TAG,  "onCreate" );
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_videoview);
 
         dialog =  new  ProgressDialog( this );
         dialog.setTitle( "视屏播放器" );
         dialog.setMessage( "正在加载..." );
         dialog.setCancelable( false );
 
         mediaController =  new  MediaController( this );
         videoView = (VideoView) findViewById(R.id.videoView);
         videoView.setMediaController(mediaController);
 
         videoView.setOnCompletionListener( this );
         videoView.setOnPreparedListener( this );
         videoView.setOnErrorListener( this );
     }
 
     private  void  loadVideo() {
         Log.d(TAG,  "load video" );
         dialog.show();
         try  {
             videoView.setVideoURI(Uri.parse( "android.resource://"  + getPackageName() +  "/"  + R.raw.bsg));
         catch  (Exception e) {
             Log.e(TAG, e.getMessage());
         }
     }
 
     @Override
     protected  void  onStart() {
         Log.d(TAG,  "onStart" );
         super .onStart();
         loadVideo();
     }
 
     @Override
     public  void  onConfigurationChanged(Configuration newConfig) {
         Log.d(TAG,  "onConfigurationChanged" );
         super .onConfigurationChanged(newConfig);
     }
 
     @Override
     public  void  onCompletion(MediaPlayer mp) {
         Log.d(TAG,  "Media onCompletion" );
         Toast.makeText(VideoViewActivity. this "播放完成" , Toast.LENGTH_LONG).show();
         mp.release();
     }
 
     @Override
     public  void  onPrepared(MediaPlayer mp) {
         Log.d(TAG,  "Media onPrepared" );
 
         if  (dialog.isShowing()) {
             dialog.dismiss();
         }
         mp.seekTo(videoPosition);
         if  (videoPosition ==  0 ) {
             mp.start();
         else  {
             mp.pause();
         }
     }
 
     @Override
     public  boolean  onError(MediaPlayer mp,  int  what,  int  extra) {
         Log.d(TAG,  "Media onError" );
         String err =  "未知错误" ;
         switch  (what) {
             case  MediaPlayer.MEDIA_ERROR_UNKNOWN:
                 break ;
             case  MediaPlayer.MEDIA_ERROR_SERVER_DIED:
                 err =  "媒体服务终止" ;
                 break ;
             default :
                 break ;
         }
         Toast.makeText(VideoViewActivity. this , err, Toast.LENGTH_LONG).show();
         return  true ;
     }
}

 

   3. 设置Activity属性

   

1
2
3
  <activity android:name= ".activity.VideoViewActivity"
                   android:configChanges= "orientation|screenSize|keyboardHidden"
             />


    代码中重写了onConfigurationChanged,可以在此处做配置发生变化的处理。


    在运行时发生配置更改,Activity被关闭,默认情况下重新启动,但在设置了Activity的configChanges属性的配置将防止活动被重新启动,Activity仍在运行并且onConfigurationChanged方法被调用。

  

    需要注意的是如果应用程序的target API level是13+的话(声明了minSdkversion和targetSdkVersion属性),需要同时设置screensize, 因为设备的横竖方向发生变化的时候,当前屏幕的可用尺寸也将发生变化。



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1718653,如需转载请自行联系原作者

相关文章
|
4月前
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
54 3
|
5月前
|
开发工具 Android开发
rk平台Android12屏幕永不休眠
rk平台Android12屏幕永不休眠
93 1
|
1月前
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
|
2月前
|
编解码 监控 API
惊艳登场!揭秘如何在Android平台上轻松玩转GB28181标准,实现多视频通道接入的超实用指南!
【8月更文挑战第14天】GB28181是公共安全视频监控联网的技术标准。本文介绍如何在Android平台上实现该标准下的多视频通道接入。首先准备开发环境,接着引入GB28181 SDK依赖并初始化SDK。实现设备注册与登录后,通过指定不同通道号请求多路视频流。最后,处理接收到的数据并显示给用户。此过程涉及视频解码,需确保应用稳定及良好的用户体验。
27 0
|
4月前
|
监控 Android开发 数据安全/隐私保护
安卓kotlin JetPack Compose 实现摄像头监控画面变化并录制视频
在这个示例中,开发者正在使用Kotlin和Jetpack Compose构建一个Android应用程序,该程序 能够通过手机后置主摄像头录制视频、检测画面差异、实时预览并将视频上传至FTP服务器的Android应用
|
3月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
46 0
|
4月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
44 2
|
5月前
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
310 5
|
5月前
|
Android开发
获取Android设备屏幕大小
获取Android设备屏幕大小
111 3
|
5月前
|
架构师 网络协议 算法
Android高级架构师整理面试经历发现?(大厂面经+学习笔记(1)
Android高级架构师整理面试经历发现?(大厂面经+学习笔记(1)