一、现象

问题

1)通过adb安装的应用可以正常申请下面的权限,通过拷贝apk到平板里手动安装(通过文件极客apk)则无法申请权限。

2)android14上能正常申请权限

代码

通过下面的intent调用设置申请权限

val intent = Intent(
    Settings.ACTION_USAGE_ACCESS_SETTINGS,
    Uri.parse("package:$packageName")
)

在酷比魔方平板会调起页面:

toggle buttton本身是不能点击的,但是整个item可以点击,并且会弹出:

二、找页面

先关闭后打开权限申请页面,通过dumpsys window | grep "windows #"对比可知这个页面为com.android.settings/com.android.settings.Settings$AppUsageAccessSettingsActivity,真正的页面为Fragment类com.android.settings.applications.UsageAccessDetails,其refreshUI方法里将这个权限开关置灰不可用的,关联的类为packages/apps/Settings/src/com/android/settings/applications/AppStateAppOpsBridge.java

三、最终解决办法

最终没有改rom代码,而是通过“设置-应用-右上角-允许受限制的设置”,即可正常申请。

分析源码:

通过在packages/apps/Settings目录中执行grep -rn "允许受限制的 设置"找到string的定义位置
res/values-zh-rCN/strings.xml:1763: <string name="app_restricted_settings_lockscreen_title" msgid="5993061278264872648">"允许受限制的设置"</string>

继续检索
grep -nr app_restricted_settings_lockscreen_title
找到代码
src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java:409: R.string.app_restricted_settings_lockscreen_title)

菜单的点击事件

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            ...
            case ACCESS_RESTRICTED_SETTINGS:
                showLockScreen(getContext(), () -> {
                    if (android.permission.flags.Flags.enhancedConfirmationModeApisEnabled()
                            && android.security.Flags.extendEcmToAllSettings()) {
                        EnhancedConfirmationManager manager = getContext().getSystemService(
                                EnhancedConfirmationManager.class);
                        try {
                            manager.clearRestriction(getPackageName());
                        } catch (NameNotFoundException e) {
                            Log.e(TAG, "Exception when retrieving package:" + getPackageName(), e);
                        }
                    } else {
                        final AppOpsManager appOpsManager = getContext().getSystemService(
                                AppOpsManager.class);
                        appOpsManager.setMode(AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS,
                                getUid(),
                                getPackageName(),
                                AppOpsManager.MODE_ALLOWED);
                    }
                    getActivity().invalidateOptionsMenu();
                    final String toastString = getContext().getString(
                            R.string.toast_allows_restricted_settings_successfully,
                            mAppEntry.label);
                    Toast.makeText(getContext(), toastString, Toast.LENGTH_LONG).show();
                });
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

0 条评论

发表回复

您的电子邮箱地址不会被公开。