¿Cómo eliminar otras aplicaciones de caché de nuestra aplicación de Android?

Intento desarrollar una aplicación para Android que pueda borrar otros datos de caché de aplicaciones, traté de navegar por todos los blogs pero ninguno de ellos funcionó, puedo borrar el caché de mi aplicación con el siguiente código

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

Mi código de manifiesto

  

Probé el código en 2.2, 2.3 y 4.0

y después de ver la publicación en el siguiente enlace de Android: Borrar el caché de todas las aplicaciones?

Cambié mi código a

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

Quiero borrar el caché de otras aplicaciones, ¿algún cuerpo puede ayudarme, por favor corríjanme si me equivoco, gracias de antemano.

Esta API ya no es compatible con API 23, es decir, Marshmallow. El permiso está en desuso en Marshmallow.

Pero hay otra forma de pedir permiso de tiempo de ejecución para Accesorios . Pruebe la aplicación All-in-one Toolbox de Play Store. Esta aplicación puede borrar otras caché de aplicaciones incluso en Marshmallow. Entonces debería ser posible que lo hagamos.

Estoy investigando sobre esto. Una vez que encuentre la solución, actualizaré la respuesta. Gracias.


LA ANTERIOR RESPUESTA ES LA SIGUIENTE


Utilicé el siguiente código y ahora puedo borrar todo el caché de la aplicación sin rooting, me funciona perfectamente,

 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 

Y también cree un pacakge en su carpeta src con el nombre android.content.pm dentro de ese paquete, cree un archivo con el nombre IPackageDataObserver.aidl y pegue el siguiente código en él

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

y en su manifiesto, asegúrese de utilizar el siguiente código

  

Si encuentran algún problema, no duden en ponerse en contacto conmigo, gracias.

La memoria caché no es solo una cosa. Para cada aplicación hay una carpeta de caché en las carpetas de datos del sistema y una carpeta de caché para cada partición de almacenamiento disponible (una en la tarjeta sd interna del dispositivo y si hay una tarjeta sd externa, hay una allí también)

Entonces, para borrar el caché en las carpetas de datos del sistema, haga esto

 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. 

Debido a que no tiene acceso a las carpetas del sistema para eliminarlas usted mismo en un dispositivo no rooteado, educadamente le pide a Android que lo haga por usted.

Para borrar el caché en las carpetas de datos que no son del sistema, haga esto

 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 ){} } } } } } } 

Todo en una caja de herramientas NO borra la memoria caché de las carpetas de datos del sistema en marshmellow porque no es posible sin acceso a la raíz. Solo utiliza la segunda técnica y borra parte del caché total. Para lograr eso en la API 23 y superior sin acceso raíz, debe ser una aplicación de sistema porque no hay forma de solicitar el permiso android.permission.CLEAR_APP_CACHE utilizando la API de permiso.

Otra alternativa es agregar el archivo layoutlib.jar ubicado en el directorio \ sdk \ platforms \ android-19 \ data a la biblioteca de su proyecto. Podrá resolver esa y otras clases sin tener que agregarla manualmente al código fuente.

Debo agregar que estas clases no se agregarán a tu binario. Solo te permitirá resolver las clases.