Android Mreflection方法freeStorageAndNotify例外

我正在使用reflection方法freeStorageAndNotify:

Method freeStorageAndNotify = null; freeStorageAndNotify = service.packageManager.getClass().getMethod( "freeStorageAndNotify", long.class, IPackageDataObserver.class); freeStorageAndNotify.invoke(PackageManager.class, maxCache + freeSpace, packageDataObserver); 

这会导致InvocationTargetException:

 java.lang.SecurityException: Neither user 10199 nor current process has android.permission.CLEAR_APP_CACHE. 

一些观点: – 我已经有android.permission.CLEAR_APP_CACHE – 这只发生在Android“M”版本(从开发者网站闪现预览sdk)

我知道这是一个黑客,谷歌并没有带来一些官方的API,但有这么多的清理应用程序清理所有设备caching在一个点击,所以如果有人知道如何绕过这个问题与另一个解决方法我'很高兴看到这一点。

非常感谢您的帮助

Solutions Collecting From Web of "Android Mreflection方法freeStorageAndNotify例外"

在Android 5上出现了一个错误 ,说明任何应用程序如何使用常规权限清除所有caching文件,但除了签名级权限外,不能清除一个包的caching文件。 这是细节在哪里

PackageManager有一个deleteApplicationCacheFiles()从一个包中删除caching。 这个方法对SDK是隐藏的,它需要签名级权限DELETE_CACHE_FILES

PackageManager还有一个freeStorageAndNotify()方法,用于从所有包中删除caching文件。 这个方法对SDK是隐藏的,它需要CLEAR_APP_CACHE权限,这个权限只是标记为“危险的”。

有人build议要么DELETE_CACHE_FILES应该放宽级别,CLEAR_APP_CACHE应该提高级别。

一名框架工程师回应

请注意, freeStorageAndNotify's目的不是消除所有caching文件 ,而是在尝试下载和安装应用程序之前释放X空间,例如通过Play Store。 所以有理由使用它,可以很好地与系统配合使用,但没有理由让应用程序使用只是为了单个应用程序(这仅仅是设置应用程序用户界面)的所有caching文件。

如果确实这不是一个应用程序错误,即你没有弄乱权限 ,它可以在Marshmallow / 6 / api 23上工作,而不是其他人只能意味着它成为一个签名级权限,如DELETE_CACHE_FILES

签名|系统权限,这意味着它只能由使用固件签名密钥签名或安装在系统分区(例如,根用户设备用户)上的应用程序持有。 正如在这个答案中所述 。

这是有道理的,考虑到他们的预期用途/他们的愿景(应用程序没有理由使用这种方法,只是为了一个应用程序而盲目地擦除所有caching文件)。 由于该错误,可能甚至会受到限制。 当Android 6的代码会出来,我们会知道更好(当前可用是5.1.1 – 连接到PackageManager的freeStorageAndNotify )。

请参阅这些页面: 按保护级别和保护级别定义的 权限 。

android.permission.CLEAR_APP_CACHE

这属于“签名”的保护级别,这意味着只有同一个签名或特权应用(基本上已签署系统)才能具有此权限。

你也应该检查一下行为变化 。