Limpar dados do usuário do aplicativo Android

108

Usando adb shell para limpar os dados do aplicativo

adb shell pm clear com.android.browser

Mas ao executar esse comando a partir do aplicativo

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

Questão:

Ele não limpa os dados do usuário nem oferece nenhuma exceção, embora eu tenha dado a seguinte permissão.

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

Questão:

Como limpar os dados do aplicativo usando adb shell ?

UdayaLakmal
fonte
3
Você encontrou alguma solução para limpar dados para aplicativos externos?
Anshuman Jaiswal de
2
Não pense que um aplicativo de terceiros deve ter permissão para limpar os dados do usuário de outro aplicativo. Seria uma bagunça se isso acontecesse.
StoneLam de

Respostas:

5

Afaik os dados do aplicativo do navegador NÃO podem ser apagados para outros aplicativos, uma vez que estão armazenados em private_mode. Portanto, a execução deste comando provavelmente só funcionará em dispositivos com acesso root. Caso contrário, você deve tentar outra abordagem.

Thkru
fonte
As ferramentas de linha de comando não se destinam ao uso por aplicativos. Provavelmente, eles só funcionarão para o usuário de shell adb semilivilegiado, que é tratado como algo comparável em autoridade a um usuário que pressiona botões na GUI se o aplicativo de configurações do sistema.
Chris Stratton
210

Este comando funcionou para mim:

adb shell pm clear packageName
Manmohan Soni
fonte
2
é possível usar o adb para limpar o cache também?
desenvolvedor Android de
4
@EduardoCuomo Claro. Eu quis dizer: é possível usar o adb para limpar apenas o cache também?
desenvolvedor Android
1
@Shayan Você pode verificar o seguinte link para excluir apenas o cache do aplicativo: stackoverflow.com/questions/18589471/… Não tenho certeza se este comando funcionará ou não.
Manmohan Soni
5

O comando pm clear com.android.browserrequer permissão de root.
Então corrasu primeiro.

Aqui está o código de exemplo:

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

A 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
fonte
3

Para limpar os dados do aplicativo, tente desta forma.

    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
fonte
Eu tento fazer isso, usando isso pode limpar nossos próprios dados de cache do aplicativo, eu preciso limpar os dados do usuário de outro aplicativo de nosso aplicativo
UdayaLakmal
2
@UdayaLakmal você não deve ser capaz de limpar os dados de cache de outro aplicativo, porque o Android foi projetado para proteger os aplicativos de ações potencialmente maliciosas de outros aplicativos.
Chris Stratton
1

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

Por favor, verifique isso e me diga ...

Você pode baixar o código aqui

Strider
fonte
-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();
}
Meu Deus
fonte
1
Isso (se usado com a permissão apropriada) excluiria os arquivos compartilhados no armazenamento externo sem levar em conta a associação do aplicativo. Ele não vai apagar os arquivos privados de qualquer aplicativo, que é o que a pergunta era sobre.
Chris Stratton,
-6

Se quiser fazer manualmente, você também pode limpar seus dados de usuário clicando “Clear Data” no botão Settings–>Applications–>Manage Aplications–> SEU APLICATIVO

or Is there any other way to do that?

Então baixe o código aqui

insira a descrição da imagem aqui

Strider
fonte
Eu quero fazer isso pragmaticamente, aquele exemplo que você sugere que eu já experimentei, mas não é isso que eu procuro
UdayaLakmal
se você tentou aquele, por favor, compartilhe que você tentou aquele. ok, deixe-me verificar de outra forma .. !!
Strider