2015-01-07 20 views
9

Trong cài đặt Android, người dùng có thể tắt thông báo nếu họ không muốn. Vậy có phương pháp nào giống như isNotificationAllowed() để kiểm tra xem ứng dụng của tôi có được phép hiển thị thông báo không? Và làm cách nào để mở trang cài đặt android để hướng dẫn người dùng của tôi bật thông báo?Cách kiểm tra xem ứng dụng của tôi có được phép hiển thị thông báo

+0

Điều này có thể giúp bạn: http://stackoverflow.com/questions/24145343/checking-android-system-security-notification-access-setting-programmatically – TheTanic

+1

có thể trùng lặp của [Android 4.1: Làm thế nào để kiểm tra thông báo là bị vô hiệu hóa cho ứng dụng?] (http://stackoverflow.com/questions/11649151/android-4-1-how-to-check-notifications-are-disabled-for-the-application) – Sam

Trả lời

28

EDIT - New trả lời:

Có vẻ như google thêm cuộc gọi API thích hợp: NotificationManagerCompat.from(context).areNotificationsEnabled()


OLD ĐÁP:

Đối với bất cứ ai nhìn vào câu hỏi này, lưu ý NotificationListenerService đó là khác biệt so với "Hiển thị thông báo ". Hai thứ này là những thứ khác nhau! Nếu ứng dụng có quyền truy cập vào NotificationListenerService không có nghĩa là thông báo của ứng dụng được hiển thị và ngược lại. Để kiểm tra xem người dùng đã bị chặn thông báo từ ứng dụng của bạn hay không, bạn có thể sử dụng phản ánh:

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

Nguồn: https://code.google.com/p/android/issues/detail?id=38482

+0

cảm ơn! nó giúp rất nhiều! –

+0

Cảm ơn bạn! Bạn đã cứu ngày của tôi! –

+0

AppOpsManager đã được thêm vào API cấp 19 (Android 4.4), do đó, điều này chỉ có thể được sử dụng cho cấp API 19+ – nibarius

-1

Hãy thử điều này:

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

Điều này là dành cho NotificationListenerService, khác với SHOW NOTIFICATION !!! – Kasra

24
NotificationManagerCompat.from(context).areNotificationsEnabled() 

vẻ giống như một con đường để đi.

+0

Tôi đã thử nghiệm điều này bằng cách thay đổi thủ công các quyền thông báo trong cài đặt và nó hoạt động tốt, boolean đã được trả lại chính xác trong cả hai trường hợp. Giải pháp một dòng tuyệt vời. Và chỉ trong thời gian .. Tôi đã tìm kiếm các giải pháp chỉ một vài giờ sau khi câu trả lời này đã được đăng .. nên thời gian tốt :) Cảm ơn! – gnB

+0

@gnB đẹp! vui vì nó đã giúp;) – asamoylenko

+0

Đây phải là câu trả lời được chấp nhận +1 – Sniper

Các vấn đề liên quan