Как удалить кеш других приложений из нашего приложения для Android?

Я пытаюсь разработать приложение для 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"/> 

Я проверил код на 2.2, 2.3 и 4.0

И после просмотра сообщения в следующей ссылке Android: Очистить кеш всех приложений?

Я изменил свой код на

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

Я хочу очистить кэш других приложений, может ли любой орган, пожалуйста, помогите мне, пожалуйста, поправьте меня, если я ошибаюсь, спасибо заранее.

Этот API больше не поддерживается в API 23, то есть в 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 

А также создайте pacakge в своей папке src с именем android.content.pm внутри этого пакета, создайте файл с именем IPackageDataObserver.aidl и вставьте в него следующий код

 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"/> 

Если вы, ребята, находите какую-либо проблему, не стесняйтесь обращаться ко мне, спасибо.

Другая альтернатива – добавить файл layoutlib.jar, расположенный в каталоге \ sdk \ platform \ android-19 \ data , в библиотеку вашего проекта. Вы сможете решить этот и другие классы без необходимости вручную добавлять их в исходный код.

Я должен добавить, что эти классы не будут добавлены в ваш двоичный файл. Это позволит вам разрешить кланы.

Кэш – это не просто одно. Для каждого приложения есть папка с кешем в папках системных данных и одна папка с кешем для каждого доступного раздела хранения (один на внутренней SD-карте устройства, и если есть внешняя SD-карта, то там тоже есть)

Таким образом, чтобы очистить кеш в папках системных данных, вы делаете это

 Method method = pmClass.getDeclaredMethod("freeStorageAndNotify", new Class[] { Long.TYPE, Class.forName("android.content.pm.IPackageDataObserver") }); method.setAccessible(true); method.invoke(con.getPackageManager(), Long.MAX_MALUE, null); //null is for the IPackageDataObserver object that let's you know when the process is done and it is not necessary to provide. 

Поскольку у вас нет доступа к системным папкам, чтобы удалить их самостоятельно в ненастроенном устройстве, чтобы вы вежливо попросили Android сделать это за вас.

Чтобы очистить кеш в папках с несистемными данными, вы делаете это

 for(String storageVolumePath:storageVolumePaths) { File androidDataFolder = new File((String) storageVolumePath + "/Android/data/"); if (androidDataFolder.exists()) { File[] filesList = androidDataFolder.listFiles(); if (filesList != null) { for (File file : filesList) { if (file.isDirectory()) { file = new File(file.getAbsolutePath() + "/cache/"); if(file.exists()) { try { deleteFile(file); }catch (Exception e ){} } } } } } } 

Все в одной панели инструментов НЕ очищает кеш из системных папок данных в marshmellow, потому что это невозможно без доступа root. Он использует только второй метод и очищает часть общего кеша. Чтобы достичь этого в API 23 и выше без корневого доступа, вам необходимо быть системным приложением, потому что нет способа запросить разрешение android.permission.CLEAR_APP_CACHE с использованием API разрешений