当前位置: 首页 > 知识库问答 >
问题:

如何从我们的android应用程序中删除其他应用程序缓存?

齐英韶
2023-03-14

我试图开发一个android应用程序,可以擦除其他应用程序的缓存数据,我试图浏览所有的博客,但没有一个对我有效,我可以通过以下代码清除我的应用程序的缓存

File cache = getCacheDir();
            File appDir = new File(cache.getParent());
            if (appDir.exists()) 
            {
                String[] children = appDir.list();
                for (String s : children) 
                {
                    if (!s.equals("lib"))
                    {
                        deleteDir(new File(appDir, s));
                        Toast.makeText(DroidCleaner.this, "Cache Cleaned", Toast.LENGTH_LONG).show();
                        Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
                    }
                }
            }

public static boolean deleteDir(File dir) 
{
    if (dir != null && dir.isDirectory()) 
    {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) 
        {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) 
            {
                return false;
            }
        }
    }
    return dir.delete();
}
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
PackageManager  pm = getPackageManager();
// Get all methods on the PackageManager
Method[] methods = pm.getClass().getDeclaredMethods();
for (Method m : methods) {
    if (m.getName().equals("freeStorage")) {
        // Found the method I want to use
        try {
            long desiredFreeStorage = 8 * 1024 * 1024 * 1024; // Request for 8GB of free space
        m.invoke(pm, desiredFreeStorage , null);
    } catch (Exception e) {
        // Method invocation failed. Could be a permission problem
    }
    break;
   }
}

我想清除其他应用程序的缓存,可以任何机构请帮助我,如果我错了请纠正我,提前谢谢。

共有1个答案

谭煜
2023-03-14

在API23中不再支持这个API,即Marshmallow。在marshmallow中不推荐使用权限。

但还有另一种方法,即请求附件的运行时许可。尝试应用程序多合一工具箱从播放商店。这个应用程序能够清除其他应用程序缓存,甚至在Marshmallow。那么我们应该有可能这样做。

我正在研究这个。一旦我找到了解决方案,我将更新答案。谢了。

private static final long CACHE_APP = Long.MAX_VALUE;
private CachePackageDataObserver mClearCacheObserver;

btnCache.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            clearCache();
        }
    });//End of btnCache Anonymous class

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);

      /*
       * Start of inner try-catch block
       */
      try 
      {
        localMethod.invoke(mPM, localLong, 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();
    }
}//End of clearCache() method

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

    }//End of onRemoveCompleted() method
}//End of CachePackageDataObserver instance inner class
package android.content.pm;

/**
 * API for package data change related callbacks from the Package Manager.
 * Some usage scenarios include deletion of cache directory, generate
 * statistics related to code, data, cache usage(TODO)
 * {@hide}
 */
oneway interface IPackageDataObserver {
    void onRemoveCompleted(in String packageName, boolean succeeded);
}

在清单中,请确保使用了以下代码

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

如果你们发现任何问题,请随时联系我,谢谢。

 类似资料:
  • 有没有办法取消发布,然后从Android开发者控制台的应用程序列表中永久删除一个应用程序?

  • 我想捕捉一个在我的手机上运行的Android应用程序的屏幕截图。 我尝试使用屏幕截图UX应用程序。这也可以在无根电话上完成。你知道如何从后台运行的服务中获取Android应用程序的屏幕截图吗? 我希望我的服务定期捕捉屏幕,并发送到服务器。

  • 似乎大多数方法在Android M中都不起作用了。 作为参考,我在讨论中使用了以下代码:Android:清除所有应用程序的缓存? 与此权限相结合 因为我认为它不会删除某些应用程序的缓存,而是删除足够多的应用程序,以清除预期的ram大小...但是设置应用程序可以清除某些应用程序的缓存 更新就像例外答案解释的那样,在Android M及以上的设备上,似乎没有办法删除没有root的tha应用缓存。但如果

  • 问题内容: 我希望能够启动活动或服务并尽快获取该进程的PID,这将是最好的情况。除了浏览/ proc目录外,我是否还有其他选择,否则会导致活动/服务启动到我在proc中找到所需时间之间的时间量竞争状态发生变化目录并开始观察? 问题答案: 我认为您需要使用ActivityManager:有关过程信息,请参见http://developer.android.com/reference/android/

  • 我使用Android11,目标是: compileSdkVersion 31 defaultConfig { applicationId “com.pro.prowh” minSdkVersion 24 targetSdkVersion 31 versionCode 16 versionName “22.01.12” } 在清单中,我使用: MyApp创建文件夹/storage/emulated/