Borrar datos de usuario de la aplicación de Android

108

Usar adb shell para borrar los datos de la aplicación

adb shell pm clear com.android.browser

Pero al ejecutar ese comando desde la aplicación

String deleteCmd = "pm clear com.android.browser";      
        Runtime runtime = Runtime.getRuntime();
        try {
            runtime.exec(deleteCmd);
        } catch (IOException e) {
            e.printStackTrace();                
        }

Problema:

No borra los datos del usuario ni da ninguna excepción, aunque he dado el siguiente permiso.

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

Pregunta:

¿Cómo borrar los datos de la aplicación usando adb shell ?

UdayaLakmal
fuente
3
¿Encontró alguna solución para borrar datos para aplicaciones externas?
Anshuman Jaiswal
2
No crea que una aplicación de terceros debería tener permiso para borrar los datos de usuario de otra aplicación. Sería un desastre si eso sucediera.
StoneLam

Respuestas:

5

Los datos de la aplicación Afaik the Browser NO se pueden borrar para otras aplicaciones, ya que se almacenan en formato private_mode. Por lo tanto, la ejecución de este comando probablemente solo funcione en dispositivos rooteados. De lo contrario, debería intentar otro enfoque.

Thkru
fuente
Las herramientas de línea de comandos no están diseñadas para que las utilicen las aplicaciones. Es probable que solo funcionen para el usuario de adb shell semi-privilegiado, que se trata como algo comparable en autoridad a un usuario que presiona botones en la GUI si la aplicación de configuración del sistema.
Chris Stratton
210

Este comando funcionó para mí:

adb shell pm clear packageName
Manmohan Soni
fuente
2
¿Es posible usar adb para borrar el caché también?
desarrollador de Android
4
@EduardoCuomo Por supuesto. Quise decir: ¿es posible usar adb para borrar solo el caché también?
desarrollador de Android
1
@Shayan Puede consultar el siguiente enlace para eliminar solo el caché de la aplicación: stackoverflow.com/questions/18589471/… No estoy seguro de que este comando funcione o no.
Manmohan Soni
5

El comando pm clear com.android.browserrequiere permiso de root.
Entonces, corre suprimero.

Aquí está el código de ejemplo:

private static final String CHARSET_NAME = "UTF-8";
String cmd = "pm clear com.android.browser";

ProcessBuilder pb = new ProcessBuilder().redirectErrorStream(true).command("su");
Process p = pb.start();

// We must handle the result stream in another Thread first
StreamReader stdoutReader = new StreamReader(p.getInputStream(), CHARSET_NAME);
stdoutReader.start();

out = p.getOutputStream();
out.write((cmd + "\n").getBytes(CHARSET_NAME));
out.write(("exit" + "\n").getBytes(CHARSET_NAME));
out.flush();

p.waitFor();
String result = stdoutReader.getResult();

La clase StreamReader:

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.CountDownLatch;

class StreamReader extends Thread {
    private InputStream is;
    private StringBuffer mBuffer;
    private String mCharset;
    private CountDownLatch mCountDownLatch;

    StreamReader(InputStream is, String charset) {
        this.is = is;
        mCharset = charset;
        mBuffer = new StringBuffer("");
        mCountDownLatch = new CountDownLatch(1);
    }

    String getResult() {
        try {
            mCountDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return mBuffer.toString();
    }

    @Override
    public void run() {
        InputStreamReader isr = null;
        try {
            isr = new InputStreamReader(is, mCharset);
            int c = -1;
            while ((c = isr.read()) != -1) {
                mBuffer.append((char) c);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (isr != null)
                    isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mCountDownLatch.countDown();
        }
    }
}
fantouch
fuente
3

Para borrar los datos de la aplicación, intente de esta manera.

    public void clearApplicationData() {
    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));Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
            }
        }
    }
}

public static boolean deleteDir(File dir) {
    if (dir != null &amp;&amp; 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();
}
Md Abdul Gafur
fuente
Intento esto, usar esto puede borrar los datos de la caché de nuestra propia aplicación, necesito borrar los datos de otra aplicación de nuestra aplicación
UdayaLakmal
2
@UdayaLakmal, se supone que no puedes borrar los datos de la caché de otra aplicación, porque Android está diseñado para proteger las aplicaciones de acciones potencialmente maliciosas de otras aplicaciones.
Chris Stratton
1

Hola UdayaLakmal,

public class MyApplication extends Application {
    private static MyApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static MyApplication getInstance(){
        return instance;
    }

    public void clearApplicationData() {
        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));
                    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();
    }
}

Por favor, marque esto y hágamelo saber ...

Puede descargar el código desde aquí

Strider
fuente
-2
// To delete all the folders and files within folders recursively
File sdDir = new File(sdPath);

if(sdDir.exists())
    deleteRecursive(sdDir);




// Delete any folder on a device if exists
void deleteRecursive(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory())
    for (File child : fileOrDirectory.listFiles())
        deleteRecursive(child);

    fileOrDirectory.delete();
}
Dios mío
fuente
1
Esto eliminaría (si se usa con el permiso apropiado) los archivos compartidos en el almacenamiento externo sin tener en cuenta la asociación de la aplicación. Que no va a eliminar los archivos privados de cualquier aplicación, que es lo que la pregunta era sobre.
Chris Stratton
-6

Si desea hacerlo manualmente, también puede borrar sus datos de usuario haciendo “Clear Data” clic en el botón en Settings–>Applications–>Manage Aplications–> SU APLICACIÓN

or Is there any other way to do that?

Entonces descargue el código aquí

ingrese la descripción de la imagen aquí

Strider
fuente
Quiero hacer eso pragmáticamente, ese ejemplo que sugieres, ya lo probé, pero eso no es lo que estoy buscando
UdayaLakmal
Si probó ese, por favor comparta que lo probó. ok déjame buscar otra manera .. !!
Strider