在我正在开发的应用程序中,我需要遍历已安装的应用程序并检测哪些是游戏。有没有办法做到这一点?
我正在考虑一个可以搜索包名称并返回其类别的 Play Store API,即使它仅限于商店中的应用程序。是否存在类似的东西?这有没有可能?
有没有其他方法可以做到这一点?
在我正在开发的应用程序中,我需要遍历已安装的应用程序并检测哪些是游戏。有没有办法做到这一点?
我正在考虑一个可以搜索包名称并返回其类别的 Play Store API,即使它仅限于商店中的应用程序。是否存在类似的东西?这有没有可能?
有没有其他方法可以做到这一点?
此答案已弃用!
正确和向后兼容的方法就在这里!
从 Android API 版本 21 开始,终于有一种方法可以检查应用程序是否为游戏。
PackageManager pm = mContext.getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo(mPackageName,0);
if((ai.flags & ApplicationInfo.FLAG_IS_GAME) == ApplicationInfo.FLAG_IS_GAME)
return true;
return false;
没有自动检测应用程序是否为游戏的方法。您只需比较包名的公共部分的包名即可。我的解决方案是索引谷歌商店页面并散列包名称。
我可以通过构建通用前缀来优化我的哈希值。我将包名称作为域处理并grep公共后缀。我使用来自http://publicsuffix.org/的列表。
“公共后缀”是互联网用户可以直接注册姓名的后缀。公共后缀的一些示例是 .com、.co.uk 和 pvt.k12.ma.us。公共后缀列表是所有已知公共后缀的列表。
公共后缀列表是 Mozilla 的一项倡议,但作为社区资源进行维护。它可用于任何软件,但最初是为了满足浏览器制造商的需求而创建的。
使用此列表,您可以检测包名的一部分是公共前缀。
对我来说,上面的答案不起作用, ApplicationInfo.FLAG_IS_GAME 现在已弃用,使用 API 28+(在我的情况下),您可以执行以下操作:
_pm = _context.PackageManager;
List<string> packageList = new List<string>();
Intent intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryLeanbackLauncher); // or add any category you want
var list = _pm.QueryIntentActivities(intent, PackageInfoFlags.MetaData);
foreach (var app in list)
{
ApplicationInfo ai = _pm.GetApplicationInfo(app.ActivityInfo.PackageName, 0);
var allFlags = ai.Flags;
if (allFlags.HasFlag(ApplicationInfoFlags.IsGame))
{
packageList.Add(app.ActivityInfo.PackageName);
}
}