Pergunta

O Android 4.1 oferece ao usuário uma caixa de seleção para desativar notificações de um aplicativo específico.

No entanto, como desenvolvedores, não temos como saber se uma chamada para notificação foi eficaz ou não.

Eu realmente preciso verificar se as notificações estão desabilitadas para o aplicativo atual, mas não consigo encontrar nenhuma configuração para isso na API.

Existe alguma maneira de verificar essa configuração no código?

Foi útil?

Solução

Você não pode 100% não pode.

É perguntado em Este vídeo do Google I / O 2012 e o projeto levam para o novoNotificações declaram que você não pode.


.

editar

2016 update: agora você pode verificar, como disse em esteGoogle I / O 2016 vídeo .

use NotificationManagerCompat.areNotificationsEnabled() , deBiblioteca de suporte, para verificar se as notificações são bloqueadas na API 19+.As versões abaixo da API 19 retornarão true (notificações estão ativadas).

 Digite a descrição da imagem aqui

Outras dicas

Na verdade, isso é muito fácil de fazer:

/**
 * Created by desgraci on 5/7/15.
*/
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;
    }
}

A resposta de @blundell está correta, mas há uma pequena alteração nas versões mais recentes.

NotificationManagerCompat.from(context).areNotificationsEnabled(‌​)

Se você estiver usando o Xamarin e precisar dessa resposta, poderá usar este código:

//return true if this option is not supported.
public class NotificationsUtils 
{
    private const String CHECK_OP_NO_THROW = "checkOpNoThrow";
    private const String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";

    public static bool IsNotificationEnabled(global::Android.Content.Context context) {

        AppOpsManager mAppOps = (AppOpsManager) context.GetSystemService(global::Android.Content.Context.AppOpsService);

        ApplicationInfo appInfo = context.ApplicationInfo;

        String pkg = context.ApplicationContext.PackageName;

        int uid = appInfo.Uid;

        try {

            var appOpsClass = Java.Lang.Class.ForName("android.app.AppOpsManager");
            var checkOpNoThrowMethod = appOpsClass.GetMethod(CHECK_OP_NO_THROW,Java.Lang.Integer.Type,Java.Lang.Integer.Type,new Java.Lang.String().Class);//need to add String.Type

            var opPostNotificationValue = appOpsClass.GetDeclaredField (OP_POST_NOTIFICATION);
            var value = (int)opPostNotificationValue.GetInt(Java.Lang.Integer.Type);
            var mode = (int)checkOpNoThrowMethod.Invoke(mAppOps,value, uid, pkg);
            return (mode == (int)AppOpsManagerMode.Allowed);

        } catch (Exception) 
        {
            System.Diagnostics.Debug.WriteLine  ("Notification services is off or not supported");
        } 
        return true;
    }
}

Parece que não há como consultar o estado de notificação.

Eu recomendo isto:

  • Design você aplicação com notificações.
  • permite que o usuário desative as notificações das configurações do aplicativo.
  • Verifique se as notificações são clicadas.Se o usuário clica na notificação, salve isso para as preferências.
  • no seu aplicativo, se a configuração de notificação estiver ativada, e se o usuário for Android 4.1+ (API 16), mas se o usuário não clicar em Notificação por alguns dias / semanas, assuma que as notificações desativadas pelo usuário.

    Não 100% correto.Mas isso dá uma opinião.
    Por exemplo, se o usuário não clicar em qualquer notificação de aplicativo por 10 a 15 dias, provavelmente ele desabilitou

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top