用户启用使用访问权限后,您似乎需要 Android 11+ 中的新
QUERY_ALL_PACKAGES
权限才能使用以下代码访问包的名称和图标:
String appName = packageManager.getApplicationLabel( packageManager.getApplicationInfo(packageName,0) );
Drawable appIcon = packageManager.getApplicationIcon(packageName);
否则我会得到一个
PackageManager.NameNotFoundException
任何一行代码,这显然意味着我无权访问友好的应用程序名称和图标。
是否有其他方法可以在未经许可的情况下实现此目的?除了 Android 11 之前的代码之外,我找不到任何其他方法。
我维护的应用程序也具有屏幕时间功能,但谷歌拒绝批准在我的更新中包含此“敏感权限”,尽管它是我应用程序的核心功能,声称还有其他方法可以实现这一点,但也拒绝详细说明。
使用
<queries>
保留应用程序白名单显然并不是一种可行的方法,因为可能性有无限多种。即使只是保留最受欢迎的应用程序列表,也需要用户将他们的应用程序列表发送给我,即使如此,我每次也必须发布新的更新。
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;
}
}