华为手机悬浮窗设置辅助功能里面只有悬浮列窗没有辅助功能怎么办

辅助功能 之 小米手机悬浮窗权限
最近做项目遇到小米手机比较人(zhuang)性(bi)化的悬浮窗权限,当在小米手机上***完应用后默认是关闭这个权限的,需要用户手动到应用详情页打开该权限。
重(keng)要(die)的是使用这个权限开关系统window后, 小米手机不给任何提示就是不给弹窗。一开始以为是自己代码逻辑写错了,半天才反应过来,小米还有个这个权限,当天6.0以上安卓系统也需要这个权限,但是会有log提示的。
这么麻烦的操作怎么可能让用户自己去找应用详情然后开启操作呢?本文将实现一键开启小米悬浮窗权限!
想要实现自动调整到改应用的详情页的权限管理页面,就要知道权限管理页的类名及包名,我们又没有小米rom的源码,怎么才能知道指定页面的相关信息呢?
查看权限页面类名
这个方法应该有很多中,但是我只验证了一种:想到了 adb shell dumpsys activity
usb链接电脑后,手动打开应用的详情页面里的权限管理页面:
类名信息: com.miui.securitycenter/com.miui.permcenter.permissions.AppPermissionsEditorActivity
构造跳转Intent
知道到了要跳转的activity,我们直接构造Intent 是否可以直接跳过去?
***肯定是不行的. Intent 需要构造参数,来区分指定app的权限管理页面:
* 经测试V5版本是有区别的
public void openMiuiPermissionActivity(Context context) {
Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
if ("V5".equals(getProperty())) {
PackageInfo pInfo = null;
pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
Log.e("canking", "error");
intent.setClassName("com.miui.securitycenter", "com.miui.securitycenter.permission.AppPermissionsEditor");
intent.putExtra("extra_package_uid", pInfo.applicationInfo.uid);
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", context.getPackageName());
if (isActivityAvailable(context, intent)) {
if (context instanceof Activity) {
Activity a = (Activity)
a.startActivityForResult(intent, 2);
Log.e("canking", "Intent is not available!");
测试适配rom
经测试V5版本和后续版本是后区别的, 分别需要app ID和pkgname. 为了区分V5版本,我们需要得到小米rom的版本名:
public static String getProperty() {
String property = "null";
if (!"Xiaomi".equals(Build.MANUFACTURER)) {
return property;
Class&?& spClazz = Class.forName("android.os.SystemProperties");
Method method = spClazz.getDeclaredMethod("get", String.class, String.class);
property = (String) method.invoke(spClazz, "ro.miui.ui.version.name", null);
} catch (Exception e) {
e.printStackTrace();
return property;
该反射方法来自网络,经验证是有效的.
这样我们就跳转到了指定应用的权限管理页面.
2.实现一键打开
标题已经写了,我们的目标是用户一键开启,入口做到一键就能开启小米rom悬浮窗权限呢? 可以利用安卓辅助功能自动帮用户跳转, 自动点击打开权限,完成操作后返回.
这里写了个BaseAccessibilityService 通用的操作方法封装在这里.
* Created by changxing on 16-6-2.
public class BaseAccessService extends AccessibilityService {
protected void onServiceConnected() {
super.onServiceConnected();
public void onInterrupt() {
public void onAccessibilityEvent(AccessibilityEvent event) {
protected boolean clickByText(AccessibilityNodeInfo nodeInfo, String str) {
if (null != nodeInfo) {
List&AccessibilityNodeInfo& list = nodeInfo.findAccessibilityNodeInfosByText(str);
if (null != list && list.size() & 0) {
AccessibilityNodeInfo node = list.get(list.size() - 1);
if (node.isClickable()) {
return node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
AccessibilityNodeInfo parentNode =
for (int i = 0; i & 5; i++) {
if (null != parentNode) {
parentNode = parentNode.getParent();
if (null != parentNode && parentNode.isClickable()) {
return parentNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
return false;
protected AccessibilityNodeInfo findOpenButton(AccessibilityNodeInfo node) {
if (node == null)
return null;
if (node.getChildCount() == 0) {
if ("android.widget.Button".equals(node.getClassName())) {
return null;
for (int i = 0; i & node.getChildCount(); i++) {
AccessibilityNodeInfo button = findOpenButton(node.getChild(i));
if (button != null)
return null;
继承这个class ,重写onAccessibilityEvent ,在该方法内处理具体逻辑:
到这里只***TYPE_WINDOW_STATE_CHANGED类型就行了.通过控件的TEXT来实现找到需要点击的控件.
这里可以Dump View hierarchy工具来查看我们想要的控件具体信息.
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
XLogger.v("eventType:" + eventType);
switch (eventType) {
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
String clazzName = event.getClassName().toString();
AccessibilityNodeInfo nodeInfo = event.getSource();
XLogger.i( "悬浮窗:" + clazzName);
if (clazzName.equals("com.miui.permcenter.permissions.AppPermissionsEditorActivity")) {
if (end) {
clickByText(nodeInfo, "XiaomiPJ");
boolean access = clickByText(nodeInfo, "显示悬浮窗");
XLogger.i("access" + access);
if (clazzName.equals("miui.app.AlertDialog")) {
end = clickByText(nodeInfo, "允许");
XLogger.i( "getClick:" + end);
到这里就可以实现一键开启小米rom悬浮窗权限了
但是一键开启前我们需要判断,该权限是否已经开启:
* 判断MIUI的悬浮窗权限
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean isMiuiFloatWindowOpAllowed(Context context) {
final int version = Build.VERSION.SDK_INT;
if (version &= 19) {
return checkOp(context, 24);
if ((context.getApplicationInfo().flags & 1 && 27) == 1 && 27) {
return true;
return false;
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean checkOp(Context context, int op) {
final int version = Build.VERSION.SDK_INT;
if (version &= 19) {
AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
Class&?& spClazz = Class.forName(manager.getClass().getName());
Method method = manager.getClass().getDeclaredMethod("checkOp", int.class, int.class, String.class);
int property = (Integer) method.invoke(manager, op,
Binder.getCallingUid(), context.getPackageName());
XLogger.e(AppOpsManager.MODE_ALLOWED + " invoke " + property);
if (AppOpsManager.MODE_ALLOWED == property) {
return true;
return false;
} catch (Exception e) {
XLogger.e(e.getMessage());
XLogger.e("Below API 19 cannot invoke!");
return false;
api&=19需要用反射来活取系统相关配置信息,应该也适用于魅族手机,为验证.
这里我们就实现了一键开启小米Rom悬浮窗权限,并且实现了判断是否已经开启了该权限状态.
本Demo相关源码地址: , 欢迎下载交流学习~
本文已收录于以下专栏:
相关文章推荐
这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时...
op 的值是 0 ~ 47,其中0代表粗略定位权限,1代表精确定位权限,24代表悬浮窗权限。(具体可以看)
uid 当前应用用到的uid ,可通过 Binder.getCallingUid()获得。
首先,感谢这两篇博文http://blog.csdn.net/cankingapp/article/details/
http://blog.csdn.net/cool_fuwei/...
baidu一大堆不如自己动手干。
手头只有小米手机,拿来xiaomi(miui8)开始。
大多数只能跳转到这个应用信息管理界面,但是还得手动进入权限管理。
于是打开权限管理...
随着miui越来越封闭,小米对非自由渠道的应用限制越来越苛刻,我们公司的产品一半以上的用户都是来自小米,而且像我们这样的靠短信支付维持收入的游戏,短信权限默认禁止真是要了我们的命。被加入miui黑名单...
在MIUI系统中悬浮窗的权限默认是被禁止的,如果开发APP的过程中需要用到悬浮窗的功能,如何引导用户打开悬浮窗权限?上图为EasyTouch在MIUI系统中引导用户打开悬浮窗权限的界面,是一个很好的示...
前段时间看别人博客的时候偶然间看到了Android微信自动回复功能,最后的效果也很不错,博主在文中提到了AccessibilityService,以前压根没接触过这东西,表示一脸懵逼。也是这个原因我去...
现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作。
Android 原生有自带权限管理的,只是被隐藏了。看android源码在androi...
解决小米,魅族手机打开悬浮窗口问题
/********************************************************************************************
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)3DM新闻,游戏库论坛3大版块!
让自己操作更加,能够进行多种操作,者是许多小伙伴希望能用手游电脑版工具希望看到的。而悬空城的电脑版辅助工具就可以帮助大家完成多种功能,比如自动之类的。
《悬空城手游》电脑版辅助功能:
1、自动挂机
2、自动主线
3、自动喊话
悬空城手游电脑版器辅助专属工具使用教程:
1、打开安卓,并将模拟器分辨设置720*1280后,运行游戏。
2、打开手游电脑版辅助工具,进行账号注册并登陆。
3、点击或搜索所选游戏的对应游戏辅助专区,选择其中一款辅助,并点击运行。
4、在安卓模拟器界面会弹出是否授予管理员权限,这里点击允许即可。
5、双击***悬浮窗,即可出现辅助功能界面,在辅助功能界面勾选完对应功能,点击运行,即可开始挂机。
【注意事项】
1. 蜂窝助手必须在安卓模拟器下才可使用辅助。
2. 使用前需将模拟器分辨率调整为720*1280,dpi设置为320。
3. 首次运行会弹出授权框,这里必须点允许授权才能使用。
以上就是安卓模拟器《悬空城》手游电脑版辅助工具使用教程的全部内容了,希望对大家有所帮助,
CopyRight(C)
All Right Reserved 京ICP证号 京网文(-207号Powered by

参考资料

 

随机推荐