How to check if my app is allowed to show notification

后端 未结 6 1015
执念已碎
执念已碎 2020-12-05 06:49

In Android settings users can turn off notification if they don\'t want to. So is there any method that like isNotificationAllowed() to check is my app is allow

相关标签:
6条回答
  • 2020-12-05 07:06

    Try this:

    Is there a way an app can check if it is allowed to access notifications?

    And there's a bit more explaination here:

    Check for access to notifications using NotificationListenerService

    0 讨论(0)
  • 2020-12-05 07:07

    Try this:

    if (Settings.Secure.getString(getActivity().getContentResolver(), "enabled_notification_listeners").contains(getActivity().getPackageName())) {
        // Notification access service already enabled
        Toast.makeText(getActivity(),"notification enabled",Toast.LENGTH_LONG).show();
    } else {
        Intent intent = new Intent();
        intent.setClassName("com.android.settings", "com.android.settings.Settings$AppNotificationSettingsActivity");
        intent.putExtra("app_package", getPackageName());
        intent.putExtra("app_uid", getApplicationInfo().uid);
        startActivity(intent);
    }
    
    0 讨论(0)
  • 2020-12-05 07:07
    if(NotificationManagerCompat.from(context).areNotificationsEnabled())
    {
     //Do your Work
    }
    else
    {
         //Ask for permission
    }
    
    0 讨论(0)
  • 2020-12-05 07:15

    Here is more complete answer to this question

    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
    }
    
    0 讨论(0)
  • 2020-12-05 07:26

    EDIT - New Answer:

    Seems like google added the proper API call: NotificationManagerCompat.from(context).areNotificationsEnabled()


    OLD ANSWER:

    For anyone who is looking at this question, note that NotificationListenerService is different from "Show Notification". These two are different things! If an app has access to NotificationListenerService does not mean that its notifications are shown and vice versa. In order to check if user has blocked notification from your app or not, you can use reflection:

    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;
    }
    }
    

    Source: https://code.google.com/p/android/issues/detail?id=38482

    0 讨论(0)
  • 2020-12-05 07:29
    NotificationManagerCompat.from(context).areNotificationsEnabled()
    

    seems like a way to go.

    0 讨论(0)
提交回复
热议问题