如何检查我的应用是否允许显示通知

Yun*_*Lee 28 notifications android android-notifications

在Android设置中,如果用户不愿意,可以关闭通知.那么有什么方法isNotificationAllowed()可以检查我的应用是否允许显示通知?以及如何打开android设置页面来引导我的用户打开通知?

Kas*_*sra 65

编辑 - 新答案:

好像谷歌添加了正确的API调用: NotificationManagerCompat.from(context).areNotificationsEnabled()


老答案:

对于正在查看此问题的任何人,请注意NotificationListenerService与"显示通知"不同.这两个是不同的东西!如果应用有权访问NotificationListenerService并不意味着显示其通知,反之亦然.要检查用户是否已阻止来自您应用的通知,您可以使用反射:

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() {

    AppOpsManager mAppOps = (AppOpsManager) GlobalContext.getContext().getSystemService(Context.APP_OPS_SERVICE);

    ApplicationInfo appInfo = GlobalContext.getContext().getApplicationInfo();

    String pkg = GlobalContext.getContext().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;
}
}
Run Code Online (Sandbox Code Playgroud)

来源:https://code.google.com/p/android/issues/detail?id = 38842


asa*_*nko 40

NotificationManagerCompat.from(context).areNotificationsEnabled()
Run Code Online (Sandbox Code Playgroud)

似乎是一种方法.


Abh*_*sal 9

这是这个问题的更完整答案

fun areNotificationsEnabled(context: Context, channelId: String = "fcm_fallback_notification_channel"): Boolean {
    // check if global notification switch is ON or OFF
    if (NotificationManagerCompat.from(context).areNotificationsEnabled())
        // if its ON then we need to check for individual channels in OREO
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val channel = manager.getNotificationChannel(channelId)
            return channel?.importance != NotificationManager.IMPORTANCE_NONE
        } else {
            // if this less then OREO it means that notifications are enabled
            true
        }
    // if this is less then OREO it means that notifications are disabled
    return false
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

21470 次

最近记录:

6 年,4 月 前