如何以编程方式检测 "Android App" 在 chrome 书中或 Android phone 中是否为 运行

How to detect programmatically if "Android App" is running in chrome book or in Android phone

由于 Google 宣布 chromebook 也支持 "Android Application" 所以我也想在 chromebook 上支持我的应用程序,尽管它是 运行很好,除了少数例外,我需要修复。

我想编写的代码仅针对 chrome 书籍执行,不会针对 android 手机和平板电脑执行。

我查看了 android 开发者网站中的 Chromebook 文档,我没有得到任何这样的 API 表明您的应用在 chrome 书中是 运行环境。


ARC Beta documentation 的建议无效:

If you need to check if your app is running on Chrome OS, look for chromium as the android.os.Build.BRAND and android.os.Build.MANUFACTURER.

在华硕 Chromebook 上 returngoogle

最后我想出了一个方法来知道应用程序是否在 运行 in ARC:

context.getPackageManager().hasSystemFeature("org.chromium.arc.device_management");

另一种方法Google uses in their own code (updated link)是检查Build.DEVICE是否以“_cheets”结尾。我不知道像这样结束设备名称是某种长期策略还是快速解决方法,但除了 dex 提出的解决方案外,它也值得一看。

FWIW,由于 ARCWelder 的方法已被弃用并且(目前)还没有官方文档,我还在 XDA 论坛中 started a discussion 供人们讨论什么 works/doesn 不起作用在各种设备上。

更新 5/18: 看起来上面的代码已移动和更新,因此 Google 截至 2018 年 5 月的新 ARC 检查是 here,尤其是这一点:

... } else if (Build.DEVICE != null && Build.DEVICE.matches(ARC_DEVICE_PATTERN)) {
  mFormFactor = FORM_FACTOR_ARC;
} else { ...

其中 ARC_DEVICE_PATTERNdefined 作为

private static final String ARC_DEVICE_PATTERN = ".+_cheets|cheets_.+";

所以它不仅仅是一个以_cheets结尾的设备。它也可以以 cheets_ 开头。

更新 8/26/20 -- 截至 7 个月前,源已从 FormFactors.java 移动到 FeatureSupport.java。如果您正在寻找它的去向- here it the code as of today.

  public static boolean isArc() {
    return (Build.DEVICE != null && Build.DEVICE.matches(".+_cheets|cheets_.+"));
  }

测试保持不变。

PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_PC)) 
   // it's a chromebook

我在 Android CTS code 中找到了解决方案。

public static boolean isArc(@NonNull Context context) {
    PackageManager pm = context.getPackageManager();
    return pm.hasSystemFeature( "org.chromium.arc" ) || pm.hasSystemFeature( "org.chromium.arc.device_management" );
}