在 Android 11+ 中获取应用程序图标和名称的替代方法?

问题描述 投票:0回答:1

用户启用使用访问权限后,您似乎需要 Android 11+ 中的新

QUERY_ALL_PACKAGES
权限才能使用以下代码访问包的名称和图标:

String appName = packageManager.getApplicationLabel( packageManager.getApplicationInfo(packageName,0) );
Drawable appIcon = packageManager.getApplicationIcon(packageName);

否则我会得到一个

PackageManager.NameNotFoundException
任何一行代码,这显然意味着我无权访问友好的应用程序名称和图标。

是否有其他方法可以在未经许可的情况下实现此目的?除了 Android 11 之前的代码之外,我找不到任何其他方法。

我维护的应用程序也具有屏幕时间功能,但谷歌拒绝批准在我的更新中包含此“敏感权限”,尽管它是我应用程序的核心功能,声称还有其他方法可以实现这一点,但也拒绝详细说明。

使用

<queries>
保留应用程序白名单显然并不是一种可行的方法,因为可能性有无限多种。即使只是保留最受欢迎的应用程序列表,也需要用户将他们的应用程序列表发送给我,即使如此,我每次也必须发布新的更新。

java android google-play android-permissions
1个回答
0
投票
           if (appInfo != null) {
                String appName = appInfo.appName;
                Drawable appIcon = appInfo.appIcon;
                Log.d("AppInfo", "App Name: " + appName);
            } else {
                Log.d("AppInfo", "App not found");
            }

//以上代码在oncreate方法中使用

    private AppInfo getAppInfo(String packageName) {
            PackageManager packageManager = getPackageManager();
            try {
                ApplicationInfo appInfo;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                    appInfo = packageManager.getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA));
                } else {
                    appInfo = packageManager.getApplicationInfo(packageName, 0);
                }
                String appName = packageManager.getApplicationLabel(appInfo).toString();
                Drawable appIcon = packageManager.getApplicationIcon(packageName);
                return new AppInfo(appName, appIcon);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        private static class AppInfo {
            String appName;
            Drawable appIcon;
    
            AppInfo(String appName, Drawable appIcon) {
                this.appName = appName;
                this.appIcon = appIcon;
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.