Очистити дані користувачів додатків для Android


108

Використання оболонки adb для очищення даних програми

adb shell pm clear com.android.browser

Але при виконанні цієї команди з програми

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

Проблема:

Це не очищує дані користувачів, але не дає жодних винятків, хоча я дав наступний дозвіл.

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

Питання:

Як очистити дані програми за допомогою оболонки adb ?


3
Ви знайшли рішення щодо очищення даних для зовнішнього застосування?
Аншуман Джайсваль

2
Не думайте, що стороннє додаток повинно мати дозвіл на очищення даних користувачів іншого додатка. Буде безлад, якби це сталося.
StoneLam

Відповіді:


5

Дані програми Afaik браузера НЕ зрозумілі для інших програм, оскільки вони зберігаються в private_mode. Таким чином, виконання цієї команди може забороняти роботу лише на вкорінених пристроях. Інакше слід спробувати інший підхід.


Інструменти командного рядка не призначені для використання програмами. Ймовірно, вони працюватимуть лише для напівпривілейованого користувача оболонки adb, який трактується як порівняно за авторитетом з користувачем, який натискає кнопки в графічному інтерфейсі, якщо додаток для налаштування системи.
Кріс Страттон

210

Ця команда працювала для мене:

adb shell pm clear packageName

2
чи можна використовувати adb і для очищення кеша?
андроїд розробник

4
@EduardoCuomo Звичайно. Я мав на увазі: чи можна використовувати adb і для очищення кеша?
андроїд розробник

1
@Shayan Ви можете перевірити наступне посилання, щоб видалити лише кеш програми: stackoverflow.com/questions/18589471/… Я не впевнений, чи працює ця команда чи ні.
Manmohan Soni

5

Команда pm clear com.android.browserвимагає кореневого дозволу.
Отже, біжіть suпершими.

Ось зразок коду:

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

Клас 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

Щоб очистити дані програми, будь ласка, спробуйте це.

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

я спробую це, за допомогою цього можна очистити наші власні дані кешу додатків, мені потрібно очистити інші дані користувачів програми з нашого додатку
UdayaLakmal

2
@UdayaLakmal ви не повинні мати змогу очистити дані кешу іншої програми, оскільки android призначений для захисту додатків від потенційно шкідливих дій інших програм.
Кріс Страттон

1

Привіт, 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();
    }
}

Будь ласка, перевірте це і повідомте мене ...

Ви можете завантажити код звідси


-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
Це (якщо використовується з відповідним дозволом) видалить спільні файли на Зовнішньому сховищі, не зважаючи на асоціацію додатків. Це не видалить приватні файли жодної програми, про що йшлося.
Кріс Страттон

-6

Якщо ви хочете зробити це вручну, тоді ви також можете очистити свої користувацькі дані, натиснувши “Clear Data” кнопку Settings–>Applications–>Manage Aplications–> ВАШЕ ЗАЯВКА

or Is there any other way to do that?

Потім завантажте код тут

введіть тут опис зображення


Я хочу зробити це прагматично, цей приклад, який ви пропонуєте, я вже спробував, але це не те, що я шукаю
UdayaLakmal

якщо ви спробували цей, то будь ласка, поділіться, що ви спробували. ОК, дозвольте мені перевірити інший шлях .. !!
Стрідер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.