如何确定我的应用程序是不是在 Android 上运行 [重复]
Posted
技术标签:
【中文标题】如何确定我的应用程序是不是在 Android 上运行 [重复]【英文标题】: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 独有的东西? 谢谢
【问题讨论】:
How do I programmatically determine operating system in Java?的可能重复 @jww “os.name” 属性在 Android 上是null
,其中大多数答案似乎都依赖于此。不依赖 Apache Commons 的那些,它没有检查 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 我编辑了它。感谢您纠正我的错误。以上是关于如何确定我的应用程序是不是在 Android 上运行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章