前言
前段時間公司專案有個功能需要用到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哪個版本就不太清除,反正第一個方法獲取不到,就會走第二個方法,這樣就能達到相容的效果。
好了,希望對你有幫助。