Wyczyść dane użytkownika aplikacji na Androida


108

Używanie powłoki adb do czyszczenia danych aplikacji

adb shell pm clear com.android.browser

Ale podczas wykonywania tego polecenia z aplikacji

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

Kwestia:

Nie usuwa danych użytkownika ani nie daje żadnego wyjątku, chociaż udzieliłem następującego pozwolenia.

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

Pytanie:

Jak wyczyścić dane aplikacji za pomocą powłoki adb ?


3
Czy znalazłeś jakieś rozwiązanie, aby wyczyścić dane do zastosowań zewnętrznych?
Anshuman Jaiswal

2
Nie myśl, że aplikacja innej firmy powinna mieć uprawnienia do czyszczenia danych użytkownika z innej aplikacji. Byłby bałagan, gdyby tak się stało.
StoneLam

Odpowiedzi:


5

Afaik dane aplikacji przeglądarki NIE można wyczyścić dla innych aplikacji, ponieważ są przechowywane w formacie private_mode. Więc wykonanie tego polecenia może prawdopodobnie działać tylko na zrootowanych urządzeniach. W przeciwnym razie powinieneś spróbować innego podejścia.


Narzędzia wiersza poleceń nie są przeznaczone do użytku przez aplikacje. Prawdopodobnie będą działać tylko dla częściowo uprzywilejowanego użytkownika powłoki adb, który jest traktowany jako nieco porównywalny pod względem uprawnień do użytkownika naciskającego przyciski w GUI, jeśli aplikacja ustawień systemowych.
Chris Stratton,

210

To polecenie zadziałało dla mnie:

adb shell pm clear packageName

2
czy można również użyć adb do czyszczenia pamięci podręcznej?
programista Androida

4
@EduardoCuomo Oczywiście. Miałem na myśli: czy możliwe jest użycie adb do czyszczenia tylko pamięci podręcznej?
programista Androida

1
@Shayan Możesz pobrać poniższy link, aby usunąć tylko pamięć podręczną aplikacji: stackoverflow.com/questions/18589471/… Nie jestem pewien, czy to polecenie zadziała, czy nie.
Manmohan Soni

5

Polecenie pm clear com.android.browserwymaga uprawnień administratora.
Więc biegnij supierwszy.

Oto przykładowy kod:

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

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

3

Aby wyczyścić dane aplikacji, spróbuj w ten sposób.

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

próbuję tego, używając tego może wyczyścić nasze własne dane z pamięci podręcznej aplikacji, muszę wyczyścić inne dane użytkownika aplikacji z naszej aplikacji
UdayaLakmal,

2
@UdayaLakmal nie powinieneś być w stanie wyczyścić danych pamięci podręcznej innej aplikacji, ponieważ Android jest przeznaczony do ochrony aplikacji przed potencjalnie złośliwymi działaniami innych aplikacji.
Chris Stratton,

1

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

Sprawdź to i daj mi znać ...

Możesz pobrać kod stąd


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

1
Spowoduje to (jeśli zostanie użyte z odpowiednim zezwoleniem) usunięcie udostępnionych plików w pamięci zewnętrznej bez względu na skojarzenie z aplikacją. To nie będzie usuwać prywatne pliki z dowolnej aplikacji, która jest co pytanie dotyczyło.
Chris Stratton

-6

Jeśli chcesz to zrobić ręcznie, możesz również wyczyścić swoje dane użytkownika, klikając “Clear Data” przycisk w Settings–>Applications–>Manage Aplications–> TWOJEJ APLIKACJI

or Is there any other way to do that?

Następnie pobierz kod tutaj

wprowadź opis obrazu tutaj


Chcę to zrobić pragmatycznie, ten przykład, który sugerujesz, już próbowałem, ale nie tego szukam
UdayaLakmal

jeśli próbowałeś tego, powiedz, że próbowałeś tego. ok, sprawdzę inny sposób .. !!
Strider,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.