2011-12-12 33 views
5

Aygıtta yüklü olan tüm üçüncü taraf uygulamaların uygulama önbelleğini programlı olarak temizleyebilen bir uygulama yazıyorum. Android 2,2Android uygulama önbelleğini nasıl temizleyebilirim?

public static void trimCache(Context myAppctx) { 

    Context context = myAppctx.createPackageContext("com.thirdparty.game", 
      Context.CONTEXT_INCLUDE_CO|Context.CONTEXT_IGNORE_SECURITY); 

    File cachDir = context.getCacheDir();   
    Log.v("Trim", "dir " + cachDir.getPath()); 

    if (cachDir!= null && cachDir.isDirectory()) { 

     Log.v("Trim", "can read " + cachDir.canRead()); 
     String[] fileNames = cachDir.list(); 
     //Iterate for the fileName and delete 
    } 
} 

için kod parçası aşağıdadır Benim tezahür aşağıdaki izinlere sahip:

android.permission.CLEAR_APP_CACHE
android.permission.DELETE_CACHE_FILES

Şimdi problem olduğunu Önbellek dizininin adı yazdırılır, ancak cachDir.list() dosyalarının listesi her zaman null değerini döndürür. Dosya listesi her zaman boş olduğundan önbellek dizinini silemiyorum.

Uygulama önbelleğini temizlemenin başka yolu var mı?

+0

Bunun için rootlu bir cihaza ihtiyacınız yok mu? Doğru izin verilen –

cevap

6

"android.permission.CLEAR_APP_CACHE" android.permission.DELETE_CACHE_FILES"

sen CLEAR_APP_CACHE tutun çıkarabilirler. DELETE_CACHE_FILES izni tutamayacak

Olağan SDK uygulamaları, izin verir Android SDK hiçbir şey yoktur bir uygulamanın önbelleğini temizleyin.

uygulama önbelleği temizlemek için başka bir yolu var mı?

Bu önbellekteki dosyaları silerek kendi önbelleğinizi temizleyebilirsiniz.

+0

, harici depolamadaki diğer uygulamaların önbellek klasörlerini kaldırabilirsiniz (yalnızca). Aynı değil, ancak birçok uygulama bu dosyaları geçici dosyalar koymak için ana yer olarak kullanıyor. –

+0

Kullanıcıların ne zaman önbelleği tıklatabildiğini bilmek istiyorum bildirim alabilirim veya başka bir şey nasıl alabilirim ?? –

+0

@KOUSIKdaniel: Önbelleği temizlemeden önce işleminizin sonlandırılacağını düşünüyorum * ama bundan emin değilim. Aldığın başka bir bildirimi bilmiyorum. – CommonsWare

2

poate iti ASTA android.content.pm.PackageManager.clearApplicationUserData

static int clearCacheFolder(final File dir, final int numDays) { 

     int deletedFiles = 0; 
     if (dir!= null && dir.isDirectory()) { 
      try { 
       for (File child:dir.listFiles()) { 

        //first delete subdirectories recursively 
        if (child.isDirectory()) { 
         deletedFiles += clearCacheFolder(child, numDays); 
        } 

        //then delete the files and subdirectories in this dir 
        //only empty directories can be deleted, so subdirs have been done first 
        if (child.lastModified() < new Date().getTime() - numDays * DateUtils.DAY_IN_MILLIS) { 
         if (child.delete()) { 
          deletedFiles++; 
         } 
        } 
       } 
      } 
      catch(Exception e) { 
       Log.e("ATTENTION!", String.format("Failed to clean the cache, error %s", e.getMessage())); 
      } 
     } 
     return deletedFiles; 
    } 

    public static void clearCache(final Context context, final int numDays) { 
     Log.i("ADVL", String.format("Starting cache prune, deleting files older than %d days", numDays)); 
     int numDeletedFiles = clearCacheFolder(context.getCacheDir(), numDays); 
     Log.i("ADVL", String.format("Cache pruning completed, %d files deleted", numDeletedFiles)); 
    } 
+1

Çalıştı. Tercih ettiğim: her dosya için yeni bir 'now' örneğini bildirmek yerine, döngüden önce ' long = new Date(). GetTime(); ' . –

0

Bu kongre açısından ne kadar uygun emin değilim, ama bu benim Küresel Uygulama sınıfında benim için şimdiye kadar çalışır: Elbette

File[] files = cacheDir.listFiles(); 
    for (File file : files){ 
     file.delete(); 
    } 

, bu iç içe geçmiş dizinleri gidermez, hangi benim test güvenilmez olduğu için

deleteFiles(cacheDir); 

private void deleteFiles(File dir){ 
    if (dir != null){ 
     if (dir.listFiles() != null && dir.listFiles().length > 0){ 
      // RECURSIVELY DELETE FILES IN DIRECTORY 
      for (File file : dir.listFiles()){ 
       deleteFiles(file); 
      } 
     } else { 
      // JUST DELETE FILE 
      dir.delete(); 
     } 
    } 
} 

Ben File.isDirectory kullanmıyordu: böyle bir özyinelemeli fonksiyonu (değil alt dizinleri ile yoğun olarak test) ile yapılabilir.

İlgili konular