写个博客,怕以后自己忘记方便以后可以查找到。
公司需要禁止本程序在虚拟机上运行,因为不确定因素太多而且报错率超高。所以禁止用虚拟机刷单。
网上找了好多,各种方法什么设备号(万能的虚拟机都可以),拨打电话(虚拟机可以模拟打电话),蓝牙设备(报错),一些系统文件(万能的虚拟机……)各种各样都么问题虚拟机都可以,然后查找了一篇说是检测光明敏感器,很ok夜神模拟器,木木模拟器都没有这个。结果上一个版本直接一个简单的判断光敏感器就完事,结果三星Galaxy J5这个手机也没有光敏感器……直接吓尿,还好当时只是给个提示没有让该APP禁止跳转到MainActivity(一开始是打算在logo页面直接判断如果是虚拟机就不让进去程序卡死在logo页面)结果有蛋疼了一天一顿找资料,每个判断方法都尝试了遍,返回我的信息都是false(true为虚拟机)……结果还是找到了亮点文章不多说直接上代码
public boolean isEmulator() {
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 Build.FINGERPRINT.startsWith("generic")
|| Build.FINGERPRINT.toLowerCase().contains("vbox")
|| Build.FINGERPRINT.toLowerCase().contains("test-keys")
|| Build.MODEL.contains("google_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.SERIAL.equalsIgnoreCase("unknown")
|| Build.SERIAL.equalsIgnoreCase("android")
|| Build.MODEL.contains("Android SDK built for x86")
|| Build.MANUFACTURER.contains("Genymotion")
|| (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google_sdk".equals(Build.PRODUCT)
|| ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE))
.getNetworkOperatorName().toLowerCase().equals("android")
|| !canResolverIntent;
---------------------
作者:小黑Cloud
来源:CSDN
原文:/a939006659/article/details/79213469
这个是这位大神写的测试完全可以内心大喜为了安全起见还是多做一个判断以防万一,添加判断是否有光敏感器
/*** 判断是否存在光传感器来判断是否为模拟器* 部分真机也不存在温度和压力传感器。其余传感器模拟器也存在。* @return true 为模拟器*/public static Boolean notHasLightSensorManager(Context context) {SensorManager sensorManager = (SensorManager) context.getSystemService(SENSOR_SERVICE);Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); //光if (null == sensor8) {return true;} else {return false;}}
直接在logo页面增加这个判断
if(notHasLightSensorManager(context)&&isEmulator()){Toast.makeText(SplashActivity.this,"本程序禁止在虚拟机上使用",Toast.LENGTH_LONG).show();return;}
完美~