Effacer les données utilisateur de l'application Android

109

Utilisation du shell adb pour effacer les données d'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();                
        }

Problème:

Cela n'efface pas les données 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 à l'aide du shell adb ?

UdayaLakmal
la source
3
Avez-vous trouvé une solution pour effacer les données pour une application externe?
Anshuman Jaiswal
2
Ne pensez pas qu'une application tierce devrait avoir l'autorisation d'effacer les données utilisateur d'une autre application. Ce serait un gâchis si cela arrivait.
StoneLam

Réponses:

5

Les données de l'application Afaik the Browser ne sont PAS effaçables pour d'autres applications, car elles sont stockées dans private_mode. L'exécution de cette commande pourrait donc ne fonctionner que sur des périphériques enracinés. Sinon, vous devriez essayer une autre approche.

Thkru
la source
Les outils de ligne de commande ne sont pas destinés à être utilisés par les applications. Ils ne fonctionneront probablement que pour l'utilisateur semi-privilégié du shell adb, qui est traité comme quelque peu comparable en termes d'autorité à un utilisateur poussant des boutons dans l'interface graphique si l'application des paramètres système.
Chris Stratton
210

Cette commande a fonctionné pour moi:

adb shell pm clear packageName
Manmohan Soni
la source
2
est-il possible d'utiliser adb pour vider le cache aussi?
développeur android
4
@EduardoCuomo Bien sûr. Je voulais dire: est-il possible d'utiliser adb pour effacer uniquement le cache?
développeur android
1
@Shayan Vous pouvez consulter le lien suivant pour supprimer uniquement le cache de l'application: stackoverflow.com/questions/18589471/… Je ne suis pas sûr que cette commande fonctionnera ou non.
Manmohan Soni le
5

La commande pm clear com.android.browsernécessite une autorisation root.
Alors, exécutez d' suabord.

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();
        }
    }
}
fantouch
la source
3

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();
}
Md Abdul Gafur
la source
J'essaye ceci, en utilisant ceci peut effacer nos propres données de cache d'application, j'ai besoin d'effacer les données d'utilisateur d'une autre application de notre application
UdayaLakmal
2
@UdayaLakmal, vous n'êtes pas censé pouvoir effacer les données de cache d'une autre application, car Android est conçu pour protéger les applications contre les actions potentiellement malveillantes d'autres applications.
Chris Stratton
1

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

Veuillez vérifier ceci et laissez-moi savoir ...

Vous pouvez télécharger le code ici

Strider
la source
-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();
}
Mon Dieu
la source
1
Cela supprimerait (si utilisé avec l'autorisation appropriée) les fichiers partagés sur le stockage externe sans égard à l'association d'application. Il ne supprimera pas les fichiers privés d'aucune application, ce sur quoi portait la question.
Chris Stratton
-6

Si vous souhaitez le faire manuellement, vous pouvez également effacer vos données utilisateur en cliquant sur le “Clear Data” bouton dans Settings–>Applications–>Manage Aplications–> VOTRE APPLICATION

or Is there any other way to do that?

Ensuite, téléchargez le code ici

entrez la description de l'image ici

Strider
la source
Je veux faire cela de manière pragmatique, cet exemple que vous suggérez que j'ai déjà essayé mais ce n'est pas ce que je recherche
UdayaLakmal
si vous avez essayé celui-là, veuillez partager que vous avez essayé celui-là. ok laissez-moi vérifier une autre façon .. !!
Strider