如果我的Android应用程序在模拟器或真实设备上运行,如何从代码中找出?

Add*_*ddi 16 android emulation

我已经读过这个stackoverflow线程,我尝试使用该答案中给出的代码来查明我是在模拟器上还是在真实设备上运行我的代码:

import android.content.ContentResolver;
import android.provider.Settings.Secure;
...     
mTextView.setText(Secure.getString(getContentResolver(), Secure.ANDROID_ID));
Run Code Online (Sandbox Code Playgroud)

在我的真实设备上它返回"2bccce3 ...",但是在模拟器上它不会返回null,而是一个字符串"bd9f8 ..."

如何从代码中找出仿真器或真实设备的想法将受到高度赞赏

A. *_*iri 18

这应该这样做:

boolean inEmulator = false;
String brand = Build.BRAND;
if (brand.compareTo("generic") == 0)
{
    inEmulator = true;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

boolean inEmulator = "generic".equals(Build.BRAND.toLowerCase());
Run Code Online (Sandbox Code Playgroud)


Ern*_*nie 9

随着新的英特尔本机仿真器的出现,上述方法不再适用.现在我使用的代码片段适用于Intel和ARM仿真器:

if (Build.MODEL.contains("google_sdk") ||
    Build.MODEL.contains("Emulator") ||
    Build.MODEL.contains("Android SDK")) {
  RunsInEmulator = true;
}
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 6

Android开发者小组上有一个相当旧的帖子,建议检查设备上的传感器数量.像这样的东西可能会起作用:

SensorManager manager = (SensorManager) getSystemService(SENSOR_SERVICE);
if (manager.getSensorList(Sensor.TYPE_ALL).isEmpty()) {
    // running on an emulator
} else {
    // running on a device
}
Run Code Online (Sandbox Code Playgroud)

我没试过这个,所以我不知道这个建议有多可靠.(也许有些仿真器现在会报告一些传感器;也许有些设备没有报告任何传感器.[有没有Android牙刷吗?])但是它不能比检查一个空的ANDROID_ID(从2.2开始不起作用)更糟糕.

PS 另一个线程声称,从2.2开始,模拟器的ANDROID_ID始终为"9774D56D682E549C".但是,你显然正在获得一些其他十六进制字符串,所以我认为这也不对.

PPS我没有尝试的其他建议在这里.一个看起来特别好的(如果它有效)是:

if (android.os.Build.MODEL.equals(“google_sdk”)) {
   // emulator
} else {
   //not emulator
}
Run Code Online (Sandbox Code Playgroud)