【问题标题】:How to determine if my app is running on Android [duplicate]如何确定我的应用程序是否在 Android 上运行 [重复]
【发布时间】:2011-05-30 00:09:03
【问题描述】:

我有一个应用程序可以在多个运行 Fedora 或 Android 的移动设备上运行。为了整合我的代码库和分发,我想确定我在哪个操作系统上。我尝试了 System.getProperty("os.name"),但它只返回“Linux”。系统属性中是否有 Android 独有的东西? 谢谢

【问题讨论】:

标签: java android


【解决方案1】:

您可以检查几个属性。候选人是:

  • java.vendor.url --> http://www.android.com
  • java.vm.name --> Dalvik(我不知道,Fedora 用的是哪一个...)
  • java.vm.vendor --> Android 项目
  • java.vendor --> Android 项目

也许您想自己检查一下?

Properties p = System.getProperties();
Enumeration keys = p.keys();
while(keys.hasMoreElements()) {
   String key = (String) keys.nextElement();
   String value = (String) p.get(key);
   System.out.println(key + " >>>> " + value);
}

【讨论】:

  • 谢谢,我选择了 "java.runtime.name" = "android runtime"。
  • 嗨,这确实很有帮助。 Android 人员是否有任何官方消息说明其中哪些将保持不变?谢谢。
  • 短:System.getProperties().list(System.out);
  • @user552447 应该是“Android 运行时”
  • 从 Android 5 开始,java.runtime.name 返回 null。所以,它是不​​可靠的。
【解决方案2】:

我不了解 Android,但如果您没有找到一些独特的系统属性,您有时可以识别系统(如果那里存在某个特定的类)。因此,您可以执行以下操作:

boolean isAndroid() {
    try {
        Class.forName("the class name");
        return true;
    } catch(ClassNotFoundException e) {
        return false;
    }
}

【讨论】:

  • +1 你可以在 android 包中寻找一个类。例如活动。
  • 这也是个好主意,但源可能有也可能没有android.jar。
  • 这在使用像 Robolectrics 这样的测试工具时不起作用。
  • 我将这种方法与android.os.Build 类一起使用——这是Android 应用程序需要检查不同Android 平台配置的类,请参阅developer.android.com/reference/android/os/Build。因此,如果您的应用程序想知道 - 不仅是它是否是 Android - 还想知道您在哪种 Android 下运行,那么您实际上希望获得一个指向 Build 的类引用。
  • 或者,您可以查找 Android 平台不提供的类,例如 java.lang.instrument.ClassFileTransformer(从 Java 5 开始)。
【解决方案3】:

这是我使用此页面中的信息编写的一些代码,以防您想复制粘贴:

private static YLogger ylogger;
public static YLogger getLogger() {
    if (ylogger == null){
        // need to find a new logger. Let's check if we have Android running
        if (System.getProperty("java.vm.name").equalsIgnoreCase("Dalvik")){
            ylogger = new AndroidLogger();
            ylogger.d("YLoggerFactory", "Instantiating Android-based logger");
        } else {
            // fallback option, system logger.
            ylogger = new SystemLogger();   
            ylogger.d("YLoggerFactory", "Instantiating System-based logger");
        }
    }
    return ylogger;
}

【讨论】:

  • 这可能会与 ART 中断。
  • 有点骇人听闻,但这可能会有所帮助boolean isAndroid; try { Class.forName("android.app.Activity"); isAndroid = true; } catch (ClassNotFoundException e) { isAndroid = false; }
  • 如何在后端编译它(没有 Android 库)?会因为缺少 AndroidLogger 类而失败
【解决方案4】:

定义的系统属性列表在这里:https://developer.android.com/reference/java/lang/System#getProperties()

我正在使用

boolean android = "The Android Project".equals(System.getProperty("java.specification.vendor"));

【讨论】:

  • 这似乎是最稳定且非常清晰和详细的解决方案。在普通/Java.Oracle JVM 上,同样的属性返回 "Oracle Corporation"
  • Java 被 Oracle 从 SUN 手中接管,而 Java 6 是最新版本,因此至少在 Java 5 之前,这将是一个不同的值。
【解决方案5】:

我在我的处理草图中使用它来确定我在哪种模式下运行,即我在哪里运行它。

enum Mode {
  java, android
}

Mode getMode() {
  return System.getProperty("java.runtime.name").equals("Android Runtime") ? Mode.android : Mode.java;
}

if (getMode() == Mode.java){
  // do something
  // eg: do something that android can't handle
} else {
  // do android stuff 
  // eg: scale the sketch by 2 to improve visibility
}

【讨论】:

  • 你需要使用 equals() 而不是 "==" 来比较字符串。
  • @PeterQuiring 这是否是最佳实践? “==”对我有用。
  • 它一般不应该在 Java 中工作。 == 仅比较对象是否完全相同。 equals() 将对 char 数组进行深度比较。
  • 如果编译器正在对字符串进行重复数据删除,这可能是偶然的,因为这两个对象是相同的。
  • @PeterQuiring 我编辑了它。感谢您纠正我的错误。
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多