3

在我正在开发的应用程序中,我需要遍历已安装的应用程序并检测哪些是游戏。有没有办法做到这一点?

我正在考虑一个可以搜索包名称并返回其类别的 Play Store API,即使它仅限于商店中的应用程序。是否存在类似的东西?这有没有可能?

有没有其他方法可以做到这一点?

4

3 回答 3

9

此答案已弃用!
正确和向后兼容的方法就在这里

从 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;
于 2015-02-27T09:15:46.840 回答
3

没有自动检测应用程序是否为游戏的方法。您只需比较包名的公共部分的包名即可。我的解决方案是索引谷歌商店页面并散列包名称。

我可以通过构建通用前缀来优化我的哈希值。我将包名称作为域处理并grep公共后缀。我使用来自http://publicsuffix.org/的列表。

“公共后缀”是互联网用户可以直接注册姓名的后缀。公共后缀的一些示例是 .com、.co.uk 和 pvt.k12.ma.us。公共后缀列表是所有已知公共后缀的列表。

公共后缀列表是 Mozilla 的一项倡议,但作为社区资源进行维护。它可用于任何软件,但最初是为了满足浏览器制造商的需求而创建的。

使用此列表,您可以检测包名的一部分是公共前缀。

于 2013-04-14T10:34:10.027 回答
1

对我来说,上面的答案不起作用, 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);
    }
}
于 2020-06-17T08:16:13.817 回答