From 56bd78e17f2ded5156895317f387d2a8e1f7f86f Mon Sep 17 00:00:00 2001 From: hanjiahu Date: Tue, 30 Apr 2019 17:02:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8Dvivo=E7=9A=84=E6=82=AC?= =?UTF-8?q?=E6=B5=AE=E7=AA=97=E6=9D=83=E9=99=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 17 +- .../java/com/han/devtool/MainActivity.java | 11 +- .../ezy/assist/compat/SettingsCompat.java | 149 +++++++++++++++--- 3 files changed, 141 insertions(+), 36 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e94c0d0..5bccc84 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,10 +2,23 @@ - - + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/han/devtool/MainActivity.java b/app/src/main/java/com/han/devtool/MainActivity.java index d973c05..2366e27 100644 --- a/app/src/main/java/com/han/devtool/MainActivity.java +++ b/app/src/main/java/com/han/devtool/MainActivity.java @@ -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); diff --git a/ezy-settings-compat/src/main/java/ezy/assist/compat/SettingsCompat.java b/ezy-settings-compat/src/main/java/ezy/assist/compat/SettingsCompat.java index 6ad1b64..76e28c7 100755 --- a/ezy-settings-compat/src/main/java/ezy/assist/compat/SettingsCompat.java +++ b/ezy-settings-compat/src/main/java/ezy/assist/compat/SettingsCompat.java @@ -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; @@ -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) { @@ -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)); } @@ -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)); @@ -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; @@ -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; } @@ -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; @@ -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); } @@ -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); } @@ -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); } }