如何检测Android应用程序是否是游戏?

时间:2013-04-14 10:31:48

标签: android

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

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

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

3 个答案:

答案 0 :(得分:7)

自从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;

答案 1 :(得分:3)

没有自动方式来检测应用是否是游戏。您可以同意包名称的公共部分的包名称。我的解决方案是索引谷歌商店页面并散列包名称。

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

  

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

     

公共后缀列表是Mozilla的一项计划,但作为社区资源维护。它可以在任何软件中使用,但最初是为满足浏览器制造商的需求而创建的。

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

答案 2 :(得分: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);
    }
}