Android 13.0 第三方应用默认横屏显示

客户的需求是使Pad设备在运行第三方应用时默认横屏显示。文章指导如何在Android13.0的DisplayRotation.java中修改代码,通过改变`SCREEN_ORIENTATION_LANDSCAPE`逻辑实现横屏。修改后,第三方应用的默认显示方向已成功变为横屏。

Android 13.0 第三方应用默认横屏显示

最近收到需求邮件,提到客户的Pad设备在打开第三方应用时默认为竖屏显示,需要优化为默认横屏显示,具体修改参照如下:

/frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java

            case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
                // Return landscape unless overridden.
                if (isLandscapeOrSeascape(preferredRotation)) {
                    return preferredRotation;
                }
-                return mLandscapeRotation;
+                return Surface.ROTATION_270;

重新编译验证,修改生效,第三方应用已默认横屏显示

Android 13.0(API 级别 33)中,默认授予第三方应用运行时权限的机制受到严格限制,这是为了增强用户隐私和系统安全性。Android 系统要求应用在运行时明确请求权限,并由用户进行授权确认。然而,在某些定制化系统开发或企业设备管理场景下,存在对特定应用默认授予运行时权限的需求。 实现这一目标的方式通常包括以下几种: ### 使用特权系统应用 在系统定制开发中,如果希望某个第三方应用在安装后自动获得某些运行时权限,可以将该应用作为系统应用打包进系统镜像中。系统应用可以声明 `signature` 或 `privileged` 权限,从而绕过部分运行时权限检查。 例如,在 `/system/priv-app` 目录下部署应用,并在其 `AndroidManifest.xml` 文件中声明适当的权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 此外,系统签名的应用可以通过 PackageManager 的 `grantRuntimePermission` 方法动态授予权限: ```java try { Context context = createPackageContext("com.example.targetapp", 0); context.grantUriPermission("com.example.targetapp", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (Exception e) { e.printStackTrace(); } ``` 此方法需要调用者具有 `android.permission.GRANT_RUNTIME_PERMISSIONS` 权限[^1]。 ### 使用设备管理员或企业配置文件 对于面向企业的部署,可以通过 Android 的 **设备管理员 API**(Device Administration API)或 **Android Enterprise** 功能实现权限的自动授予。通过激活设备管理员权限,管理应用可以在用户首次设置设备时请求并获得特定权限,而无需每次弹出权限请求对话框。 使用 DevicePolicyManager 授予权限示例: ```java DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminReceiver = new ComponentName(this, MyDeviceAdminReceiver.class); if (dpm.isDeviceOwnerAppOnAnyUser(getPackageName())) { dpm.setApplicationHidden(adminReceiver, "com.example.targetapp", false); dpm.addUserRestriction(adminReceiver, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES); } ``` 这种方式适用于设备所有者(Device Owner)或资料所有者(Profile Owner)模式下的设备管理场景[^1]。 ### 修改系统源码(不推荐) 在某些深度定制系统中,厂商可能会修改系统源码以实现默认授予权限的行为。例如,在 PackageManagerService 中修改权限授予逻辑,或在安装流程中插入自动授权逻辑。这种做法通常涉及对 AOSP 源码的修改,且可能导致兼容性问题或无法通过 Google 兼容性测试(CTS)。 例如,在 `PackageManagerService` 中找到权限授予相关代码段,并插入如下逻辑: ```java grantPermissionsLPw(packageSetting, userIds); // 插入默认授权逻辑 for (String permission : permissionsToGrantByDefault) { grantRuntimePermission(packageName, permission, userId); } ``` 此类修改需谨慎操作,并确保符合安全规范。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeffries_C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值