如何在安卓系统中使用无障碍服务删除缓存?

5
我正在开发一款缓存清理应用程序,经过在Google上的研究,我发现Android系统已将“CLEAR_APP_CACHE”权限移至“签名,特权”状态。因此,我无法使用freeStorageAndNotify方法清除缓存。
像CCleaner、Power Clean等在Google Play商店上的应用程序都使用辅助功能服务来删除缓存。
我也为我的应用程序创建了基本的辅助功能服务,但不知道如何删除应用程序的缓存。

尝试这个答案 https://dev59.com/IF7Va4cB1Zd3GeqPHjQ0 - Paraskevas Ntsounos
Android可访问性服务,不确定它是否有用。我只是在文档中浏览并看到了这个,然后戏剧性地发现了这个问题(我不是Android开发人员,正在尝试使用Python Pyjnius访问android类)。 - Paul Lam
1个回答

0

您可以获取已安装应用程序的列表并删除缓存,例如:

    public static void clearALLCache()
            {
                List<PackageInfo> packList = getPackageManager().getInstalledPackages(0);
            for (int i=0; i < packList.size(); i++)
            {
                PackageInfo packInfo = packList.get(i);
                if (  (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
                {
                    String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString();
                    try {
                        // clearing app data
    //                    Runtime runtime = Runtime.getRuntime();
    //                    runtime.exec("pm clear "+packInfo.packageName);
                        Context context = getApplicationContext().createPackageContext(packInfo.packageName,Context.CONTEXT_IGNORE_SECURITY);
                        deleteCache(context);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            }

public static void deleteCache(Context context) {
        try {
            File dir = context.getCacheDir();
            deleteDir(dir);
        } catch (Exception e) {}
    }

    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();
        } else if(dir!= null && dir.isFile()) {
            return dir.delete();
        } else {
            return false;
        }
    }

它相当于在“设置”-->“应用程序管理器”-->“您的应用程序”-->“清除数据”下的清除数据选项。(在注释中)

为了使您的应用程序支持此功能,您还应遵循谷歌的特权权限白名单


@Jyoti JK 不,我在我的设备上测试过了,它没有被root并且可以正常工作,需要在清单中添加权限。 - Paraskevas Ntsounos
如何清除缓存:只需进入“设置”-->“应用管理器”-->“您的应用程序”-->“清除缓存”。 - Jyoti JK
@Jyoti JK,请查看我的更新答案,它仅清除已安装应用程序中的数据,而不是来自系统预安装的。 - Paraskevas Ntsounos
感谢您的努力。我已经尝试过这种方法了。我已经使用 IPackageStatsObserver.aidl 的帮助清除了缓存。但它只适用于api<23。但是对于api>23,我没有找到任何技巧。一些应用程序需要获取辅助功能权限来清除缓存。这就是为什么我发起了一个悬赏,想知道他们如何清除缓存。 - Jyoti JK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接