Löschen Sie die Benutzerdaten der Android-Anwendung

108

Verwenden der ADB-Shell zum Löschen von Anwendungsdaten

adb shell pm clear com.android.browser

Aber wenn Sie diesen Befehl von der Anwendung ausführen

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

Problem:

Es löscht weder die Benutzerdaten noch gibt es eine Ausnahme, obwohl ich die folgende Erlaubnis gegeben habe.

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

Frage:

Wie lösche ich die Anwendungsdaten mit der ADB-Shell ?

UdayaLakmal
quelle
3
Haben Sie eine Lösung gefunden, um Daten für externe Anwendungen zu löschen?
Anshuman Jaiswal
2
Denken Sie nicht, dass eine Drittanbieteranwendung die Berechtigung haben sollte, Benutzerdaten einer anderen App zu löschen. Es wäre ein Chaos, wenn das passieren würde.
StoneLam

Antworten:

5

Afaik die Browser-Anwendungsdaten können NICHT für andere Apps gelöscht werden, da sie in gespeichert sind private_mode. Die Ausführung dieses Befehls kann also wahrscheinlich nur auf gerooteten Geräten funktionieren. Andernfalls sollten Sie einen anderen Ansatz ausprobieren.

Thkru
quelle
Die Befehlszeilentools sind nicht für die Verwendung durch Anwendungen vorgesehen. Wahrscheinlich funktionieren sie nur für den halbprivilegierten Benutzer der ADB-Shell, was in seiner Autorität als vergleichbar mit einem Benutzer angesehen wird, der Schaltflächen in der GUI drückt, wenn die Systemeinstellungs-App verwendet wird.
Chris Stratton
209

Dieser Befehl hat bei mir funktioniert:

adb shell pm clear packageName
Manmohan Soni
quelle
2
ist es möglich, adb auch zum leeren des caches zu verwenden?
Android-Entwickler
4
@ EduardoCuomo Natürlich. Ich meinte: Ist es möglich, mit adb auch nur den Cache zu leeren?
Android-Entwickler
1
@Shayan Sie können den folgenden Link auschecken, um nur den Anwendungscache zu löschen: stackoverflow.com/questions/18589471/… Ich bin nicht sicher, ob dieser Befehl funktioniert oder nicht.
Manmohan Soni
5

Der Befehl pm clear com.android.browsererfordert eine Root-Berechtigung.
Also renne suzuerst.

Hier ist der Beispielcode:

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

Die Klasse 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
quelle
3

Um die Anwendungsdaten zu löschen, versuchen Sie es bitte auf diese Weise.

    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
quelle
Ich versuche dies, mit dieser kann unsere eigenen Anwendungs-Cache-Daten löschen, ich muss andere App-Benutzerdaten aus unserer Anwendung
löschen
2
@UdayaLakmal Sie sollten nicht in der Lage sein, die Cache-Daten einer anderen Anwendung zu löschen, da Android Anwendungen vor potenziell böswilligen Aktionen anderer Anwendungen schützen soll.
Chris Stratton
1

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

Bitte überprüfen Sie dies und lassen Sie es mich wissen ...

Sie können den Code hier herunterladen

Strider
quelle
-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();
}
Mein Gott
quelle
1
Dies würde (bei Verwendung mit entsprechender Berechtigung) die freigegebenen Dateien im externen Speicher ohne Berücksichtigung der App-Zuordnung löschen. Es werden keine privaten Dateien einer App gelöscht, worum es bei der Frage ging.
Chris Stratton
-6

Wenn Sie dies manuell tun möchten, können Sie Ihre Benutzerdaten auch löschen, indem Sie “Clear Data” in Settings–>Applications–>Manage Aplications–> IHRER ANWENDUNG auf die Schaltfläche klicken

or Is there any other way to do that?

Dann laden Sie hier den Code herunter

Geben Sie hier die Bildbeschreibung ein

Strider
quelle
Ich möchte das pragmatisch machen, dieses Beispiel, das Sie vorschlagen, habe ich bereits versucht, aber das ist nicht das, wonach ich suche
UdayaLakmal
Wenn Sie es versucht haben, teilen Sie uns bitte mit, dass Sie es versucht haben. ok lass mich nach einem anderen Weg suchen .. !!
Strider