清除多个应用程序的数据 android

clearing multiple apps' data android

我可以通过此代码段清除单个包名称的数据。但是,我希望它处理多个包名。换句话说,它应该清除另外两个包名称的数据

    private void clearData() {
        //"com.uc.browser.en"
        //"pm clear com.sec.android.app.sbrowser"
        String cmd = "pm clear com.sec.android.app.sbrowser" ;
        ProcessBuilder pb = new ProcessBuilder().redirectErrorStream(true)
                .command("su");
        Process p = null;
        try {
            p = pb.start();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // We must handle the result stream in another Thread first
        StreamReader stdoutReader = new StreamReader(p.getInputStream(),
                CHARSET_NAME);
        stdoutReader.start();

        out = p.getOutputStream();
        try {
            out.write((cmd + "\n").getBytes(CHARSET_NAME));
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            out.write(("exit" + "\n").getBytes(CHARSET_NAME));
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            out.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            p.waitFor();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String result = stdoutReader.getResult();
    }
}

ProcessCommandsSU class 启动一个 su 进程,在该进程中 运行 命令列表,并提供一个接口将输出传递给 Activity 异步。与您所关注的示例不同,此 class 不会阻塞 UI 线程。 Activity 必须实现 OnCommandsReturnListener 接口。

public class ProcessCommandsSU extends Thread {
    public interface OnCommandsReturnListener {
        public void onCommandsReturn(String output);
    }

    private final Activity activity;
    private final String[] cmds;

    public ProcessCommandsSU(Activity activity, String[] cmds) {
        if(!(activity instanceof OnCommandsReturnListener)) {
            throw new IllegalArgumentException(
                "Activity must implement OnCommandsReturnListener interface");
        }

        this.activity = activity;
        this.cmds = cmds;
    }

    public void run() {
        try {
            final Process process = new ProcessBuilder()
                                        .redirectErrorStream(true)
                                        .command("su")
                                        .start();
            final OutputStream os = process.getOutputStream();
            final CountDownLatch latch = new CountDownLatch(1);
            final OutputReader or = new OutputReader(process.getInputStream(), latch);

            or.start();

            for (int i = 0; i < cmds.length; i++) {
                os.write((cmds[i] + "\n").getBytes());
            }

            os.write(("exit\n").getBytes());
            os.flush();

            process.waitFor();
            latch.await();
            process.destroy();

            final String output = or.getOutput();
            activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ((OnCommandsReturnListener) activity).onCommandsReturn(output);
                    }
                }
            );
        }
        catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    private class OutputReader extends Thread {
        private final InputStream is;
        private final StringBuilder sb = new StringBuilder();
        private final CountDownLatch latch;

        public OutputReader(InputStream is, CountDownLatch latch) {
            this.is = is;
            this.latch = latch;
        }

        public String getOutput() {
            return sb.toString();
        } 

        public void run() {
            try {
                final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is));

                String line = "";
                while ((line = reader.readLine()) != null) {                    
                    sb.append(line + "\n");                     
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            latch.countDown();
        }
    }
}

使用class非常简单。我们首先确保我们的 Activity 实现了接口。然后我们创建一个实例,在构造函数中传递 Activity 和我们的命令数组,并调用它的 start() 方法。在下面的示例中,假设 Activity 有一个名为 textOutputTextView 来显示返回的输出:

public class MainActivity extends Activity
    implements ProcessCommandsSU.OnCommandsReturnListener {
    ...

    @Override
    public void onCommandsReturn(String output) {
        textOutput.append(output + "\n");
    }

    private void runCommands() {
        final String[] cmds = {
            "ping -c 5 www.google.com",
            "pm list packages android",
            "chdir " + Environment.getExternalStorageDirectory(),
            "ls"
        };

        new ProcessCommandsSU(MainActivity.this, cmds).start();
    }
}

我的设备未获得 root 权限,因此已使用您在上面代码中看到的命令对其进行了测试。只需将这些命令替换为您的 pm clear 命令即可。