2012-12-26 7 views
5

मैं, और जब मैं PackageManager में एक छिपे हुए विधि आह्वान मैं एक SecurityException मिलता है, हालांकि मैं अपने ऐप का उपयोग करता है-अनुमति दी हुई है "DELETE_CACHE_FILES"SecurityException जब कॉल एक कैश-क्लीनर आवेदन विकासशील विधि परिलक्षित

उपयोग-अनुमतियां:

uses-permission android:name="android.permission.DELETE_CACHE_FILES" 
uses-permission android:name="android.permission.CLEAR_APP_CACHE" 
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" 
uses-permission android:name="android.permission.GET_PACKAGE_SIZE" 

परिलक्षित विधि:

Method method = getPackageManager().getClass().getMethod("deleteApplicationCacheFiles", String.class, IPackageDataObserver.class); 

त्रुटि:

java.lang.reflect.InvocationTargetException 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at <MY_PACKAGE_NAME>.MainActivity$1.onClick(MainActivity.java:70) 
at android.view.View.performClick(View.java:2485) 
at android.view.View$PerformClick.run(View.java:9080) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:3683) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.SecurityException: Neither user 10037 nor current process has android.permission.DELETE_CACHE_FILES. 
at android.os.Parcel.readException(Parcel.java:1322) 
at android.os.Parcel.readException(Parcel.java:1276) 
at android.content.pm.IPackageManager$Stub$Proxy.deleteApplicationCacheFiles(IPackageManager.java:2346) 
at android.app.ContextImpl$ApplicationPackageManager.deleteApplicationCacheFiles(ContextImpl.java:2562) 
... 14 more 

लाइन 70:

method.invoke(getPackageManager(), app.packageName, dataObserver); 

इसे कहते हैं मैं नहीं है कि आपके पास अनुमति है, लेकिन मैं अपने प्रकट में यह decleared है ...

संपादित करें: मुझे पता चला यह;

W/PackageManager(62): Not granting permission android.permission.DELETE_CACHE_FILES to package <MY_PACKAGE_NAME>.cachecleaner (protectionLevel=3 flags=0x8be46) 

EDIT2: deleteApplicationCacheFiles की घोषणा (method.toGenericString() के माध्यम से यह मिल गया):

public void android.app.ContextImpl$ApplicationPackageManager.deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver) 
+0

इस के लिए कोई समाधान मिला? मैं उत्सुक हूँ –

+0

@Mylleranton क्या आपको कोई समाधान मिला है? – Erum

+0

@ErumHannan मुझे एक समाधान खोजने याद है, लेकिन यह कुछ साल पहले था। मुझे कुछ आधा आवेदन लिखना भी याद है (भयानक लग रहा है) लेकिन कैश सफाई भाग कम से कम काम करता था और लागू किया गया था। चूंकि मुझे याद नहीं है कि मैंने समस्या को कैसे ठीक किया है, मैं पूरी परियोजना को जोड़ रहा हूं: https://www.dropbox.com/s/fjz221fbojm06uj/Utilities2.zip?dl=0 हालांकि आप चाहें कोड का उपयोग करने के लिए स्वतंत्र महसूस करें । – MAA

उत्तर

5

DELETE_CACHE_FILES एक signature|system अनुमति है, जिसका अर्थ है कि यह केवल उन ऐप्स द्वारा आयोजित किया जा सकता है जो फर्मवेयर की हस्ताक्षर कुंजी के साथ हस्ताक्षरित हैं या सिस्टम विभाजन पर स्थापित हैं (उदाहरण के लिए, रूट द्वारा एड डिवाइस उपयोगकर्ता)। सामान्य एसडीके अनुप्रयोग इस अनुमति को पकड़ नहीं सकते हैं।

+0

के बाद मैं एक और अनुप्रयोग कैश की सफाई के बारे में कैसे जाउंगा? यदि ये अनुमतियां मुझे कैश निर्देशिका तक पहुंचने से रोकती हैं, तो मैं क्या करूँगा? – MAA

+1

@Mylleranton: मुझे किसी व्यक्तिगत एप्लिकेशन के कैश को साफ़ करने का कोई तरीका नहीं है। – CommonsWare

+0

यदि मैं एक डिवाइस व्यवस्थापक के रूप में अपना आवेदन जोड़ता हूं, तो क्या यह तब काम करेगा? या, क्या मुझे तब अनुमति दी जाएगी? – MAA

1

आप इस आह्वान है:

method.setAccessible(true); 
+0

मैंने कोशिश की, लेकिन जब मैं इसे चलाता हूं, तो मुझे एक ही त्रुटि मिली – MAA

+0

आप अनुमतियां कहां रखते हैं? मेरा मतलब है कि मेनिफेस्ट फाइल में कौन सा सेक्शन है? –

+0

के अंदर और MAA

3
try to use this i tried this code and it worked for me... 

private static final long CACHE_APP = Long.MAX_VALUE; 
private CachePackageDataObserver mClearCacheObserver; 
void clearCache() { 
    if (mClearCacheObserver == null) { 
     mClearCacheObserver = new CachePackageDataObserver(); 
    } 

    PackageManager mPM = getPackageManager(); 

    @SuppressWarnings("rawtypes") 
    final Class[] classes = { Long.TYPE, IPackageDataObserver.class }; 

    Long localLong = Long.valueOf(CACHE_APP); 

    try { 
     Method localMethod = mPM.getClass().getMethod(
       "freeStorageAndNotify", classes); 

     /* 
     * Method localMethod=mPM.getClass() 
     * .getDeclaredMethod("deleteApplicationCacheFiles", String.class, 
     * IPackageDataObserver.class); 
     */ 
     /* 
     * Start of inner try-catch block 
     */ 
     try { 
      localMethod.invoke(mPM, localLong, mClearCacheObserver); 
      // localMethod.invoke(mPM, packageName, mClearCacheObserver); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     /* 
     * End of inner try-catch block 
     */ 
    } catch (NoSuchMethodException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
} 

private class CachePackageDataObserver extends IPackageDataObserver.Stub { 
    public void onRemoveCompleted(String packageName, boolean succeeded) { 
     runOnUiThread(new Runnable() { 
      public void run() { 

       Toast.makeText(MainActivity.this, "cache memory cleared", 
         5000).show(); 
      } 
     }); 

     Log.d("cachedel", "cache deleted"); 
    }// End of onRemoveCompleted() method 
} 
+0

ऐसा लगता है कि एंड्रॉइड 6 पर यह संभव नहीं है – ATom

+0

यह सभी अनुप्रयोगों के लिए कैश साफ़ करता है – zenden2k

0

premission

android.permission.CLEAR_APP_CACHE

के साथ इस समारोह freeStorageAndNotify की कोशिश करो।