2016-10-03 4 views
13

मेरे पास एक सूची दृश्य है जिसमें इंस्टॉल किए गए एप्लिकेशन की सूची है और प्रत्येक एप्लिकेशन के लिए, मुझे यह जानना होगा कि नोटिफिकेशन सक्षम हैं या नहीं। वर्तमान में मैं नीचे दिए गए कोड का उपयोग कर रहा जानना चाहते हैं कि सूचनाएं सक्षम हैं:कैसे पता चले कि सूचनाएं एंड्रॉइड में किसी एप्लिकेशन के लिए सक्षम हैं या नहीं?

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, appUID, appPackage) == AppOpsManager.MODE_ALLOWED); 

मैं निम्न अपवाद है: java.lang.SecurityException::

की वजह से uid 10062 नहीं है android.permission.UPDATE_APP_OPS_STATS। डब्ल्यू/System.err: android.os.Parcel.readException (Parcel.java:1683) डब्ल्यू/System.err: android.os.Parcel.readException (Parcel.java:1636) डब्ल्यू/System.err पर : com.android.internal.app.IAppOpsService $ स्टब $ Proxy.checkOperation (IAppOpsService.java:343)

पर मैं

<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS"/> 

फिर भी मैं एक ही त्रुटि मिल रही शामिल किया है। क्या उपयोग कर एपिस मैं() मान चाहे वह अवरुद्ध है या नहीं

Using what apis can I get these values?

+1

ऐप बनाने के लिए आप किस एपीआई संस्करण का उपयोग कर रहे हैं और आप किस एंड्रॉइड संस्करण पर अपने ऐप का परीक्षण कर रहे हैं? मैं यह पूछ रहा हूं क्योंकि एंड्रॉइड 6 और उसके बाद के कुछ संवेदनशील अनुमतियों के लिए, आपको रनटाइम पर उपयोगकर्ताओं से अनुमति प्राप्त करने की आवश्यकता है। https://developer.android.com/training/permissions/requesting.html –

+0

देखें कि 'NotificationManager.getNotificationPolicy()' यह आपके लिए करता है या नहीं। [लिंक] (https://developer.android.com/reference/android/app/NotificationManager.html#getNotificationPolicy()) – sonictt1

उत्तर

2

अगर आप NotificationManagerCompat.areNotificationsEnabled उपयोग कर सकते हैं प्राप्त कर सकते हैं https://developer.android.com/reference/android/support/v4/app/NotificationManagerCompat.html#areNotificationsEnabled()

Android 4.1: How to check notifications are disabled for the application?

+0

अधिसूचना प्रबंधक Compat.areNotificationsEnabled() देता है कि चल रहे एप्लिकेशन के लिए सूचनाएं सक्षम हैं या नहीं। यह आवश्यक है कि किसी दिए गए एप्लिकेशन (यूआईडी और पैकेज नाम के साथ) अधिसूचनाएं बंद हो जाएं (सभी को अवरुद्ध करें) या – developer1011

7

मुझे डर लग रहा यह केवल है वर्तमान आवेदन के लिए संभव है। यही कारण है कि NotificationManager के सार्वजनिक एपीआई में वर्तमान पैकेज के लिए areNotificationsEnabled() फ़ंक्शन है।

एंड्रॉइड स्रोत कोड में देखते समय, मुझे AppNotificationSettings - एप्लिकेशन अधिसूचना सेटिंग्स मिलीं। पहला स्विच इंगित करता है कि सूचनाएं अवरुद्ध हैं या नहीं। स्विच श्रोता here है, जो NotificationBackend पर इंगित करता है। इस वर्ग में, वहाँ विधि है:

public boolean getNotificationsBanned(String pkg, int uid)

जो INotificationManager (एक वर्ग संकलन के दौरान .aidl फ़ाइल से) का उपयोग करता है और यह विधि है:

boolean areNotificationsEnabledForPackage(String pkg, int uid);

यह Android निजी एपीआई है, नहीं कर सकते बस बुलाया जाना चाहिए। इसलिए मैं प्रतिबिंब की कोशिश की:

try { 
    NotificationManager mNotificationManager = null; 
    Class<?> c = Class.forName("android.app.NotificationManager"); 
    Method method = c.getMethod("getService"); 
    Object obj = method.invoke(mNotificationManager); 
    Class<?> clazz = Class.forName("android.app.INotificationManager$Stub$Proxy"); 
    Method areNotificationsEnabledForPackage = clazz.getMethod("areNotificationsEnabledForPackage", String.class, int.class); 
    boolean blocked = (boolean) areNotificationsEnabledForPackage.invoke(obj, getPackageName(), android.os.Process.myUid()); 
    Log.d(MainActivity.class.getSimpleName(), String.valueOf(blocked)); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

लेकिन, जैसा कि आप देख सकते हैं, तो आपको पहले NotificationManager बनाना होगा। अफसोस की बात है, यह वर्ग पैकेज के लिए बनाया गया है। तो केवल के लिए के लिए इच्छा उपरोक्त कोड:

boolean blocked = (boolean) areNotificationsEnabledForPackage.invoke(obj, getPackageName(), android.os.Process.myUid()); 

लेकिन इस काम नहीं करेगा:

//InvocationTargetException will be thrown. 
boolean blocked = (boolean) areNotificationsEnabledForPackage.invoke(obj, "com.android.camera", 10040); 

निष्कर्ष:

नहीं किया जा सकता है।

+0

मुझे पता है कि यह बहुत पुराना है, लेकिन आप 'अंतिम इनोटिफिकेशन प्रबंधक iNotificationManager = INotificationManager.Stub.asInterface ( ServiceManager.getService (Context.NOTIFICATION_SERVICE)); 'और वास्तविक चल रहे सेवा उदाहरण प्राप्त करें और पुन: निर्मित प्रति-पैकेज एक नहीं। क्या यह आपको आईटीई के बिना अन्य पैकेजों की जांच करने की अनुमति देगा? –

संबंधित मुद्दे

 संबंधित मुद्दे