1.无障碍模式
Android 6.0 后的运行时权限,有时我们不想让用户手动点击,这时我们就可以使用 accessibilityservice 来监测窗口时间,自动完成运行时权限确定或者自动安装应用程序,同时也是微信抢红包的原理
2.设置源码
1.-------------------------------------------------------------------------------------
通过字符串找界面
<string name="accessibility_settings" msgid="3975902491934816215">"无障碍"</string>
2.-------------------------------------------------------------------------------------
布局文件
accessibility_settings.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/accessibility_settings"【"无障碍"】
android:persistent="true">
<PreferenceCategory
android:key="services_category"
android:title="@string/accessibility_services_title">【服务】
</PreferenceCategory>
3.-------------------------------------------------------------------------------------
搜索services_category字符串
AccessibilitySettings.java (3 matches)
package com.android.settings.accessibility;
/**
* Activity with the accessibility settings.
*/
public class AccessibilitySettings extends SettingsPreferenceFragment implements DialogCreatable,
Preference.OnPreferenceChangeListener, Indexable {
// Preference categories
private static final String SERVICES_CATEGORY = "services_category";
private void initializeAllPreferences() {
mServicesCategory = (PreferenceCategory) findPreference(SERVICES_CATEGORY);
...
4.-------------------------------------------------------------------------------------
遍历 <action android:name="android.accessibilityservice.AccessibilityService"/> 的应用清单
private void updateServicesPreferences() {
// Since services category is auto generated we have to do a pass
// to generate it since services can come and go and then based on
// the global accessibility state to decided whether it is enabled.
// Generate.
mServicesCategory.removeAll();
AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(getActivity());
List<AccessibilityServiceInfo> installedServices =
accessibilityManager.getInstalledAccessibilityServiceList();
Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
getActivity());
List<String> permittedServices = mDpm.getPermittedAccessibilityServices(
UserHandle.myUserId());
final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
for (int i = 0, count = installedServices.size(); i < count; ++i) {
AccessibilityServiceInfo info = installedServices.get(i);
RestrictedPreference preference = new RestrictedPreference(getActivity());
preference.setLayoutResource(R.layout.preference_material_settings);
String title = info.getResolveInfo().loadLabel(getPackageManager()).toString();
ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
ComponentName componentName = new ComponentName(serviceInfo.packageName,
serviceInfo.name);
preference.setKey(componentName.flattenToString());
preference.setTitle(title);
final boolean serviceEnabled = accessibilityEnabled
&& enabledServices.contains(componentName);
String serviceEnabledString;
if (serviceEnabled) {
serviceEnabledString = getString(R.string.accessibility_feature_state_on);
} else {
serviceEnabledString = getString(R.string.accessibility_feature_state_off);
}
// Disable all accessibility services that are not permitted.
String packageName = serviceInfo.packageName;
boolean serviceAllowed =
permittedServices == null || permittedServices.contains(packageName);
if (!serviceAllowed && !serviceEnabled) {
EnforcedAdmin admin = RestrictedLockUtils.checkIfAccessibilityServiceDisallowed(
getActivity(), serviceInfo.packageName, UserHandle.myUserId());
if (admin != null) {
preference.setDisabledByAdmin(admin);
} else {
preference.setEnabled(false);
}
} else {
preference.setEnabled(true);
}
preference.setSummary(serviceEnabledString);
preference.setOrder(i);
preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
preference.setPersistent(true);
Bundle extras = preference.getExtras();
extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey());
extras.putBoolean(EXTRA_CHECKED, serviceEnabled);
extras.putString(EXTRA_TITLE, title);
String description = info.loadDescription(getPackageManager());
if (TextUtils.isEmpty(description)) {
description = getString(R.string.accessibility_service_default_description);
}
extras.putString(EXTRA_SUMMARY, description);
String settingsClassName = info.getSettingsActivityName();
if (!TextUtils.isEmpty(settingsClassName)) {
extras.putString(EXTRA_SETTINGS_TITLE,
getString(R.string.accessibility_menu_item_settings));
extras.putString(EXTRA_SETTINGS_COMPONENT_NAME,
new ComponentName(info.getResolveInfo().serviceInfo.packageName,
settingsClassName).flattenToString());
}
extras.putParcelable(EXTRA_COMPONENT_NAME, componentName);
mServicesCategory.addPreference(preference);
}
3.微信抢红包-案例
简书的这位大神写的很好哦,妙赞
本文介绍了Android系统中无障碍模式的实现方式及其源码解析,包括如何使用AccessibilityService监测窗口事件,实现自动处理运行时权限确认及应用安装等功能。此外,还通过案例详细解释了无障碍模式在微信抢红包中的应用。
7645

被折叠的 条评论
为什么被折叠?



