sam*_*m_k 4 java android android-package-managers android-storage
我正在尝试获取应用程序包占用的大小.每个应用程序在内部/外部存储中都有一个位置.
我想计算以下目录的大小,我该怎么做?我知道我可以在Oreo(API 26)设备上使用StorageStateManager,但是如何在oreo设备之前实现这一点.
应用目录: /Android/data/myapplicationpackage
我正在尝试使用PackageStats,但它总是给我零.使用此代码的实际方法是什么?
我使用了以下代码,它给了我全部零.
PackageStats stats = new PackageStats(context.getPackageName());
long codeSize = stats.codeSize + stats.externalCodeSize;
long dataSize = stats.dataSize + stats.externalDataSize;
long cacheSize = stats.cacheSize + stats.externalCacheSize;
long appSize = codeSize + dataSize + cacheSize;
Run Code Online (Sandbox Code Playgroud)
PackageStats stats = new PackageStats(context.getPackageName());
它只会创建packagestats对象.作为从源头上,构造函数会做初始化场,
public PackageStats(String pkgName) {
packageName = pkgName;
userHandle = UserHandle.myUserId();
}
Run Code Online (Sandbox Code Playgroud)
对于api <26,
您需要使用IPackageStatsObserver.aidl并且必须getPackageSizeInfo通过反射调用方法.
PackageManager pm = getPackageManager();
Method getPackageSizeInfo = pm.getClass().getMethod(
"getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, "com.yourpackage",
new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
//here the pStats has all the details of the package
}
});
Run Code Online (Sandbox Code Playgroud)
这是完整的解决方案.它很棒.
来自api 26,
该getPackageSizeInfo方法已弃用.
你可以使用这段代码,
@SuppressLint("WrongConstant")
final StorageStatsManager storageStatsManager = (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE);
final StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
try {
ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packagename, 0);
StorageStats storageStats = storageStatsManager.queryStatsForUid(ai.storageUuid, info.uid);
cacheSize =storageStats.getCacheBytes();
dataSize =storageStats.getDataBytes();
apkSize =storageStats.getAppBytes();
size+=info.cacheSize;
} catch (Exception e) {}
Run Code Online (Sandbox Code Playgroud)
但是要使用此代码,您需要使用USCESS ACERMISSION.