Skip to content

Commit

Permalink
适配vivo的悬浮窗权限。
Browse files Browse the repository at this point in the history
  • Loading branch information
hanjiahu committed Apr 30, 2019
1 parent f05c64a commit 56bd78e
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 36 deletions.
17 changes: 15 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,23 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.han.devtool">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.READ_LOGS" />

<!-- Window -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

<!-- Network -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- IO -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<!-- Setting -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />


<!-- 'Sup Koush: https://plus.google.com/103583939320326217147/posts/T9xnMJEnzf1 -->
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
Expand Down
11 changes: 1 addition & 10 deletions app/src/main/java/com/han/devtool/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,18 +66,9 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
}

case R.id.manage:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(!Settings.canDrawOverlays(getApplicationContext())) {
//启动Activity让用户授权
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent,100);
}
} else {
SettingsCompat.manageDrawOverlays(this);
}

break;

case R.id.toggle:
boolean granted1 = SettingsCompat.canDrawOverlays(this);
SettingsCompat.setDrawOverlays(this, !granted1);
Expand Down
149 changes: 125 additions & 24 deletions ezy-settings-compat/src/main/java/ezy/assist/compat/SettingsCompat.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@

import android.Manifest;
import android.app.AppOpsManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
Expand Down Expand Up @@ -65,16 +67,97 @@ public static boolean setWriteSettings(Context context, boolean allowed) {
}

public static void manageDrawOverlays(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (RomUtil.isVivo()) {
gotoSoftPermissionDetailActivity(context);
} else {
//启动Activity让用户授权
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
if (manageDrawOverlaysForRom(context)) {
return;
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

}

public static void gotoSoftPermissionDetailActivity(Context context) {
Intent intent = new Intent();
intent.putExtra("packagename",context.getPackageName());
intent.putExtra("title","test");
//i管家包名 6.0有不相同的两款手机
intent.setComponent(ComponentName.unflattenFromString("com.iqoo.secure/.safeguard.SoftPermissionDetailActivity"));
if (startSafely(context,intent)){
return;
}
intent.setComponent(ComponentName.unflattenFromString("com.vivo.permissionmanager/.activity.SoftPermissionDetailActivity"));
if (startSafely(context,intent)){
return;
}
}

/**
* 获取悬浮窗权限状态
*
* @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比较新的系统获取方法
*/
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;
}

public static void manageWriteSettings(Context context) {
Expand Down Expand Up @@ -114,8 +197,10 @@ private static boolean manageDrawOverlaysForRom(Context context) {
private static boolean checkOp(Context context, int op) {
AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
Method method = AppOpsManager.class.getDeclaredMethod("checkOp", int.class, int.class, String.class);
return AppOpsManager.MODE_ALLOWED == (int) method.invoke(manager, op, Binder.getCallingUid(), context.getPackageName());
Method method = AppOpsManager.class.getDeclaredMethod("checkOp", int.class, int.class,
String.class);
return AppOpsManager.MODE_ALLOWED == (int) method.invoke(manager, op,
Binder.getCallingUid(), context.getPackageName());
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
}
Expand All @@ -124,15 +209,18 @@ private static boolean checkOp(Context context, int op) {

// 可设置Android 4.3/4.4的授权状态
private static boolean setMode(Context context, int op, boolean allowed) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2 || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2
|| Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return false;
}

AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
Method method = AppOpsManager.class.getDeclaredMethod("setMode", int.class, int.class, String.class, int.class);
method.invoke(manager, op, Binder.getCallingUid(), context.getPackageName(), allowed ? AppOpsManager.MODE_ALLOWED : AppOpsManager
.MODE_IGNORED);
Method method = AppOpsManager.class.getDeclaredMethod("setMode", int.class, int.class,
String.class, int.class);
method.invoke(manager, op, Binder.getCallingUid(), context.getPackageName(),
allowed ? AppOpsManager.MODE_ALLOWED : AppOpsManager
.MODE_IGNORED);
return true;
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
Expand All @@ -142,7 +230,8 @@ private static boolean setMode(Context context, int op, boolean allowed) {
}

private static boolean startSafely(Context context, Intent intent) {
if (context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
if (context.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
return true;
Expand All @@ -157,11 +246,13 @@ private static boolean startSafely(Context context, Intent intent) {
private static boolean manageDrawOverlaysForMiui(Context context) {
Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
intent.putExtra("extra_pkgname", context.getPackageName());
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.setClassName("com.miui.securitycenter",
"com.miui.permcenter.permissions.AppPermissionsEditorActivity");
if (startSafely(context, intent)) {
return true;
}
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
intent.setClassName("com.miui.securitycenter",
"com.miui.permcenter.permissions.PermissionsEditorActivity");
if (startSafely(context, intent)) {
return true;
}
Expand All @@ -181,13 +272,15 @@ private static boolean manageDrawOverlaysForMiui(Context context) {
private static boolean manageDrawOverlaysForEmui(Context context) {
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
intent.setClassName(HUAWEI_PACKAGE, "com.huawei.systemmanager.addviewmonitor.AddViewMonitorActivity");
intent.setClassName(HUAWEI_PACKAGE,
"com.huawei.systemmanager.addviewmonitor.AddViewMonitorActivity");
if (startSafely(context, intent)) {
return true;
}
}
// Huawei Honor P6|4.4.4|3.0
intent.setClassName(HUAWEI_PACKAGE, "com.huawei.notificationmanager.ui.NotificationManagmentActivity");
intent.setClassName(HUAWEI_PACKAGE,
"com.huawei.notificationmanager.ui.NotificationManagmentActivity");
intent.putExtra("showTabsNumber", 1);
if (startSafely(context, intent)) {
return true;
Expand Down Expand Up @@ -215,18 +308,21 @@ private static boolean manageDrawOverlaysForOppo(Context context) {
intent.putExtra("packageName", context.getPackageName());
// OPPO A53|5.1.1|2.1
intent.setAction("com.oppo.safe");
intent.setClassName("com.oppo.safe", "com.oppo.safe.permission.floatwindow.FloatWindowListActivity");
intent.setClassName("com.oppo.safe",
"com.oppo.safe.permission.floatwindow.FloatWindowListActivity");
if (startSafely(context, intent)) {
return true;
}
// OPPO R7s|4.4.4|2.1
intent.setAction("com.color.safecenter");
intent.setClassName("com.color.safecenter", "com.color.safecenter.permission.floatwindow.FloatWindowListActivity");
intent.setClassName("com.color.safecenter",
"com.color.safecenter.permission.floatwindow.FloatWindowListActivity");
if (startSafely(context, intent)) {
return true;
}
intent.setAction("com.coloros.safecenter");
intent.setClassName("com.coloros.safecenter", "com.coloros.safecenter.sysfloatwindow.FloatWindowListActivity");
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.sysfloatwindow.FloatWindowListActivity");
return startSafely(context, intent);
}

Expand All @@ -241,11 +337,13 @@ private static boolean manageDrawOverlaysForFlyme(Context context) {
// 360
private static boolean manageDrawOverlaysForQihu(Context context) {
Intent intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.Settings$OverlaySettingsActivity");
intent.setClassName("com.android.settings",
"com.android.settings.Settings$OverlaySettingsActivity");
if (startSafely(context, intent)) {
return true;
}
intent.setClassName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity");
intent.setClassName("com.qihoo360.mobilesafe",
"com.qihoo360.mobilesafe.ui.index.AppEnterActivity");
return startSafely(context, intent);
}

Expand All @@ -257,17 +355,20 @@ private static boolean manageDrawOverlaysForSmartisan(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// 锤子 坚果|5.1.1|2.5.3
Intent intent = new Intent("com.smartisanos.security.action.SWITCHED_PERMISSIONS_NEW");
intent.setClassName("com.smartisanos.security", "com.smartisanos.security.SwitchedPermissions");
intent.setClassName("com.smartisanos.security",
"com.smartisanos.security.SwitchedPermissions");
intent.putExtra("index", 17); // 不同版本会不一样
return startSafely(context, intent);
} else {
// 锤子 坚果|4.4.4|2.1.2
Intent intent = new Intent("com.smartisanos.security.action.SWITCHED_PERMISSIONS");
intent.setClassName("com.smartisanos.security", "com.smartisanos.security.SwitchedPermissions");
intent.setClassName("com.smartisanos.security",
"com.smartisanos.security.SwitchedPermissions");
intent.putExtra("permission", new String[]{Manifest.permission.SYSTEM_ALERT_WINDOW});

// Intent intent = new Intent("com.smartisanos.security.action.MAIN");
// intent.setClassName("com.smartisanos.security", "com.smartisanos.security.MainActivity");
// intent.setClassName("com.smartisanos.security", "com.smartisanos.security
// .MainActivity");
return startSafely(context, intent);
}
}
Expand Down

0 comments on commit 56bd78e

Please sign in to comment.