为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Android

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


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消