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

4,898 阅读2分钟

前言

前段时间公司项目有个功能需要用到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;
    }

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

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

好了,希望对你有帮助。