Cancella i dati utente dell'applicazione Android


108

Utilizzo della shell adb per cancellare i dati dell'applicazione

adb shell pm clear com.android.browser

Ma quando si esegue quel comando dall'applicazione

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

Problema:

Non cancella i dati dell'utente né dà alcuna eccezione sebbene abbia dato la seguente autorizzazione.

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

Domanda:

Come cancellare i dati dell'applicazione utilizzando adb shell ?


3
Hai trovato una soluzione per cancellare i dati per applicazioni esterne?
Anshuman Jaiswal

2
Non pensare che un'applicazione di terze parti debba avere l'autorizzazione per cancellare i dati utente di un'altra app. Sarebbe un disastro se ciò accadesse.
StoneLam

Risposte:


5

Inoltre i dati dell'applicazione Browser NON sono cancellabili per altre app, poiché sono archiviati in private_mode. Quindi l'esecuzione di questo comando potrebbe probabilmente funzionare solo su dispositivi rooted. Altrimenti dovresti provare un altro approccio.


Gli strumenti della riga di comando non sono destinati all'uso da parte delle applicazioni. Probabilmente funzioneranno solo per l'utente semi-privilegiato della shell adb, che viene considerato in qualche modo paragonabile in termini di autorità a un utente che preme i pulsanti nella GUI se l'app delle impostazioni di sistema.
Chris Stratton

210

Questo comando ha funzionato per me:

adb shell pm clear packageName

2
è possibile utilizzare adb anche per svuotare la cache?
sviluppatore Android

4
@EduardoCuomo Ovviamente. Volevo dire: è possibile utilizzare adb anche per svuotare solo la cache?
sviluppatore Android

1
@Shayan Puoi controllare il seguente link per eliminare solo la cache dell'applicazione: stackoverflow.com/questions/18589471/… Non sono sicuro che questo comando funzioni o meno.
Manmohan Soni

5

Il comando pm clear com.android.browserrichiede l'autorizzazione di root.
Quindi, corri suprima.

Ecco il codice di esempio:

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

3

Per cancellare i dati dell'applicazione, prova in questo modo.

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

Provo questo, usando questo posso cancellare i nostri dati della cache dell'applicazione, ho bisogno di cancellare i dati di un'altra app utente dalla nostra applicazione
UdayaLakmal

2
@UdayaLakmal non dovresti essere in grado di cancellare i dati della cache di un'altra applicazione, perché Android è progettato per proteggere le applicazioni da azioni potenzialmente dannose da parte di altre applicazioni.
Chris Stratton

1

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

Per favore controlla questo e fammi sapere ...

Puoi scaricare il codice da qui


-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
Ciò (se utilizzato con l'autorizzazione appropriata) eliminerebbe i file condivisi nell'archivio esterno indipendentemente dall'associazione dell'app. Essa non eliminare i file privati di qualsiasi applicazione, che è ciò che la domanda riguardava.
Chris Stratton

-6

Se vuoi farlo manualmente, puoi anche cancellare i tuoi dati utente facendo clic sul “Clear Data” pulsante nella Settings–>Applications–>Manage Aplications–> TUA APPLICAZIONE

or Is there any other way to do that?

Quindi scarica il codice qui

inserisci qui la descrizione dell'immagine


Voglio farlo in modo pragmatico, quell'esempio che suggerisci l'ho già provato ma non è quello che cerco
UdayaLakmal

se hai provato quello, per favore condividi che hai provato quello. ok fammi controllare per un altro modo .. !!
Strider
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.