如何以编程方式检测"Android App"是否在Chrome Book或Android手机中运行



由于谷歌已经宣布chromebook也支持"Android应用程序",所以我也想在chromebook上支持我的应用程序,尽管它运行良好,只有少数例外需要修复。

我想以这样一种方式编写代码,即只对chromebook执行,而不会对android手机和平板电脑执行。

我在安卓开发者网站上查看了Chromebook文档,我没有得到任何这样的API,它告诉你的应用程序正在Chromebook环境中运行。


ARC Beta文档中的建议不起作用:

如果您需要检查您的应用程序是否在Chrome操作系统上运行,请查找chromium作为android.os.Build.BRANDandroid.os.Build.MANUFACTURER

两者都在华硕Chromebook上返回谷歌

最后,我找到了一种方法来了解应用程序是否在ARC中运行:

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

2023注意——跳到此答案的底部,阅读Android识别Chromebook/Datadesk/PC设备的最新方式,包括Android模拟器中的新测试。或者,继续阅读以下内容,了解ARC检查的完整、激动人心的历史,以及谷歌如何多次改变自己的方法。

旧版:

谷歌在他们自己的代码中使用的一种方法(现在从链接更新了几次(是检查CCD_;_cheets";。我不知道这样结束设备名称是一种长期策略还是一种快速的解决方案,但除了dex提出的解决方案之外,它也值得一看。

FWIW,由于ARCWelder的方法已被弃用,而且(目前(还没有关于这方面的官方文件,我还在XDA论坛上开始了一场讨论,让人们讨论哪些方法在各种设备上有效/无效。

更新5/18:看起来上面的代码已经被移动和更新了,所以谷歌截至2018年5月的新ARC检查在这里,特别是在这一点:

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

其中ARC_DEVICE_PATTERN被定义为

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

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

更新8/26/20--截至7个月前,源已从FormFactors.java移动到FeatureSupport.java。如果你在寻找它的去向,这里是截至今天的代码。

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

测试保持不变。

2023年1月15日-代码再次更改!isArc()现在内置在FeatureUtil类中(请参阅此处提交(isArc():的当前版本

/** Returns {@code true} if device is an ARC++ device. */
    public static boolean isArc() {
        return hasAnySystemFeature(ARC_FEATURE, ARC_DEVICE_MANAGEMENT_FEATURE);
    }

其中ARC_FEATUREARC_DEVICE_MANAGEMENT_FEATURE的定义如下:

public static final String ARC_FEATURE = "org.chromium.arc";
public static final String ARC_DEVICE_MANAGEMENT_FEATURE = "org.chromium.arc.device_management";

函数hasAnySystemFeature((简单地检查各个特性,如果其中任何一个为true,则返回true。

因此,以下内容可以作为kotlin中的一个简单的独立检查(其中context是活动上下文(:

   fun isArc(): Boolean {
        return ((context.packageManager.hasSystemFeature("org.chromium.arc")) || (context.packageManager.hasSystemFeature("org.chromium.arc.device_management")))

请注意,这与@dex下面的答案类似,但包括Android源代码使用的两个测试。

顺便说一句,通过查看上面链接的代码,您还可以使用类似的功能检查来检查其他设备特性,如isWatch()isTV()isAutomotive()isPC()isVrHeadset()isLowRam()等。

2022年6月30日-hasAnySystemFeature((在最近的ChromeOS/桌面模拟器映像(如Sv2-Android 12L API 34(桌面(映像(中似乎不起作用。但是,您可以在Android Emulator中通过检查ro.product.model中的设备型号信息来检测到这一点。从adb shell中,使用$ getprop | grep ro.product.model可以看到一行,如:

 [ro.product.model]: [sdk_gpc_x86_64]

";gpc";暗示谷歌PC(作为比较,还有一个sdk_gphone64_x86_64(,其他地方的代码暗示这可能是一个新的约定。因此,在Kotlin中,如果您正在模拟器中寻找ChromeOS,请尝试将其添加到上面的hasAnySystemFeature((检查中:

// is the emulator running a desktop/ChromeOS image?
if (Build.MODEL != null && Build.MODEL.startsWith("sdk_gpc_")) {
   // it probably is (?)
}

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

public static boolean isArc(@NonNull Context context) {
    PackageManager pm = context.getPackageManager();
    return pm.hasSystemFeature( "org.chromium.arc" ) || pm.hasSystemFeature( "org.chromium.arc.device_management" );
}
PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_PC)) 
   // it's a chromebook

相关内容

  • 没有找到相关文章

最新更新