In Android-Anwendungen muss man manchmal wissen, ob Systembenachrichtigungen aktiviert sind, um mit dem nächsten Schritt fortzufahren. Daher ist das Abrufen dieses Status sehr notwendig. Früher hatte ich Mühe, eine geeignete Lösung zu finden, weil es das System betrifft, das nicht einfach zu handhaben ist. Heute habe ich einen Expertentipp gesehen, ihn ausprobiert, und er funktioniert sehr gut. Ich poste ihn hier für alle — nehmt diese Empfehlung an!
Bilder sprechen für sich. Gehen Sie zunächst zu den Einstellungen und deaktivieren Sie den Benachrichtigungsschalter für diese App:
Klicken Sie dann in der App auf die Schaltfläche, um den Status abzurufen:
Gehen Sie an dieser Stelle zurück zu den Einstellungen und aktivieren Sie den Benachrichtigungsschalter:
Klicken Sie in der App erneut auf die Testschaltfläche, und Sie können sehen, dass Benachrichtigungen jetzt verfügbar sind:
Der Code ist sehr klein, aber prägnant. Es ist nur eine Utility-Klasse, die das Java-Reflection-Prinzip verwendet:
public class NotificationsUtils {
private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
public static boolean isNotificationEnabled(Context context) {
AppOpsManager mAppOps = (AppOpsManager)
context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.uid;
Class appOpsClass = null; /* Context.APP_OPS_MANAGER */
try {
appOpsClass = Class.forName(AppOpsManager.class.getName());
Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class);
Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
int value = (int)opPostNotificationValue.get(Integer.class);
return ((int)checkOpNoThrowMethod.invoke(mAppOps,value, uid, pkg) == AppOpsManager.MODE_ALLOWED);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
}
Mitwirkender: Zhao Weiwei
Kontakt-E-Mail: 865397504@qq.com