问题描述:
1)部分app 存在无障碍服务功能,需要关闭
2)对于客户自研App,自己具备系统签名自己直接开启了无障碍服务并且打开了无障碍服务快捷方式,如何关闭无障碍服务快捷开关
问题现象
现象如下图所示
问题描述
- 在无障碍功能列表里面一般都是第三方app,我们不允许客户能够具备这个权限,所以需要屏蔽掉
- 针对自研具备系统签名app,不允许客户自己开启无障碍服务快捷方式、或者 我们每次自己去控制无障碍服务快捷开关
屏蔽app无障碍服务显示
思路如下
- 搜索无障碍服务相关文字搜索,如下:
<string name="accessibility_text_and_display_title" msgid="1398507755501334961">"文字和显示"</string>
<string name="accessibility_turn_screen_darker_title" msgid="5986223133285858349">"调暗屏幕"</string>
<string name="interaction_control_category_title" msgid="2696474616743882372">"互动控制"</string>
<string name="accessibility_tap_assistance_title" msgid="1058913033421048284">"时间控件"</string>
<string name="accessibility_system_controls_title" msgid="6403287349518987624">"系统控件"</string>
<string name="user_installed_services_category_title" msgid="2639470729311439731">"已下载的应用"</string>
<string name="experimental_category_title" msgid="898904396646344152">"实验性功能"</string>
- 通过1 找到无障碍模式布局文件 accessibility_settings.xml
从布局对比可以看到,这个已下载的应用,本身子数据也是动态添加的,其它的快捷菜单子数据是配置的。
<PreferenceCategory
android:key="user_installed_services_category"
android:persistent="false"
android:title="@string/user_installed_services_category_title"/>
- 通过2 找到 AccessibilitySettings.java
已下载的内容:CATEGORY_DOWNLOADED_SERVICES
private static final String CATEGORY_DOWNLOADED_SERVICES = "user_installed_services_category";
-》 final PreferenceCategory downloadedServicesCategory =
mCategoryToPrefCategoryMap.get(CATEGORY_DOWNLOADED_SERVICES);
-》集合mCategoryToPrefCategoryMap 赋值:
private void initializeAllPreferences() {
for (int i = 0; i < CATEGORIES.length; i++) {
PreferenceCategory prefCategory = findPreference(CATEGORIES[i]);
mCategoryToPrefCategoryMap.put(CATEGORIES[i], prefCategory);
}
}
根据2 中的推测,找到mCategoryToPrefCategoryMap 中,已下载的 赋值地方。
-> final PreferenceCategory downloadedServicesCategory =
mCategoryToPrefCategoryMap.get(CATEGORY_DOWNLOADED_SERVICES);
downloadedServicesCategory 找到它赋值子类的地方:
->
for (int i = 0, count = preferenceList.size(); i < count; ++i) {
final RestrictedPreference preference = preferenceList.get(i);
final ComponentName componentName = preference.getExtras().getParcelable(
EXTRA_COMPONENT_NAME);
PreferenceCategory prefCategory = downloadedServicesCategory;
// Set the appropriate category if the service comes pre-installed.
if (mPreBundledServiceComponentToCategoryMap.containsKey(componentName)) {
prefCategory = mPreBundledServiceComponentToCategoryMap.get(componentName);
}
prefCategory.addPreference(preference);
mServicePreferenceToPreferenceCategoryMap.put(preference, prefCategory);
}
这个地方,通过 componentName 的信息,如果含有了 需要屏蔽的包名 则 continue 即可,不让添加到prefCategory中 即可
修改后的代码如下:
for (int i = 0, count = preferenceList.size(); i