Android 一键清除其他app的数据

如何在自己的app里面,一键清除其他应用的数据???

看了很多网上的教程,80%都说需要将自己的app打包为系统应用,我想说这也太麻烦了吧,那几个aidl文件就得折腾好久,再别说拿到对应手机系统的签名了。

下面介绍一种简单快速地做法:
一、手机必须已经获取root权限

很多app可以帮你做到,比如:root精灵,SuperSU,KingRoot等

 
二、为自己开发的应用获取Root权限

代码里调用下面这个方法,第一次安装完运行后,会弹出为当前app进行root授权,同意后,你的app就拿到root权限了,下次再进入不会弹这个授权框。

代码如下:

/**
     * root工具类
     */
    public class RootUtils {
     
        /**
         * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限)
         *
         * pkgCodePath参数
         *
         * @param pkgCodePath 外存下的包名中的文件路径
         *                    可通过 {@link android.content.ContextWrapper}中的getPackageCodePath()方法 获取
         * @return 应用程序是/否获取Root权限
         */
        public static boolean upgradeRootPermission(String pkgCodePath) {
            Process process = null;
            DataOutputStream os = null;
            try {
                String cmd="chmod 777 " + pkgCodePath;
                process = Runtime.getRuntime().exec("su"); //切换到root,只在刚安装时,会弹出对话框确认一次
                os = new DataOutputStream(process.getOutputStream());
     
                os.writeBytes(cmd + " \n"); //pkgCodePath目录拿到读写执行权限
                os.flush();
     
                os.writeBytes("exit \n"); //退出命令
                os.flush();
     
            } catch (Exception e) {
                return false;
            } finally {
                try {
                    if (os != null) {
                        os.close();
                    }
                    if (process != null) {
                        process.destroy();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return true;
        }
    }

   三、清除 “/data/data/其他app包名/” 目录下的数据

    命令进入root权限
    执行 chmod 777 /data/data/包名 ,可以拿到对该目录的读、写、执行权限
    确定该目录下要清除的目录,一般就这四个:cache、databases、files、shared_prefs
    执行 rm -rif /data/data/包名/cache ,依次强制清除这四个目录
    执行 exit ,退出命令行

代码如下:

 

   /**
         * 清除其他应用的所有数据
         */
        public boolean cleanOtherAppData(String packageName) {
            File file = new File("/data/data/" + packageName);
            System.out.println("包名为:" + packageName);
     
            if (file.exists()) {
                DataOutputStream os = null;
                Process p = null;
     
                try {
                    p = Runtime.getRuntime().exec("su");// 获得root权限
                    os = new DataOutputStream(p.getOutputStream());
     
                    os.writeBytes("chmod 777 /data/data/" + packageName + "/ \n"); //拿到对应app包的读写执行权限
                    os.flush();
     
                    // data/data/packageName目录下要删除的文件夹
                    List<String> list = new ArrayList<>();
                    list.add("cache");
                    list.add("databases");
                    list.add("files");
                    list.add("shared_prefs");
                    for (int i = 0; i < list.size(); i++) {
                        os.writeBytes("rm -rif /data/data/" + packageName + "/" + list.get(i) + " \n");// 强制删除文件和文件夹
                        os.flush();
                    }
     
                    os.writeBytes("exit\n"); //退出命令
                    os.flush();
     
                    os.close();
                    p.destroy();
     
                    return true;
     
                } catch (IOException e) {
                    try {
                        if (os != null) {
                            os.close();
                        }
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    if (p != null) {
                        p.destroy();
                    }
                }
            }
     
            return false;
        }

四、使用

直接在Activity里面调用   

 //要删除的APP包名
    private final String appPackageName = "com.hundsun.qy.hospitalcloud.bj.xhhosp.hsyy";
    DataCleanManager dataCleanManager = new DataCleanManager(this);
     
     
     
    if(RootUtils.upgradeRootPermission(getPackageCodePath())){
                        Toast.makeText(MainActivity.this, "已获取Root权限", Toast.LENGTH_SHORT).show();
     
                        //清除APP数据
                        if(dataCleanManager.cleanOtherAppData(appPackageName)){
                            Toast.makeText(MainActivity.this, "成功清除app数据", Toast.LENGTH_SHORT).show();
                        }else{
                            Toast.makeText(MainActivity.this, "清除app数据失败!!!", Toast.LENGTH_SHORT).show();
                        }
                    }else{
                        Toast.makeText(MainActivity.this, "获取Root权限失败", Toast.LENGTH_SHORT).show();
                    }

完美结束!!!!

 

附上源码地址:https://github.com/yeaper/ClearAppCache

里面加了个清除指定外存中的文件夹或者文件的功能,并且将清除操作信息打印出来,方便查看

效果图来一发:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值