目录
一、现象
问题
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 条评论