如何在Android O上使用StorageStatsManager.queryStatsForPackage?

如何在Android O上使用StorageStatsManager.queryStatsForPackage?,第1张

概述背景在使用AndroidO之前,为了获得应用程序的大小,您必须具有特殊的权限,并使用隐藏的API.问题这样的解决方案不再起作用,但是Google提供了一个不太细粒度的官方API:queryStatsForPackage,它返回StorageStats对象.但是,我找不到有关如何使用它的任何信息.与仅需要应用程序包名

背景

在使用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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1093513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存