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 ?

UdayaLakmal
źródło
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.

Thkru
źródło
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
Manmohan Soni
źródło
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();
        }
    }
}
fantouch
źródło
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();
}
Md Abdul Gafur
źródło
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

Strider
źródło
-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();
}
Mój Boże
źródło
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

Strider
źródło
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,