如何在自己的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
里面加了个清除指定外存中的文件夹或者文件的功能,并且将清除操作信息打印出来,方便查看
效果图来一发: