package com.yidianling.medical import android.app.AppOpsManager import android.content.Context import android.content.Intent import android.content.pm.ApplicationInfo import android.net.Uri import android.os.Build import androidx.annotation.RequiresApi import java.lang.reflect.Field import java.lang.reflect.InvocationTargetException import java.lang.reflect.Method open class NotificationsUtils { companion object { private val CHECK_OP_NO_THROW = "checkOpNoThrow" private val OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION" @RequiresApi(Build.VERSION_CODES.KITKAT) fun isNotificationOpen(context: Context): Boolean { val mAppOps: AppOpsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager val appInfo: ApplicationInfo = context.getApplicationInfo() val pkg: String = context.getApplicationContext().getPackageName() val uid: Int = appInfo.uid var appOpsClass: Class<*>? = null /* Context.APP_OPS_MANAGER */ try { appOpsClass = Class.forName(AppOpsManager::class.java.getName()) val checkOpNoThrowMethod: Method = appOpsClass.getMethod( CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String::class.java ) val opPostNotificationValue: Field = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION) val value = opPostNotificationValue.get(Int::class.java) as Int return checkOpNoThrowMethod.invoke( mAppOps, value, uid, pkg ) as Int == AppOpsManager.MODE_ALLOWED } catch (e: ClassNotFoundException) { e.printStackTrace() } catch (e: NoSuchMethodException) { e.printStackTrace() } catch (e: NoSuchFieldException) { e.printStackTrace() } catch (e: InvocationTargetException) { e.printStackTrace() } catch (e: IllegalAccessException) { e.printStackTrace() } return false } fun getAppDetailSettingIntent(context: Context) { val localIntent = Intent() localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) if (Build.VERSION.SDK_INT >= 9) { localIntent.action = "android.settings.APPLICATION_DETAILS_SETTINGS" localIntent.data = Uri.fromParts("package", context.packageName, null) } else if (Build.VERSION.SDK_INT <= 8) { localIntent.action = Intent.ACTION_VIEW localIntent.setClassName( "com.android.settings", "com.android.settings.InstalledAppDetails" ) localIntent.putExtra("com.android.settings.ApplicationPkgName", context.packageName) } context.startActivity(localIntent) } } }