关于MIUI悬浮窗权限问题的解决方案

先扯会....好久没写Blog了....这段时间有点小忙...瞎忙.....忙的自己都感觉都不应该.....严重影响了生活质量......生活的幸福指数!!!.....到现在还特么的单身!!!求介绍啊......

MIUI是我个人非常喜欢的ROM....虽然有诸多的不爽....但是搞开发就能理解.....写好一个产品是多么的不易.....好多东西的不可控....精力的有限! 现在买手机都看能不能刷MIUI..不能刷的就犹豫了.....

===============盗链....盗内容的都是Erbility, Shability  ========================

===============http://www.cnblogs.com/fangyucun/p/4027750.html=================

步入正题.....解决这个问题...无非就是2点

1.跳转

2.判断是否真的打开

......代码打开是别想了....要不然人家也不能弄着玩啊.....除非是你发现了什么....

跳转的思路很简单..手动找到那个界面..看看是哪个Activity.

   public static ComponentName getTopComponentName(Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);
        ComponentName componentName = taskInfo.get(0).topActivity;
        return componentName;
    }

再通过ComponentName想知道什么不行啊.....不知道怎么执行....能想到这个问题...不应该吧....随便建议一下....跑个线程

下面就是跳转了....

  /**
     * 打开MIUI权限管理界面(MIUI v5, v6)
     * @param context
     */
    public static void openMiuiPermissionActivity(Context context) {
        Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
        String rom = RomUtils.getRom();

        if (RomUtils.ROM_MIUI_V5.equals(rom)) {
            PackageInfo pInfo = null;
            try {
                pInfo = context.getPackageManager().getPackageInfo(packageName, 0);
            } catch (NameNotFoundException e) {
                Flog.e(e);
            }
            intent.setClassName(SETTINGS_PACKAGE_NAME, "com.miui.securitycenter.permission.AppPermissionsEditor");
            intent.putExtra("extra_package_uid", pInfo.applicationInfo.uid);

        } else if (RomUtils.ROM_MIUI_V6.equals(rom)) {
            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
            intent.putExtra("extra_pkgname", context.getPackageName());
        }

        if (isIntentAvailable(context, intent)) {
            if (context instanceof Activity) {
                Activity a = (Activity) context;
                a.startActivityForResult(intent, 2);
            }
        } else {
            Flog.e("Intent is not available!");
        }
    }

很可惜....V5的悬浮窗权限在应用详情里面...

  @TargetApi(9)
    public static void openAppDetailActivity(Context context, String packageName) {
        Intent intent = null;
        if (Build.VERSION.SDK_INT >= 9) {
            intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            Uri uri = Uri.fromParts(SCHEME_PACKAGE, packageName, null);
            intent.setData(uri);
        } else {
            final String className = Build.VERSION.SDK_INT == 8 ?
                    SETTINGS_APPDETAILS_CLASS_NAME_22 : SETTINGS_APPDETAILS_CLASS_NAME_B21;
            intent = new Intent(Intent.ACTION_VIEW);
            intent.setClassName(SETTINGS_PACKAGE_NAME, SETTINGS_APPDETAILS_CLASS_NAME);
            intent.putExtra(className, packageName);
        }
        if (isIntentAvailable(context, intent)) {
            context.startActivity(intent);
        } else {
            Flog.e("intent is not available!");
        }
    }

另外加了个Intent的判断

  /**
     * 判断是否有可以接受的Activity
     * @param context
     * @param action
     * @return
     */
    public static boolean isIntentAvailable(Context context, Intent intent) {
        if (intent == null) return false;
        return context.getPackageManager().queryIntentActivities(intent, PackageManager.GET_ACTIVITIES).size() > 0;
    }

v5, v6不知道怎么判断? 好吧...有点跑题了....

    public static String getSystemProperty() {
        String line = null;
        BufferedReader reader = null;
        try {
            Process p = Runtime.getRuntime().exec("getprop ro.miui.ui.version.name" );
            reader = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
            line = reader.readLine();
            return line;
        } catch (IOException e) {
            Flog.e(e);
        } finally {
            IoUtils.close(reader);
        }
        return "UNKNOWN";
    }    

根据返回的是V5还是V6判断

=====完成跳转.....下面就是判断了......自己是没琢磨出来....问的MIUI的工程师.....小帅哥太帅了.....感谢.....

    /**
     * 判断MIUI的悬浮窗权限
     * @param context
     * @return
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public static boolean isMiuiFloatWindowOpAllowed(Context context) {
        final int version = Build.VERSION.SDK_INT;

        if (version >= 19) {
            checkOp(context, OP_SYSTEM_ALERT_WINDOW);  //自己写就是24 为什么是24?看AppOpsManager
        } else {
            if ((context.getApplicationInfo().flags & 1<<27) == 1) {
                return true;
            } else {
                return false;
            }
        }
        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);
            try {
                if (AppOpsManager.MODE_ALLOWED == (Integer)ReflectUtils.invokeMethod(manager, "checkOp", op,                     Binder.getCallingUid(), context.packageName())) {  //这儿反射就自己写吧
                    return true;
                } else {
                    return false;
                }
            } catch (Exception e) {
                Flog.e(e.getMessage());
            }
        } else {
            Flog.e("Below API 19 cannot invoke!");
        }
        return false;
    }

到这儿就完事了...没想到牵扯的代码还挺多.......

时间: 2024-10-10 05:23:30

关于MIUI悬浮窗权限问题的解决方案的相关文章

悬浮窗 权限

/** * 判断是有悬浮框权限 * @return */public static boolean canDrawOverlays(Context context) { try { return Settings.canDrawOverlays(context); } catch (NoSuchMethodError e) { }}/** * 判断是否缺少权限 * @param permission * @return */public static boolean checkSelfPermi

突破小米悬浮窗权限控制--不需要权限的悬浮窗

突破小米悬浮窗权限控制–不需要权限的悬浮窗 在上一篇文章讲了Android的Toast拓展,在原生Toast基础上对显示时长和显示动画做了二次封装,强化了Toast的部分功能.也分析了对于二次封装的ExToast设计原理,以及Toast的关键点.如果不了解的可以看看下面的链接. Toast拓展–自定义显示时间和动画 常用悬浮窗与Toast 之前分析过,Toast其实就是系统悬浮窗的一种,那它跟常用的系统悬浮窗有什么区别呢? 先看一下常用的Andoird系统悬浮窗写法: // 获取应用的Conte

Android 悬浮窗权限校验

原文:Android 悬浮窗权限校验 悬浮窗权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 权限检验和请求: //检查是否已经授予权限,大于6.0的系统适用,小于6.0系统默认打开,无需理会 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M&&!Settings.canDrawOverlays(

【图文教程】小米4如何获取触动精灵悬浮窗权限

机型:小米4 系统:4.4.4 1. 打开设置,在界面底部找到其他应用管理,点击 2. 在打开的界面找到触动精灵并点击 3. 在应用详情界面上滑,点击底部的权限管理 4. 点击悬浮窗管理,在弹出的底部菜单选择允许

Android 悬浮窗各机型各系统适配大全

这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时,感兴趣或者找到其他机型适配方法的请留言告诉我,或者加群544645972一起交流一下,非常感谢~ 相关权限请看我的另一篇博客:android permission权限与安全机制解析(下),或者关于权限的案例使用:android WindowManager解析与骗取QQ密码案例分析. 转载请注明出处

Android无需权限显示悬浮窗, 兼谈逆向分析app

最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android.permission.SYSTEM_ALERT_WINDOW权限. 如下图, 截图是在使用Chrome时截的, 但是屏幕顶部却有UC的view浮在屏幕上. 我使用的是小米, 我并没有给UC授悬浮窗权限, 所以我看到这个悬浮窗时是很震惊的. 截图 悬浮窗原理 做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要

查看应用悬浮窗是否开启的方法(针对MIUI, EMUI)

支持原著:http://www.cnblogs.com/KennyXia/p/4332642.html 针对目前市面上存在大量的MIUI.EMUI的手机,作为开发人员,有时需要查看应用的悬浮窗是否开启,但是没有一个好的方法获取这个值,我和公司同事想到这个方法: /** * 判断悬浮窗权限 * * @param context 上下文 */ public static boolean isFloatWindowOpAllowed(Context context) { final int versi

Android WindowManager悬浮窗:不需要申请权限实现悬浮

?? Android WindowManager悬浮窗:不需要申请权限实现悬浮 附录文章1介绍了Android平台上的悬浮窗WindowManager,WindowManager悬浮窗可以悬浮在Android设备上的桌面窗口之上,但是WindowManager的使用,必须先申请权限,在一些定制的Android操作系统中,有可能会将WindowManager悬浮窗的权限一律屏蔽掉,这就导致基于WindowManager的APP功能难以实现.然而,可以变通的通过设置WindowManager的类型,

权限-悬浮窗

申明:低级码农问题解决中的参考和解决后的小结,仅用于个人记录,能力有限,可能有些错误,缺陷不自知,欢迎在评论中指正,谢谢! 需要申请悬浮窗权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 判断悬浮窗权限的方法(8.0以上,有的机型不需要判断,比如我的Meizu X8): android.provider.Settings.canDrawOverlays(Context) 使