最近有项目需要设备模拟器,此贴用来记录我识别模拟器的方法:

目前还没有发现安卓8.0以上的模拟器,所以可以通过判断设备安卓版本号,过滤>=8.0的设备(默认为真机)

可以从安卓8.0 以下,通过以下几个方面判断:

//Android 8.0 版本以上,不做模拟器判断
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){}

1、通过能否打电话来判断模拟器:

String url = "tel:" + "10086";Intent intent = new Intent();intent.setData(Uri.parse(url));intent.setAction(Intent.ACTION_DIAL);// 隐示意图跳转到打电话界面 Intent (检查是否存在)boolean canResolverIntent = intent.resolveActivity(context.getPackageManager()) != null;

canResolverIntent ==true,可以打电话,判断为真机。

目前主流模拟器都没有打电话这个功能:

这个来判断基本可以ban掉很多模拟器了

2、通过cpu来判断:

基本x86可以判定为模拟器

Build.MODEL.contains("x86")
android.os.Build.CPU_ABI.contains("x86")

3、第三通传感器来判断:例如:光传感器,方向传感器。

/*** 判断是否存在光传感器来判断是否为模拟器 部分真机也不存在温度和压力传感器。其余传感器模拟器也存在。** @return true 为模拟器*/
public int notHasLightSensorManager(Context context) {SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); // 光if (null == sensor8) {Log.i("", "光传感器判定为false");return 0;} else {Log.i("", "光传感器判定为true");return 1;}
}

写在最后:

手机是否安装QQ、微信、支付宝、淘宝、抖音、快手 等常用APP,也可以作为一个筛选条件。

已经root 的机器,再过滤一遍。

模拟器识别与判断,判定结果最好在服务端实现。

附上代码

package com.sdk.inner.utils;import android.bluetooth.BluetoothAdapter;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;import com.sdk.inner.log.LogUtil;import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;public class EmulatorUtils {public static boolean isEmulator = false;/*** 判断是否存在光传感器来判断是否为模拟器 部分真机也不存在温度和压力传感器。其余传感器模拟器也存在。** @return true 为模拟器*/public static boolean hasLightSensorManager(Context context) {SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); // 光if (null == sensor8) {Log.i("", "光传感器判定为false");LogUtil.d("is_emulator:hasLightSensorManager = "+false);return false;} else {Log.i("", "光传感器判定为true");LogUtil.d("is_emulator:hasLightSensorManager = "+true);return true;}}/*** 是否模拟器、** @return true 为模拟器*/public static void checkSimulator(Context context) {boolean isX86 = Build.MODEL.contains("x86");boolean isX86_1 = android.os.Build.CPU_ABI.contains("x86");//Android 8.0 版本以上,不做模拟器判断if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){LogUtil.d("is_emulator:SDK_INT = "+Build.VERSION.SDK_INT);isEmulator=false;}else {if(isX86 || isX86_1){LogUtil.d("is_emulator:isX86 = "+isX86+" isX86_1="+isX86_1);isEmulator = true;}//安卓8以下,检查rootelse if(isRoot()){isEmulator = true;}else if(!hasLightSensorManager(context)){isEmulator = true;}else if(!canCallPhone(context)){isEmulator = true;}else if(ifFeatures()){LogUtil.d("is_emulator:ifFeatures = "+true);isEmulator = true;}//安卓8以下,检查app安装else if(!checkInstallNeedApk(context)){isEmulator = true;}else {isEmulator = false;}}//        Toast.makeText(context,"is_emulator=:"+isEmulator,Toast.LENGTH_SHORT).show();LogUtil.d("is_emulator=:"+isEmulator);}public static boolean canCallPhone(Context context){String url = "tel:" + "10086";Intent intent = new Intent();intent.setData(Uri.parse(url));intent.setAction(Intent.ACTION_DIAL);// 隐示意图跳转到打电话界面 Intent (检查是否存在)boolean canResolverIntent = intent.resolveActivity(context.getPackageManager()) != null;LogUtil.d("is_emulator:canCallPhone = "+canResolverIntent);return canResolverIntent;}/*** 根据部分特征参数设备信息来判断是否为模拟器* @return*/private static boolean ifFeatures(){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.MODEL.contains("Android SDK built for x86")|| Build.MANUFACTURER.contains("Genymotion")||(Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))|| "google_sdk".equals(Build.PRODUCT);}public static boolean checkInstallNeedApk(Context context){LogUtil.d("Build.VERSION.SDK_INT = "+Build.VERSION.SDK_INT+"支付宝:"+isAliPayInstalled(context) +" 微信:"+isWeixinAvilible(context)+" qq:"+isQQClientAvailable(context));return isAliPayInstalled(context)||isWeixinAvilible(context)||isQQClientAvailable(context);}/*** 检测是否安装支付宝* @param context* @return*/public static boolean isAliPayInstalled(Context context) {Uri uri = Uri.parse("alipays://platformapi/startApp");Intent intent = new Intent(Intent.ACTION_VIEW, uri);ComponentName componentName = intent.resolveActivity(context.getPackageManager());return componentName != null;}/*** 检测是否安装微信* @param context* @return*/public static boolean isWeixinAvilible(Context context) {final PackageManager packageManager = context.getPackageManager();// 获取packagemanagerList<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息if (pinfo != null) {for (int i = 0; i < pinfo.size(); i++) {String pn = pinfo.get(i).packageName;if (pn.equals("com.tencent.mm")) {return true;}}}return false;}/*** 判断是否安装了QQ** @param context* @return*/public static boolean isQQClientAvailable(Context context) {final PackageManager packageManager = context.getPackageManager();List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);if (pinfo != null) {for (int i = 0; i < pinfo.size(); i++) {String pn = pinfo.get(i).packageName;if (pn.equals("com.tencent.mobileqq")) {return true;}}}return false;}//是否rootpublic static boolean isRoot() {boolean root = false;if (new File("/system/bin/su").exists() && isCanExecute("/system/bin/su")) {root = true;}if (new File("/system/xbin/su").exists() && isCanExecute("/system/xbin/su")) {root = true;}LogUtil.d("is_emulator:是否root = "+root);return root;}private static boolean isCanExecute(String filePath) {Process process = null;try {process = Runtime.getRuntime().exec("ls -l " + filePath);BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));String str = in.readLine();if (str != null && str.length() >= 4) {char flag = str.charAt(3);if (flag == 's' || flag == 'x')return true;}} catch (IOException e) {e.printStackTrace();} finally {if (process != null) {process.destroy();}}return false;}}

简单粗暴识别工作室Android识别模拟器相关推荐

  1. Android识别模拟器,判断是模拟器还是真机

    文章目录 前言 原理 禁止模拟器安装apk 代码识别 验证 最后 前言 对于android开发者来说,模拟器是开发工具,但是对用户来说,可能就是薅羊毛.找漏洞的赚钱工具. 不管是活动风控还是内容保护等 ...

  2. android studio 简单二维码扫描识别代码

    使用android studio 生成 扫描二维码app,简单粗暴好用 自己白天找了一上午代码也没找到 ,然后用了个github包 写了个简单的 下面上图 首先使用android studio创建一个 ...

  3. Android人脸识别和证件识别

    Android人脸识别和证件识别 程帅 由于疫情原因,最近的大数据和人脸识别检测就进入了大家的视线.对于技术的爱好,我也试着做了一下人脸识别和证件识别. 人脸识别用的是虹软的人脸识别SDK,目前是免费 ...

  4. android tensorflow文字识别身份证识别ocr文字识别商用源码

    一 ,文字识别简介 计算机文字识别,俗称光学字符识别,英文全称是Optical Character Recognition(简称OCR),它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并 ...

  5. 以牌照搜题为例,简单分析文字切割与识别部分

    转载来自两篇文章:拍照怎么搜题?(上)和拍照怎么搜题?(下) 注:这里讨论分析的仅仅是简单的思路部分,针对特定场景.自然场景下的文本区域检查.切割.识别与这里讨论的内容有一定差别. ######### ...

  6. Android实现佩戴安全帽检测和识别(含Android源码)

    Android实现佩戴安全帽检测和识别(含Android源码) 目录 Android实现佩戴安全帽检测和识别(含Android源码) 1. 前言 2. 佩戴安全帽检测和识别的方法 (1)基于目标检测的 ...

  7. 华为远程模拟器鸿蒙,某游戏在华为鸿蒙运行,被识别成使用安卓模拟器

    原标题:某游戏在华为鸿蒙运行,被识别成使用安卓模拟器 IT之家 5 月 14 日消息 华为在 2019 年开发者大会上正式推出了鸿蒙 OS 系统,并首先应用在智慧屏等产品上,并于 2020 年开发者大 ...

  8. Python3实现简单可学习的手写体识别

    0.目录 1.前言 2.通过pymssql与数据库的交互 3.通过pyqt与界面的交互 4.UI与数据库的交互 5.最后的main主函数 1.前言 版本:Python3.6.1 + PyQt5 + S ...

  9. linux卸载android studio,mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案

    如果你是mac  ,你删除as ,删不干净也正常,你会发现安装的时候,前面的东西也在.配置文件在,会导致你以前的错误不想要的东西都在. 废话不多说,复制粘贴就是干!!!!~~~~~~~~ 第一步: 复 ...

最新文章

  1. python调用c++返回带成员指针的类指针
  2. java script 教程_Java Script入门
  3. 计算机区块链的杂志,计算机类 | SPE诚邀区块链专刊(CCF B类,IF:1.338)
  4. 【Linux】一步一步学Linux——bg命令(131)
  5. 解决 Python pip 安装报错:Retrying (Retry(total=4, connect=None, read=None ...)) after connection
  6. MSTP:多生成树实例——应用案列及配置命令(实验)
  7. 剑指 Offer II 055. 二叉搜索树迭代器
  8. Ubuntu中DenyHosts清除黑名单IP地址
  9. (windows关灯模式/黑屏模式)专注于当前的工作窗口
  10. 阿里高级技术专家:研发效能的追求永无止境 1
  11. 5个步骤搞定protoc环境安装
  12. 你必须会的微服务之Hystrix熔断器
  13. Cannot save setting
  14. 下一代微型计算机,「简讯」GTX 1650完整规格曝光;任天堂推迟下一代Switch上市时间…...
  15. 企业上云要几步?中拓互联奉送企业上云全攻略
  16. 怎样申请微信公众平台接口测试帐号
  17. uni-app watch事件监听三种用法
  18. 华为云实战 之 对象存储的使用以及与腾讯云COS对比
  19. 【算法讲5:乘性函数(中)】莫比乌斯函数 | 莫比乌斯反演 | 莫比乌斯反演应用
  20. Vue插件库汇总,收藏学习!

热门文章

  1. Windows 中的键盘快捷方式
  2. terraform_有关使用terraform优化云成本的权威指南
  3. 如何同时对多个 Word 的内容进行批量替换
  4. MSDN 、 RTM 、 OEM 、 VOL 四大版本之区别
  5. 设计师常用网站,建议收藏
  6. 随机展示一个汉字,可以用来让一二年级孩子识字
  7. Python中字符串前“b”,“r”,“u”,“f”的作用
  8. GB/T28181平台服务器解决方案简介
  9. 关于阿里云个人用户选择阿里云服务器配置说明
  10. 有向图邻接矩阵幂的意义