2012-12-26 28 views
5

Tôi đang phát triển một ứng dụng Cache-Cleaner, và khi tôi gọi một phương thức ẩn trong PackageManager tôi nhận được một SecurityException, mặc dù tôi đã cho ứng dụng của tôi những ứng dụng-phép "DELETE_CACHE_FILES"SecurityException trong Android khi gọi phản ánh phương pháp

Việc sử dụng-Quyền:

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" 

phương pháp phản ánh:

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

Các Lỗi:

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 

Dòng 70:

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

Nó nói rằng tôi không có sự cho phép, nhưng tôi đã decleared nó trong manifest của tôi ...

EDIT: tôi phát hiện ra này;

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

EDIT2: Tuyên bố của deleteApplicationCacheFiles (nhận nó qua method.toGenericString()):

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

Có giải pháp nào cho vấn đề này không? Tôi tò mò –

+0

@Mylleranton có u tìm thấy giải pháp nào không? – Erum

+0

@ErumHannan Tôi nhớ đã tìm ra một giải pháp, nhưng đó là một vài năm trước. Tôi cũng nhớ viết một số ứng dụng thực hiện một nửa (trông khủng khiếp) nhưng phần làm sạch bộ nhớ cache ít nhất là làm việc và được thực hiện. Vì tôi không nhớ làm cách nào để khắc phục sự cố, tôi sẽ đính kèm toàn bộ dự án: https://www.dropbox.com/s/fjz221fbojm06uj/Utilities2.zip?dl=0 Hãy sử dụng mã mà bạn muốn . – MAA

Trả lời

5

DELETE_CACHE_FILES là một signature|system phép, ý nghĩa rằng nó chỉ có thể được giữ bởi các ứng dụng được ký bằng khóa ký của chương trình cơ sở hoặc được cài đặt trên phân vùng hệ thống (ví dụ, bằng một gốc người dùng thiết bị ed). Các ứng dụng SDK thông thường không thể giữ quyền này.

+0

Làm cách nào để tôi dọn dẹp bộ nhớ cache của ứng dụng khác? Nếu các quyền này ngăn tôi truy cập vào thư mục bộ nhớ cache, thì tôi sẽ làm gì? – MAA

+1

@ Mylleranton: Tôi không biết cách nào để bạn xóa bộ nhớ cache của một ứng dụng riêng lẻ. – CommonsWare

+0

Nếu tôi thêm ứng dụng của mình làm quản trị viên thiết bị, ứng dụng có hoạt động sau đó không? Hoặc, tôi có được cấp phép đó không? – MAA

1

Bạn gọi này:

method.setAccessible(true); 
+0

Tôi đã thử điều đó, nhưng khi tôi chạy nó, tôi gặp lỗi tương tự – MAA

+0

Bạn đặt quyền ở đâu? Ý tôi là trong phần nào trong tệp kê khai? –

+0

Bên trong và sau 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

Có vẻ như điều này là không thể trên Android 6 nữa – ATom

+0

Nó xóa bộ nhớ cache cho tất cả aplication – zenden2k

0

Hãy thử chức năng này freeStorageAndNotify với premission

android.permission.CLEAR_APP_CACHE

.

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