Java 如何确定我的应用程序是否在Android上运行

Java 如何确定我的应用程序是否在Android上运行,java,android,Java,Android,我有一个应用程序可以在几个运行Fedora或Android的移动设备上运行。为了整合我的代码库和发行版,我想确定我在哪个操作系统上。我尝试了System.getPropertyos.name,但这只是返回Linux。系统属性中是否有Android独有的东西? 谢谢我不知道安卓系统,但是如果你找不到一些独特的系统属性,你有时可以在某些特定类存在的情况下识别系统。因此,您可以执行以下操作: boolean isAndroid() { try { Class.forName("

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

我不知道安卓系统,但是如果你找不到一些独特的系统属性,你有时可以在某些特定类存在的情况下识别系统。因此,您可以执行以下操作:

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

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

java.vendor.url-> java.vm.name->Dalvik我不知道,Fedora使用的是哪一个。。。 java.vm.vendor->Android项目 java.vendor->Android项目 也许你想自己检查一下

属性p=System.getProperties; 枚举键=p键; whilekeys.hasMoreElements{ 字符串键=字符串键.nextElement; 字符串值=字符串p.getkey; System.out.printlkey+>>>>+值; }
以下是我使用此页面中的信息编写的一些代码,以防您要复制粘贴:

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;
}

定义的系统属性列表如下所示:

我正在使用

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

我在处理草图中使用它来确定运行的模式,即运行它的位置

枚举模式{ java、android } 模式获取模式{ return System.getPropertyjava.runtime.name.equalsAndroid运行时?Mode.android:Mode.java; } 如果getMode==Mode.java{ //做点什么 //做一些android无法处理的事情 }否则{ //做android的东西 //将草图缩放2以提高可见性 }

+1您可以在android软件包中查找类。例如,活动。这也是一个好主意,但源代码可能有也可能没有android.jar。当使用Robolectrics这样的测试工具时,这将不起作用。我在android.os.Build类中使用这种方法,android应用程序需要检查不同的android平台配置,请参阅。因此,如果您的应用程序不仅想知道是否是Android,而且想知道您运行的是哪种Android,那么您实际上需要获得一个类ref来构建。或者,您可以查找Android平台不提供的类,如java.lang.instrument.ClassFileTransformer(自java 5以来)。谢谢,我选择了java.runtime.name=android runtime.Hi,这确实非常有用。安卓用户是否有任何官方消息表明,其中哪些将保持不变?谢谢。缩写:System.getProperties.listSystem.out@user552447应该是从Android 5开始的Android运行时,java.runtime.name返回null。所以,它是不可靠的。这可能会打破艺术。有点黑客,但这可能有助于布尔isAndroid;请尝试{Class.forNameandroid.app.Activity;isAndroid=true;}catch ClassNotFoundException e{isAndroid=false;}如果没有Android LIB,您如何在后端编译此文件?由于缺少AndroidLogger类,它将失败。这似乎是最稳定、最清晰、最冗长的解决方案。在普通的/Java.Oracle JVM上,该属性返回Oracle Corporation。Java被Oracle从SUN接管,而Java 6是最新版本,因此至少在Java 5之前,这将是一个不同的值。Android上os.name属性@jww的可能重复项为空,这似乎是大多数答案所依赖的。那些不依赖Apache Commons的,它没有Android检查。你需要使用equals not==来比较字符串。@PeterQuiring这是一个最佳实践吗?==对我来说是可行的。它一般不应该在Java中工作仅当对象完全相同时进行比较。equals将对字符数组进行深入比较。如果编译器正在消除重复字符串,这可能是偶然的,因为两个对象是相同的。@PeterQuiring我编辑了它。谢谢你纠正我的错误。