我希望我的代码在模拟器上运行时与在设备上运行时略有不同。(例如,使用10.0.2.2代替公共URL在开发服务器上自动运行。)检测Android应用程序何时在模拟器中运行的最佳方法是什么?
当前回答
这个代码适用于我
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = tm.getNetworkOperatorName();
if("Android".equals(networkOperator)) {
// Emulator
}
else {
// Device
}
如果该设备没有sim卡,它将返回空字符串:""
由于Android模拟器总是返回“Android”作为网络运营商,我使用上面的代码。
其他回答
我的建议:
试试github上的这个。
易于检测android模拟器
在设备场(https://aws.amazon.com/device-farm/)的真实设备上检查 BlueStacks Genymotion Android模拟器 安迪46.2.207.0 菜单玩 诺克斯应用播放器 Koplayer …
如何与示例一起使用:
EmulatorDetector.with(this)
.setCheckTelephony(true)
.addPackageName("com.bluestacks")
.setDebug(true)
.detect(new EmulatorDetector.OnEmulatorDetectorListener() {
@Override
public void onResult(boolean isEmulator) {
if(isEmulator){
// Do your work
}
else{
// Not emulator and do your work
}
}
});
不知道是否有更好的方法来检测emu,但模拟器将在根目录下有init.金鱼.rc文件。
它是特定于模拟器的启动脚本,在非模拟器构建中不应该出现。
检查设备是否安装了这些包是一个好主意:
mListPackageName.add("com.google.android.launcher.layouts.genymotion");
mListPackageName.add("com.bluestacks");
mListPackageName.add("com.vphone.launcher");
mListPackageName.add("com.bignox.app");
我只是把它放在一个数组列表中…
然后简单地检查包管理器,直到找到一个。
private static boolean isEmulByPackage(Context context) {
final PackageManager pm = context.getPackageManager();
for (final String pkgName : mListPackageName) {
return isPackageInstalled(pkgName, pm);
}
return false;
}
private static boolean isPackageInstalled(final String packageName, final PackageManager packageManager) {
try {
packageManager.getPackageInfo(packageName, 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
请注意,VM很可能有一些方法来欺骗应用程序,在这种情况下,可能有必要查看一些虚拟设备中不存在的物理传感器。
我找到了新的模拟器Build。硬件= "ranchu"。
参考:https://groups.google.com/forum/ # !主题/ android-emulator-dev / dltBnUW_HzU
而且我还找到了Android官方的方法来检查是否是模拟器。我认为这对我们是很好的参考。
Android API Level 23 [Android 6.0]
package com.android.internal.util;
/**
* @hide
*/
public class ScreenShapeHelper {
private static final boolean IS_EMULATOR = Build.HARDWARE.contains("goldfish");
}
我们有ScreenShapeHelper。IS_EMULATOR来检查emulator是否。
Android API Level 24 [Android 7.0]
package android.os;
/**
* Information about the current build, extracted from system properties.
*/
public class Build {
/**
* Whether this build was for an emulator device.
* @hide
*/
public static final boolean IS_EMULATOR = getString("ro.kernel.qemu").equals("1");
}
我们有Build。IS_EMULATOR来检查emulator是否。
官方检查模拟器的方式是不是新的,也可能不够,上面的答案也提到了。
但这可能告诉我们,官方将提供官方检查是否模拟器的方法。
正如使用上面提到的所有方法一样,现在我们也可以使用这两种方法来检查模拟器是否正确。
如何访问com.android.internal包和@hide
并等待官方的开放SDK。
另一种选择是查看ro。硬件属性,看看它是否设置为金鱼。不幸的是,在Java中似乎没有一个简单的方法来做到这一点,但在C中使用property_get()是很简单的。
推荐文章
- 警告:API ' variable . getjavacompile()'已过时,已被' variable . getjavacompileprovider()'取代
- 安装APK时出现错误
- 碎片中的onCreateOptionsMenu
- TextView粗体通过XML文件?
- 如何使线性布局的孩子之间的空间?
- DSL元素android.dataBinding。enabled'已过时,已被'android.buildFeatures.dataBinding'取代
- ConstraintLayout:以编程方式更改约束
- PANIC: AVD系统路径损坏。检查ANDROID_SDK_ROOT值
- 如何生成字符串类型的buildConfigField
- Recyclerview不调用onCreateViewHolder
- Android API 21工具栏填充
- Android L中不支持操作栏导航模式
- 如何在TextView中添加一个子弹符号?
- PreferenceManager getDefaultSharedPreferences在Android Q中已弃用
- 在Android Studio中创建aar文件