背景
在使用Android O之前,为了获得应用程序的大小,您必须具有特殊的权限,并使用隐藏的API.
问题
这样的解决方案不再起作用,但是Google提供了一个不太细粒度的官方API:queryStatsForPackage,它返回StorageStats对象.
但是,我找不到有关如何使用它的任何信息.
与仅需要应用程序包名称的隐藏API相比,该API还需要“ String volumeUuID”和“ UserHandle user”.
问题
>如何提供这些参数?
>这是什么意思?每个volumeUuID是否引用不同的存储(例如,内置存储和真实的SD卡),而UserHandle是针对每个用户的吗?
>如果#2是正确的,我是否应该为每个可能的值分别调用它们,以获取应用程序占用的实际总存储量?如果是这样,怎么办?
解决方法:
好的,我已经找到了如何使用新的API.我为此准备了一个小样本,以获取有关卷存储和特定应用程序的一些信息(这次是Play商店,但您可以根据需要进行更改):
public class MainActivity extends AppCompatActivity { public static final String PACKAGE_name = "com.androID.vending"; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); } @OverrIDe protected voID onResume() { super.onResume(); if (!hasUsageStatsPermission(this)) startActivityForResult(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY), 1); else { final Context context = this; AsyncTask.execute(new Runnable() { @TargetAPI(VERSION_CODES.O) @OverrIDe public voID run() { @Suppresslint("WrongConstant") final StorageStatsManager storageStatsManager = (StorageStatsManager) getSystemService(Context.STORAGE_STATS_SERVICE); final StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); final List<StorageVolume> storageVolumes = storageManager.getStorageVolumes(); final UserHandle user = Process.myUserHandle(); for (StorageVolume storageVolume : storageVolumes) { final String uuIDStr = storageVolume.getUuID(); final UUID uuID = uuIDStr == null ? StorageManager.UUID_DEFAulT : UUID.fromString(uuIDStr); try { Log.d("AppLog", "storage:" + uuID + " : " + storageVolume.getDescription(context) + " : " + storageVolume.getState()); Log.d("AppLog", "getFreeBytes:" + Formatter.formatShortfileSize(context, storageStatsManager.getFreeBytes(uuID))); Log.d("AppLog", "getTotalBytes:" + Formatter.formatShortfileSize(context, storageStatsManager.getTotalBytes(uuID))); Log.d("AppLog", "storage stats for app of package name:" + PACKAGE_name + " : "); final StorageStats storageStats = storageStatsManager.queryStatsForPackage(uuID, PACKAGE_name, user); Log.d("AppLog", "getAppBytes:" + Formatter.formatShortfileSize(context, storageStats.getAppBytes()) + " getCacheBytes:" + Formatter.formatShortfileSize(context, storageStats.getCacheBytes()) + " getDataBytes:" + Formatter.formatShortfileSize(context, storageStats.getDataBytes())); } catch (nameNotFoundException e) { e.printstacktrace(); } catch (IOException e) { e.printstacktrace(); } } } }); } } @TargetAPI(VERSION_CODES.M) public static boolean hasUsageStatsPermission(Context context) { //https://stackoverflow.com/a/42390614/878126 if (VERSION.SDK_INT < VERSION_CODES.LolliPOP) return false; AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); final int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, androID.os.Process.myUID(), context.getPackagename()); boolean granted = false; if (mode == AppOpsManager.MODE_DEFAulT) granted = (context.checkCallingOrSelfPermission(androID.Manifest.permission.PACKAGE_USAGE_STATS) == PackageManager.PERMISSION_GRANTED); else granted = (mode == AppOpsManager.MODE_ALLOWED); return granted; }}
清单文件应具有以下内容:
<uses-permission androID:name="androID.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
总结 以上是内存溢出为你收集整理的如何在Android O上使用StorageStatsManager.queryStatsForPackage?全部内容,希望文章能够帮你解决如何在Android O上使用StorageStatsManager.queryStatsForPackage?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)