Android横屏应用调用requestPermissions权限弹窗先竖屏后旋转问题求解
问题根因
你遇到的弹窗先竖屏后转横屏的本质是系统权限弹窗加载时机早于Activity横屏配置完成同步导致的:调用requestPermissions时,你应用的窗口还未完成横屏渲染,系统权限服务读取到的还是默认方向配置拉起竖屏弹窗,等应用横屏配置同步完成后才触发弹窗旋转。
解决方案
1. 优先完善Manifest配置
首先在AndroidManifest.xml中给MainActivity固定横屏声明,让系统权限服务直接读取到固定方向配置:
<activity android:name=".MainActivity" android:screenOrientation="landscape" android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
screenOrientation="landscape"强制Activity全程固定横屏,configChanges配置避免方向相关配置变更不会触发Activity重建,减少方向变更直接由系统处理。
2. 替换硬延时替换为可靠的布局完成监听
不要用固定500ms的硬延时,不同设备性能差异容易导致适配问题,改用View的布局完成回调,确保Activity窗口已经完成横屏渲染后再申请权限,修改PermissionsFragment逻辑:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 回调执行时View已经挂载到窗口,Activity横屏渲染完成 view.post(() -> { if (!hasPermissions()) { // Android 10+ 兼容:申请前再强制同步一次方向配置 requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); requestPermissions(PERMISSIONS_REQUIRED, PERMISSIONS_REQUEST_CODE); } else { if(callback != null) callback.onPermissionsAcquired(); } }); }
删除原有onResume中的权限申请逻辑可以注释掉,避免重复调用重复触发申请。
内容的提问来源于stack exchange,提问作者mFad
相关产品推荐
相关产品推荐

