Android完美判断是否开启⽆障碍服务功能
背景
标准Android系统提供AccessibilityService以满⾜残障⼈使⽤App的需求,同时提供talkback服务以语⾳播报的⽅式提供服务,开发者也可能通过继承实现AccessibilityService实现⾃⼰的⽆障碍⽀持。⽬前市⾯上已经存在⼀些⽆障碍⽀持软件如保益悦听、点明安卓、解说等,这类软件同样是基于语⾳播报的⽅式提供服务。
此外,还有些软件如爱奇异App也使⽤了AccessibilityService,然⽽此类App不是为了提供⽆障碍服务,⽽是使⽤AccessibilityService以实现诸如⾃动安装等功能,所以在进⾏⽆障碍服务是否开启的判断中要排除此类App使⽤AccessibilityService的⽅式。
所以如何准确判断⽤户是否开启⽆障碍服务需要考虑以上所有场景。
代码实现
综上所述,具体实现代码如下:
public static boolean isAccessibilityEnabled(Context context) throws RuntimeException{
if (context == null) {
return false;
}
// 检查AccessibilityService是否开启
AccessibilityManager am = (AccessibilityManager) t.Context.ACCESSIBILITY_SERVICE);
boolean isAccessibilityEnabled_flag = am.isEnabled();
boolean isExploreByTouchEnabled_flag = false;
安卓intent用法// 检查⽆障碍服务是否以语⾳播报的⽅式开启
isExploreByTouchEnabled_flag = isScreenReaderActive(context);
return (isAccessibilityEnabled_flag && isExploreByTouchEnabled_flag);
}
private final static String SCREEN_READER_INTENT_ACTION = "android.accessibilityservice.AccessibilityService";
private final static String SCREEN_READER_INTENT_CATEGORY = "android.accessibilityservice.category.FEEDBACK_SPOKEN";
private static boolean isScreenReaderActive(Context context) {
// 通过Intent⽅式判断是否存在以语⾳播报⽅式提供服务的Service,还需要判断开启状态
Intent screenReaderIntent = new Intent(SCREEN_READER_INTENT_ACTION);
screenReaderIntent.addCategory(SCREEN_READER_INTENT_CATEGORY);
List<ResolveInfo> screenReaders = PackageManager().queryIntentServices(screenReaderIntent, 0);
// 如果没有,返回false
if (screenReaders == null || screenReaders.size() <= 0) {
return false;
}
boolean hasActiveScreenReader = false;
if (Build.VERSION.SDK_INT <= 15) {
ContentResolver cr = ContentResolver();
Cursor cursor = null;
int status = 0;
for (ResolveInfo screenReader : screenReaders) {
cursor = cr.query(Uri.parse("content://" + screenReader.serviceInfo.packageName
+ ".providers.StatusProvider"), null, null, null, null);
if (cursor != null && veToFirst()) {
status = Int(0);
cursor.close();
// 状态1为开启状态,直接返回true即可
if (status == 1) {
return true;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论