android 检测是否模拟器,Android全面检测设备是否模拟器

前言

前段时间工作有个需求,要求检测App是否在模拟器环境下运行,就像在有些手机游戏上可以看到这个功能

6df4664225db

乍一看蛮简单的,后来我查了一下资料,然后头都大了······

6df4664225db

这多亏了国内pc端模拟器的发展,现在市面上的模拟器越来越多,也越来越“逼真”了,模拟器和真机的区别在逐步缩小,这就使得模拟器的检测存在偏差,不管有多小,偏差总是会存在的,如何降低这种偏差值,就是这篇文章像讨论的内容。

先来看一下我是怎么头大的

1.拨号检测法

首先一开始想到的就是能否拨号,真机肯定可以的,不然手机的根基就没了,模拟器肯定不能拨号,所以我很快写下代码:

public boolean isSimulator1() {

String url = "tel:" + "123456";

Intent intent = new Intent();

intent.setData(Uri.parse(url));

intent.setAction(Intent.ACTION_DIAL);

// 是否可以处理跳转到拨号的 Intent

boolean canResolveIntent = intent.resolveActivity(mContext.getPackageManager()) != null;

return !canResolveIntent;

}

完事收工!... ... 等会,夜神模拟器怎么可以返回个false?也就是夜神模拟器是可以跳转拨号的😓。

2.设备标识符检测法

不行我就换一种方式,我记得Android有个设备标识符Build.MANUFACTURER,它是用来标注手机厂商的,例如小米手机的MANUFACTURER的值为:Xiaomi,三星手机则为:Samsung……而模拟器的值一般是跟他们的品牌有关,例如Genymotion的Build.MANUFACTURER为Genymotion,Mumu模拟器的值为netease等,可以根据比较此值来较为方便的区分模拟器和真实设备。

但是!又是夜神模拟器,他有个很骚的地方,就是这个值你可以通过系统设置修改,比如我把他改成小米的:

6df4664225db

结果输出的Build.MANUFACTURER的值正是Xiaomi,所以这种方式也不可行

查了下网上很多也用到的类似这种比较设备标识符的方法,但是效果也不是很好,几乎都会卡在夜神模拟器这关,例如将筛选条件变得更加多样:(方法实现可以查看这篇博客)

public boolean isSimulator2() {

String url = "tel:" + "123456";

Intent intent = new Intent();

intent.setData(Uri.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值