2015-12-03 4 views
6

मेरे पास पृष्ठभूमि में एक अधिसूचना लिस्टनर सेवा चल रही है और जब मैं सेटिंग्स को निष्पादित करता हूं तो यह एक अपवाद फेंकता है। सिस्टम.canWrite (सेटिंग्स.java:3742)मार्शमलो: किसी सेवा से सेटिंग्स.System.canWrite (संदर्भ) निष्पादित नहीं कर सकता

12-03 18:25:33.490 2754-2771/? W/System.err﹕ java.lang.SecurityException: uid 10057 does not have android.permission.UPDATE_APP_OPS_STATS. 
12-03 18:25:33.490 2754-2771/? W/System.err﹕ at android.os.Parcel.readException(Parcel.java:1599) 
12-03 18:25:33.490 2754-2771/? W/System.err﹕ at android.os.Parcel.readException(Parcel.java:1552) 
12-03 18:25:33.490 2754-2771/? W/System.err﹕ at com.android.internal.app.IAppOpsService$Stub$Proxy.checkOperation(IAppOpsService.java:327) 
12-03 18:25:33.490 2754-2771/? W/System.err﹕ at android.app.AppOpsManager.checkOpNoThrow(AppOpsManager.java:1536) 
12-03 18:25:33.490 2754-2771/? W/System.err﹕ at android.provider.Settings.isCallingPackageAllowedToPerformAppOpsProtectedOperation(Settings.java:8425) 
12-03 18:25:33.490 2754-2771/? W/System.err﹕ at android.provider.Settings.isCallingPackageAllowedToWriteSettings(Settings.java:8320) 
12-03 18:25:33.490 2754-2771/? W/System.err﹕ at android.provider.Settings$System.canWrite(Settings.java:3742) 

ऐसा इसलिए है क्योंकि प्रदत्त संदर्भ एक सेवा है क्योंकि यह किसी गतिविधि से कॉल होने पर नहीं होता है।

उत्तर

3

यह एक "बग" है, हालांकि जैसा कि आपने कहा था, इस विधि को NotificationListenerService से कॉल करने की उम्मीद नहीं है। आपको इसे सामान्य Activty या Service से कॉल करना चाहिए। मैं इसे बाद में क्यों समझाऊंगा।

आपके ट्रेस के अनुसार निम्नलिखित स्थिति है।

android.app.AppOpsManager.checkOpNoThrow(AppOpsManager.java:1536)

/** 
    * Like {@link #checkOp} but instead of throwing a {@link SecurityException} it 
    * returns {@link #MODE_ERRORED}. 
    * @hide 
    */ 
    public int checkOpNoThrow(int op, int uid, String packageName) { 
     try { 
      return mService.checkOperation(op, uid, packageName); //1536 
     } catch (RemoteException e) { 
     } 
     return MODE_ERRORED; 
    } 

यहाँ यह हालांकि Parcel (android.os.Parcel.readException(Parcel.java:1599)) में यह हो रहा है RemoteException पकड़ने की कोशिश कर रहा है:

public final void readException(int code, String msg) { 
    switch (code) { 
     case EX_SECURITY: 
      throw new SecurityException(msg); // 1599 
     case EX_BAD_PARCELABLE: 
      throw new BadParcelableException(msg); 
     case EX_ILLEGAL_ARGUMENT: 
      throw new IllegalArgumentException(msg); 
     case EX_NULL_POINTER: 
      throw new NullPointerException(msg); 
     case EX_ILLEGAL_STATE: 
      throw new IllegalStateException(msg); 
     case EX_NETWORK_MAIN_THREAD: 
      throw new NetworkOnMainThreadException(); 
     case EX_UNSUPPORTED_OPERATION: 
      throw new UnsupportedOperationException(msg); 
    } 
    throw new RuntimeException("Unknown exception code: " + code 
      + " msg " + msg); 
} 

यह एक SecurityException फेंक रहा है।

SecurityExceptionRemoteExceptioncheckOpNoThrow में अपवाद को पकड़ने में विफल होने में विफल रहता है और आपको त्रुटि मिलती है।

यदि आप श्रोता सेवा के संदर्भ के बजाय एप्लिकेशन के संदर्भ (उदा। this.getApplicationContext()) का उपयोग करने का प्रयास करते हैं, तो यह भी एक त्रुटि का कारण बन जाएगा। यह कॉलर के यूआईडी के लिए canWrite की जांच के कारण है। अधिसूचना श्रोता के आपके आवेदन के अन्य हिस्सों से अलग यूआईडी है।

public static boolean canWrite(Context context) { 
      int uid = Binder.getCallingUid(); 
      return isCallingPackageAllowedToWriteSettings(context, uid, getPackageNameForUid(
        context, uid), false); 
     } 

संपादित

इस बग AOSP issue tracker पर नज़र रखी है।

+2

एंड्रॉइड 6.0.1 पर पुन: उत्पादित - आपके द्वारा लिखे गए अंतिम कोड को – cuihtlauac

+0

तय नहीं किया गया है, क्या यह एप्लिकेशन के यूआईडी को प्राप्त करना है और लिखने की सेटिंग्स की जांच करने के लिए इसका उपयोग करना चाहिए? आपके द्वारा लिखे गए – Olayinka

+0

कोड> यह एसडीके में विधि का कार्यान्वयन है। हां, ऐसा करना है, लेकिन इस मामले में अधिसूचना लिस्टनर सेवा ऐप के अन्य हिस्सों के समान प्रक्रिया के तहत नहीं चल रही है, और इससे अप्रत्याशित समस्या होती है। – csenga

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