web-dev-qa-db-fra.com

Effacer Android données d'utilisateur de l'application

Utilisation de adb Shell pour effacer les données de l'application

adb Shell pm clear com.Android.browser

Mais lors de l'exécution de cette commande depuis l'application

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

Issue:

Cela ne supprime pas les données de l'utilisateur et ne donne aucune exception bien que j'aie donné l'autorisation suivante.

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

Question:

Comment effacer les données de l'application en utilisant adb Shell?

96
UdayaLakmal

Après l’utilisation du navigateur, les données de l’application Browser ne sont PAS effaçables pour d’autres applications, car elles sont stockées dans private_mode. Donc, l'exécution de cette commande pourrait probablement fonctionner uniquement sur des périphériques enracinés. Sinon, vous devriez essayer une autre approche.

4
Thkru

Cette commande a fonctionné pour moi:

adb Shell pm clear packageName
182
Manmohan Soni

La commande pm clear com.Android.browser nécessite une autorisation root.
Donc, lancez su en premier.

Voici l'exemple de code:

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

Pour effacer les données d'application, veuillez essayer de cette façon.

    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();
}
3
Md Abdul Gafur

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

S'il vous plaît vérifier cela et laissez-moi savoir ...

Vous pouvez télécharger le code de ici

1
Strider