继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

如何获取Vivo系统的悬浮窗权限状态

慕标5832272
关注TA
已关注
手记 1245
粉丝 229
获赞 1002

webp

image.png

前言

前段时间公司项目有个功能需要用到Android系统里面的悬浮窗功能,一般在实现这样的功能的步骤都是先判断悬浮窗权限是否对该应用打开,如果没有打开,则跳到相关的页权限页面,引导用户打开该开关。

本文不讨论如何跳到悬浮窗授权页面,还有各种方法可以绕过该权限实现悬浮窗,我们就单纯说一下如何在Vivo系统获取该状态。本人在这个问题上花了好几天进行研究,搜遍各种博客和Github都没找到答案,最后在反编译某个安全管家的代码获得的。希望能帮助有需要的同学,而不要跟我一样把时间花在这种技术含量较低的问题上。

解决方法

相信在做获取悬浮窗状态的同学都已经解决了在一般的Android系统上获取该状态的,网上一搜都是一大把的。可以参考一下相关文章

想必你已经发现在Vivo手机的FuntouchOS上获取悬浮窗状态时,不管打没打开,都是返回打开的状态给你。好了废话不多说,直接贴代码。

/**
     * 获取悬浮窗权限状态
     *
     * @param context
     * @return 1或其他是没有打开,0是打开,该状态的定义和{@link android.app.AppOpsManager#MODE_ALLOWED},MODE_IGNORED等值差不多,自行查阅源码
     */
    public static int getFloatPermissionStatus(Context context) {        if (context == null) {            throw new IllegalArgumentException("context is null");
        }
        String packageName = context.getPackageName();
        Uri uri = Uri.parse("content://com.iqoo.secure.provider.secureprovider/allowfloatwindowapp");
        String selection = "pkgname = ?";
        String[] selectionArgs = new String[]{packageName};
        Cursor cursor = context
                .getContentResolver()
                .query(uri, null, selection, selectionArgs, null);        if (cursor != null) {
            cursor.getColumnNames();            if (cursor.moveToFirst()) {                int currentmode = cursor.getInt(cursor.getColumnIndex("currentlmode"));
                cursor.close();                return currentmode;
            } else {
                cursor.close();                return getFloatPermissionStatus2(context);
            }

        } else {            return getFloatPermissionStatus2(context);
        }
    }    /**
     * vivo比较新的系统获取方法
     *
     * @param context
     * @return
     */
    private static int getFloatPermissionStatus2(Context context) {
        String packageName = context.getPackageName();
        Uri uri2 = Uri.parse("content://com.vivo.permissionmanager.provider.permission/float_window_apps");
        String selection = "pkgname = ?";
        String[] selectionArgs = new String[]{packageName};
        Cursor cursor = context
                .getContentResolver()
                .query(uri2, null, selection, selectionArgs, null);        if (cursor != null) {            if (cursor.moveToFirst()) {                int currentmode = cursor.getInt(cursor.getColumnIndex("currentmode"));
                cursor.close();                return currentmode;
            } else {
                cursor.close();                return 1;
            }
        }        return 1;
    }
复制代码

是的!你没看过,居然是通过共享数据库获取的,没想到吧。

webp

image.png

第一个方法是在比较旧的FuntouchOS上的方法,第二个是新的方法,具体是FuntouchOS哪个版本就不太清除,反正第一个方法获取不到,就会走第二个方法,这样就能达到兼容的效果。



作者:Android技术干货分享
链接:https://www.jianshu.com/p/edf6aacacfe0


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP

热门评论

查看全部评论