Android 检测设备是不是为模拟器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 检测设备是不是为模拟器相关的知识,希望对你有一定的参考价值。

参考技术A 打开 Google 搜索 “模拟器”,各种模拟器映入眼帘。“逍遥安卓-超强安卓模拟器”、“天天模拟器”、“网易MuMu”、“BlueStacks蓝叠安卓模拟器”、“夜神安卓模拟器”、“海马玩模拟器”、“51模拟器”当然还有功能强大的“Genymotion”……

经过上网查找,发现类似的帖子并不是太多,其中经过筛选,发现下面几个通用的解决方案。

于是把上面两种方案结合起来,就是:

经过在各个模拟器上测试,发现大多数都是可以检测出来的,只有各别模拟器不可以检测出来,其中包括“夜神安卓模拟器”。经过观察与对比发现,夜神安卓模拟器有一个和其他模拟器以及手机(手头的)不同的地方,就是“Build.SERIAL”是一个16位的字符串,而其他模拟器都是“unknow"或者"android",真机是 8 位的字符串,哈哈小样被我抓住了吧,于是修改了检测方法。

再次检测,成功识别!!

由于手头的手机有限,担心将手机识别错误,于是在 weTest 平台抽样对各品牌手机进行测试,果然不出所料,问题出现了。当测试到华为畅享5s的时候,竟然也被识别为模拟器。这下悲剧了,毕竟手机用户还是主要的,可不能错杀好人啊!!!经过观察,发现问题出现在上面自作聪明加的一个判断中 Build.SERIAL.length() > 8 ,这个手机的 Build.SERIAL 也是 16 位,这可如何是好???

App 中有一个跳转到拨号盘的功能,当然在模拟器中无意点到这个按钮的时候,App 居然 Crash 了,这引起了我的注意,加为之前在真机上从来没有出现过问题,于是再次尝试点击这个按钮,它再次如我所料的 Crash 掉了。我实然灵机一动,对啊这是模拟器,不能拨打电话,所以 Crash 了,这不正是解决方案吗?(一不小心一个 Crash 竟然救了我)于是我在其他几个模拟器中也尝试点击这个按钮,结果是大部分都不支持这个操作,而且都是简单粗暴的直接 Crash 。虽然不能 100% 的识别,但大多数还是可以以此来做识别凭证的。

接下来再修改方法,慢着!大多数平板也是不支持拨打电话的,由于手头也是只有一台华为的平板,测试了一下,发现是跳转到保存联系页面,这个至少也不是 Crash,所以算通过了。

最终将几种方案整合修改后如下:

其实,我相信还有更好的方法去检测,比如通过一些硬件特性,或者模拟器不能模拟的其他特性,但目前还没有找到,如果你有好的办法,欢迎分享!!!

找出Android设备是不是真实的最佳方法是啥?

【中文标题】找出Android设备是不是真实的最佳方法是啥?【英文标题】:What is the best to way to find out if an android device is real?找出Android设备是否真实的最佳方法是什么? 【发布时间】:2014-02-07 06:12:38 【问题描述】:

我们正在尝试使用某种优惠券作为奖励,只要在设备上完成新安装,就可以在实体店兑换该优惠券。我们对此进行了一些试验,并验证它是基于 IMEI 和 IMSI 的新设备。但我们发现人们在一些模拟器上这样做,这些 ID 可以被操纵并模仿新设备。如何避免这种情况?

我们目前是这样使用的

    TelephonyManager m_telephonyManager = (TelephonyManager) context.getSystemService(serviceName);
    String IMEI, IMSI;
    IMEI = m_telephonyManager.getDeviceId();
    IMSI = m_telephonyManager.getSubscriberId();
    return IMEI + ":" + IMSI;

我确信有一种方法,因为驱动安装的广告网络正确地为每个设备分配一次。

【问题讨论】:

IDs can be manipulated - 即使您使用 IMEI 的代码也可以被操纵,黑客可以更改它以从外部文件加载 ID。 广告网络也有连接的 IP 和其他可以跟踪的因素。甚至他们也会有一些误报。 在How can I detect when an Android application is running in the emulator? 和How to find out from code if my Android app runs on emulator or real device? 上查看各种答案。如果这些解决方案都不起作用,请告诉我们,以防您正在寻找不同的东西:) 【参考方案1】:

您可以使用这些方法中的任何一种来检查您的应用程序是否在模拟器中运行。但这些方法并非 100 % 可靠,但这些方法的组合可能会更好地帮助您。

方法 1

if (android.os.Build.MODEL.equals(“sdk”)) 
   // emulator
 else 
   //not emulator

方法 2

尝试将您的清单设置为依赖于模拟器通常不支持的某些硬件。例如:

<uses-feature android:name="android.hardware.sensor.accelerometer" 
              android:required="true" />

方法 3

尝试使用

Build.FINGERPRINT.contains("generic")

这些是查找应用程序是否在模拟器中运行的一些方法。希望这会有所帮助。

【讨论】:

【参考方案2】:

让他们在商店的设备上显示应用 + 生成的代码。这似乎是您当前方案防水的唯一方法。或者只是不使用设备 ID 作为标识,而是想出一些其他的促销方案;)

【讨论】:

【参考方案3】:

这不是对您问题的回答,而是关于如何获得唯一 ID 的建议。使用用户手机号码作为唯一 ID。 问题是获取电话号码并非易事,如下所示:

MSISDN : Is it a SIM Card Data? Why all The Provided Function (from Blackberry and Android) to fetch MSISDN not reliable?

因此,您可以做的是实现一个基本的握手过程,用户通过该过程输入他们的电话号码,然后将其发送到您的服务器。然后,您的服务器向给定号码发送一条短信,您的应用程序可以收听该号码。收到确认文本后,将向服务器发送一条成功消息,并且您知道该电话号码是有效且唯一的。

希望这是有道理的,祝您的项目一切顺利。

【讨论】:

以上是关于Android 检测设备是不是为模拟器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xamarin 无法为 android 模拟器打印设备日志

android模拟器是不是足以进行调试?

第一章 工欲善其事 必先利其器—Android SDK工具

iPhone模拟器和Android模拟器之间的区别

Android - 如何检测应用程序是否在Nox模拟器上运行?

Android 模拟器没有检测到正确的屏幕尺寸?