当前应用程序在AndroidManifest.xml中使用以下指令:
<activity
// ...
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
// ...
正在使用WebView组件显示Youtube视频:
<WebView
height={webViewRoundedHeight}
allowsInlineMediaPlayback={true}
mediaPlaybackRequiresUserAction={false}
useWebKit={true}
allowsFullscreenVideo={true}
/>
问题是,当用户观看视频并更改为全屏模式时,设备仍被锁定为纵向。 iOS可以解决此问题,因此这仅是Android的问题。
我已经尝试将WebView
属性回切到允许视频全屏显示的最低要求。这对旋转没有影响。
如果我从清单中删除ndroid:screenOrientation="portrait"
指令,则可以旋转视频,但是当用户移至横向模式时,该应用程序其余部分的样式将被破坏。
该应用未使用Expo
,并且是AndroidX之前的版本。由于构建失败,这似乎使我无法使用react-native-orientation
或react-native-orientation-locker
软件包。 (我尝试按照安装说明进行操作,但是在出现一系列越来越模糊的错误消息后,我没时间在此功能上花费了。)这也意味着我无权使用EXPO屏幕方向包装(并将expo添加到现有应用程序看起来可能会导致更多耗时的问题:Converting Existing React Native Projects to Expo]
[如果我可以使用任何方向包,则理论上我可以从清单文件中删除portrait指令,将方向锁定在代码中(根据效果的范围在App.js
或单独的屏幕中),然后当用户进入全屏模式时,从Web视图内的JS发送消息。我可以在RN JS代码中捕捉到这一点并放宽方向锁定,直到用户退出全屏显示为止。但是,我一直试图创建一个可以从JS操作的锁。
最欢迎有其他想法。
我遇到了同样的问题,并且在React-Native和Youtube播放器上下文中确定,这是不可能的。因此,我们实际上需要在Objective-C代码内进行更改。
我正在使用react-native-orientation-locker软件包将我的应用锁定为Portrait。
我需要更改此功能:
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return [Orientation getOrientation];
}
to
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if(window != self.window && window && window.rootViewController)
{
UIViewController * pvc = window.rootViewController.presentedViewController;
if(pvc)
{
NSString * class = NSStringFromClass([pvc class]);
if(pvc && [class hasPrefix:@"AV"]){
return UIInterfaceOrientationMaskAll;
}
}
}
return [Orientation getOrientation];
}
您可以更改此支票
if(pvc && [class hasPrefix:@"AV"]){
更确切地说,如果您担心其他应用程序或您不使用WkWebview,则>]
如果您不使用任何其他软件包,也可能会更改
return [Orientation getOrientation];
到
return UIInterfaceOrientationMaskPortrait