美文网首页程序员Android开发Android技术知识
如何获取Vivo系统的悬浮窗权限状态

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

作者: 06fd4cf1f427 | 来源:发表于2019-02-25 20:39 被阅读172次
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;
    }
复制代码

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

image.png

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

好了,希望对你有帮助。

资料领取:

关注+点赞+加群:185873940 免费获取!

image

领取获取往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

相关文章

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

    前言 前段时间公司项目有个功能需要用到Android系统里面的悬浮窗功能,一般在实现这样的功能的步骤都是先判断悬浮...

  • 使用教程

    小米&华为&魅族打开悬浮窗权限 OPPO&VIVO打开悬浮权限 其他手机打开悬浮权限

  • Android悬浮窗探究

    需求:学习悬浮窗使用以及type参数影响 悬浮窗使用 在获得系统悬浮窗权限(SYSTEM_ALERT_WINDOW...

  • VIVO手机锁机无效?

    如果是VIVO手机,请一定一定在“i管家”里开启悬浮窗权限, 否则无效。 VIVO手机非常特殊,权限设置必须在“i...

  • OPPO&vivo

    vivo手机:打开i管家→软件管理→悬浮窗管理→找到王者美化精灵开启权限 OPPO手机:打开手机管家→权限隐私→悬...

  • Android权限适配(二)

    本文接 Android权限适配(一) 悬浮窗权限 悬浮窗权限同样属于上文中说到的特殊权限。 悬浮窗代码的设置 要使...

  • 悬浮窗上线

    [ 参考点: 悬浮窗(权限启动申请) || 悬浮窗( 权限使用时申请 )] -------------------...

  • android 悬浮窗

    安卓悬浮窗的书写,我们分为几个步骤: 1.添加悬浮窗权限 2.书写悬浮窗代码,搭建悬浮窗布局 3.判断悬浮窗权限是...

  • 检测是否具有悬浮窗权限Settings.canDrawOverl

    前情提要 有项目要实现悬浮窗,但在检查是否有悬浮窗权限时出现使用系统方法:Settings.canDrawOver...

  • 关于android 悬浮窗和自启动的设置, 以及获取系统的信息

    关于android 悬浮窗和自启动的设置, 以及获取系统的信息 标签(空格分隔):Android 悬浮窗 对于是否...

网友评论

    本文标题:如何获取Vivo系统的悬浮窗权限状态

    本文链接:https://www.haomeiwen.com/subject/imvgyqtx.html