Android uygulaması kullanıcı verilerini temizleyin


109

Uygulama verilerini temizlemek için adb kabuğunu kullanma

adb shell pm clear com.android.browser

Ancak bu komutu uygulamadan yürütürken

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

Konu:

Aşağıdaki izni vermiş olmama rağmen kullanıcı verilerini temizlemiyor ve herhangi bir istisna da vermiyor.

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

Soru:

Uygulama verilerini adb shell kullanarak nasıl temizlerim ?


3
Dış uygulama için verileri temizlemek için herhangi bir çözüm buldunuz mu?
Anshuman Jaiswal

2
Üçüncü taraf bir uygulamanın, başka bir uygulamanın kullanıcı verilerini temizleme iznine sahip olması gerektiğini düşünmeyin. Böyle olsaydı çok kötü olurdu.
StoneLam

Yanıtlar:


5

Afaik Tarayıcı uygulaması verileri, içinde depolandığı için diğer uygulamalar için TEMİZLENEMEZ private_mode. Bu nedenle, bu komutu çalıştırmak, yalnızca köklü cihazlarda çalışabilir. Aksi takdirde başka bir yaklaşım denemelisiniz.


Komut satırı araçları, uygulamalar tarafından kullanılmak üzere tasarlanmamıştır. Muhtemelen sadece yarı ayrıcalıklı adb kabuğu kullanıcısı için çalışacaklardır; bu, sistem ayarları uygulamasıysa, GUI'deki düğmelere basan bir kullanıcıyla yetki açısından biraz karşılaştırılabilir olarak değerlendirilir.
Chris Stratton

210

Bu komut benim için çalıştı:

adb shell pm clear packageName

2
önbelleği temizlemek için de adb kullanmak mümkün mü?
android geliştiricisi

4
@EduardoCuomo Elbette. Demek istediğim: adb sadece önbelleği temizlemek için de kullanılabilir mi?
android geliştiricisi

1
@Shayan Yalnızca uygulama önbelleğini silmek için aşağıdaki bağlantıyı kontrol edebilirsiniz: stackoverflow.com/questions/18589471/… Bu komutun çalışıp çalışmayacağından emin değilim.
Manmohan Soni

5

Komut pm clear com.android.browser, kök izni gerektirir.
Öyleyse suönce koş .

İşte örnek 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();

Sınıf 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

Uygulama Verilerini temizlemek için Lütfen bu yolu deneyin.

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

Bunu deniyorum, bunu kullanmak kendi uygulama önbellek verilerimizi temizleyebilir, uygulamamızdan başka bir uygulama kullanıcısı verilerini temizlemem gerekiyor
UdayaLakmal

2
@UdayaLakmal, başka bir uygulamanın önbellek verilerini temizleyememeniz gerekir, çünkü android, uygulamaları diğer uygulamaların potansiyel olarak kötü niyetli eylemlerinden korumak için tasarlanmıştır.
Chris Stratton

1

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

Lütfen bunu kontrol edin ve bana bildirin ...

Sen kodunu indirebilirsiniz burada


-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
Bu, (uygun izinle kullanılırsa), uygulama ilişkilendirmesine bakılmaksızın Harici Depolama'daki paylaşılan dosyaları siler. Bu alışkanlık soru ediyordunuz, herhangi bir uygulamanın özel dosyaları silin.
Chris Stratton

-6

Manuel olarak yapmak istiyorsanız, UYGULAMANIZ'daki “Clear Data” düğmesine tıklayarak da kullanıcı verilerinizi temizleyebilirsiniz.Settings–>Applications–>Manage Aplications–>

or Is there any other way to do that?

Ardından kodu buradan indirin

görüntü açıklamasını buraya girin


Bunu pragmatik bir şekilde yapmak istiyorum, önerdiğin örnek zaten denedim ama aradığım bu değil
UdayaLakmal

Eğer bunu denediyseniz, lütfen onu denediğinizi paylaşın. tamam başka bir yol kontrol edeyim .. !!
Strider
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.