如何獲取Vivo系統的懸浮窗權限狀態

前言

前段時間公司項目有個功能須要用到Android系統裏面的懸浮窗功能,通常在實現這樣的功能的步驟都是先判斷懸浮窗權限是否對該應用打開,若是沒有打開,則跳到相關的頁權限頁面,引導用戶打開該開關。android

本文不討論如何跳到懸浮窗受權頁面,還有各類方法能夠繞過該權限實現懸浮窗,咱們就單純說一下如何在Vivo系統獲取該狀態。本人在這個問題上花了好幾天進行研究,搜遍各類博客和Github都沒找到答案,最後在反編譯某個安全管家的代碼得到的。但願能幫助有須要的同窗,而不要跟我同樣把時間花在這種技術含量較低的問題上。數據庫

解決方法

相信在作獲取懸浮窗狀態的同窗都已經解決了在通常的Android系統上獲取該狀態的,網上一搜都是一大把的。能夠參考一下相關文章安全

想必你已經發如今Vivo手機的FuntouchOS上獲取懸浮窗狀態時,無論打沒打開,都是返回打開的狀態給你。好了廢話很少說,直接貼代碼。bash

/**
     * 獲取懸浮窗權限狀態
     *
     * @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;
    }
複製代碼

是的!你沒看過,竟然是經過共享數據庫獲取的,沒想到吧。app

第一個方法是在比較舊的FuntouchOS上的方法,第二個是新的方法,具體是FuntouchOS哪一個版本就不太清除,反正第一個方法獲取不到,就會走第二個方法,這樣就能達到兼容的效果。ide

好了,但願對你有幫助。post

相關文章
相關標籤/搜索