Hapus data pengguna aplikasi android

108

Menggunakan adb shell untuk menghapus data aplikasi

adb shell pm clear com.android.browser

Tetapi saat menjalankan perintah itu dari aplikasi

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

Isu:

Itu tidak menghapus data pengguna dan tidak memberikan pengecualian apa pun meskipun saya telah memberikan izin berikut.

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

Pertanyaan:

Bagaimana cara menghapus data aplikasi menggunakan adb shell ?

UdayaLakmal
sumber
3
Apakah Anda menemukan solusi untuk menghapus data untuk aplikasi luar?
Anshuman Jaiswal
2
Jangan berpikir aplikasi pihak ketiga harus memiliki izin untuk menghapus data pengguna dari aplikasi lain. Akan berantakan jika itu terjadi.
StoneLam

Jawaban:

5

Afaik, data aplikasi Browser TIDAK dapat dihapus untuk aplikasi lain, karena disimpan di private_mode. Jadi menjalankan perintah ini mungkin hanya dapat bekerja pada perangkat yang di-rooting. Jika tidak, Anda harus mencoba pendekatan lain.

Thkru
sumber
Alat baris perintah tidak dimaksudkan untuk digunakan oleh aplikasi. Kemungkinan mereka hanya akan bekerja untuk pengguna adb shell semi-privileged, yang diperlakukan sebagai otoritas agak sebanding dengan pengguna menekan tombol di GUI jika aplikasi pengaturan sistem.
Chris Stratton
210

Perintah ini berhasil untuk saya:

adb shell pm clear packageName
Manmohan Soni
sumber
2
apakah mungkin menggunakan adb untuk membersihkan cache juga?
Pengembang android
4
@EduardoCuomo Tentu saja. Maksud saya: Apakah mungkin menggunakan adb untuk membersihkan cache saja?
Pengembang android
1
@Shayan Anda dapat melihat tautan berikut untuk hanya menghapus cache aplikasi: stackoverflow.com/questions/18589471/… Saya tidak yakin perintah ini akan berfungsi atau tidak.
Manmohan Soni
5

Perintah tersebut pm clear com.android.browsermembutuhkan izin root.
Jadi, lari sudulu.

Berikut ini contoh kode:

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

Kelas 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
sumber
3

Untuk menghapus Data Aplikasi Silakan Coba cara ini.

    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
sumber
saya mencoba ini, menggunakan ini dapat menghapus data cache aplikasi kita sendiri, saya perlu menghapus data pengguna aplikasi lain dari aplikasi kita
UdayaLakmal
2
@UdayaLakmal Anda seharusnya tidak dapat menghapus data cache aplikasi lain, karena android dirancang untuk melindungi aplikasi dari kemungkinan tindakan berbahaya oleh aplikasi lain.
Chris Stratton
1

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

Silakan periksa ini dan beri tahu saya ...

Anda dapat mengunduh kode dari sini

Strider
sumber
-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();
}
Tuhanku
sumber
1
Ini akan (jika digunakan dengan izin yang sesuai) menghapus file bersama di Penyimpanan Eksternal tanpa memperhatikan asosiasi aplikasi. Itu tidak akan menghapus file pribadi dari aplikasi apa pun, yang merupakan pertanyaan tentang apa.
Chris Stratton
-6

Jika Anda ingin melakukannya secara manual maka Anda juga dapat menghapus data pengguna Anda dengan mengklik “Clear Data” tombol di Settings–>Applications–>Manage Aplications–> APLIKASI ANDA

or Is there any other way to do that?

Kemudian Unduh kode di sini

masukkan deskripsi gambar di sini

Strider
sumber
Saya ingin melakukannya secara pragmatis, contoh yang Anda sarankan sudah saya coba tapi bukan itu yang saya cari
UdayaLakmal
Jika Anda sudah mencobanya, tolong bagikan bahwa Anda sudah mencobanya. ok biar saya cek untuk cara lain .. !!
Strider