简单粗暴识别工作室Android识别模拟器
最近有项目需要设备模拟器,此贴用来记录我识别模拟器的方法:
目前还没有发现安卓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识别模拟器相关推荐
- Android识别模拟器,判断是模拟器还是真机
文章目录 前言 原理 禁止模拟器安装apk 代码识别 验证 最后 前言 对于android开发者来说,模拟器是开发工具,但是对用户来说,可能就是薅羊毛.找漏洞的赚钱工具. 不管是活动风控还是内容保护等 ...
- android studio 简单二维码扫描识别代码
使用android studio 生成 扫描二维码app,简单粗暴好用 自己白天找了一上午代码也没找到 ,然后用了个github包 写了个简单的 下面上图 首先使用android studio创建一个 ...
- Android人脸识别和证件识别
Android人脸识别和证件识别 程帅 由于疫情原因,最近的大数据和人脸识别检测就进入了大家的视线.对于技术的爱好,我也试着做了一下人脸识别和证件识别. 人脸识别用的是虹软的人脸识别SDK,目前是免费 ...
- android tensorflow文字识别身份证识别ocr文字识别商用源码
一 ,文字识别简介 计算机文字识别,俗称光学字符识别,英文全称是Optical Character Recognition(简称OCR),它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并 ...
- 以牌照搜题为例,简单分析文字切割与识别部分
转载来自两篇文章:拍照怎么搜题?(上)和拍照怎么搜题?(下) 注:这里讨论分析的仅仅是简单的思路部分,针对特定场景.自然场景下的文本区域检查.切割.识别与这里讨论的内容有一定差别. ######### ...
- Android实现佩戴安全帽检测和识别(含Android源码)
Android实现佩戴安全帽检测和识别(含Android源码) 目录 Android实现佩戴安全帽检测和识别(含Android源码) 1. 前言 2. 佩戴安全帽检测和识别的方法 (1)基于目标检测的 ...
- 华为远程模拟器鸿蒙,某游戏在华为鸿蒙运行,被识别成使用安卓模拟器
原标题:某游戏在华为鸿蒙运行,被识别成使用安卓模拟器 IT之家 5 月 14 日消息 华为在 2019 年开发者大会上正式推出了鸿蒙 OS 系统,并首先应用在智慧屏等产品上,并于 2020 年开发者大 ...
- Python3实现简单可学习的手写体识别
0.目录 1.前言 2.通过pymssql与数据库的交互 3.通过pyqt与界面的交互 4.UI与数据库的交互 5.最后的main主函数 1.前言 版本:Python3.6.1 + PyQt5 + S ...
- linux卸载android studio,mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
如果你是mac ,你删除as ,删不干净也正常,你会发现安装的时候,前面的东西也在.配置文件在,会导致你以前的错误不想要的东西都在. 废话不多说,复制粘贴就是干!!!!~~~~~~~~ 第一步: 复 ...
最新文章
- python调用c++返回带成员指针的类指针
- java script 教程_Java Script入门
- 计算机区块链的杂志,计算机类 | SPE诚邀区块链专刊(CCF B类,IF:1.338)
- 【Linux】一步一步学Linux——bg命令(131)
- 解决 Python pip 安装报错:Retrying (Retry(total=4, connect=None, read=None ...)) after connection
- MSTP:多生成树实例——应用案列及配置命令(实验)
- 剑指 Offer II 055. 二叉搜索树迭代器
- Ubuntu中DenyHosts清除黑名单IP地址
- (windows关灯模式/黑屏模式)专注于当前的工作窗口
- 阿里高级技术专家:研发效能的追求永无止境 1
- 5个步骤搞定protoc环境安装
- 你必须会的微服务之Hystrix熔断器
- Cannot save setting
- 下一代微型计算机,「简讯」GTX 1650完整规格曝光;任天堂推迟下一代Switch上市时间…...
- 企业上云要几步?中拓互联奉送企业上云全攻略
- 怎样申请微信公众平台接口测试帐号
- uni-app watch事件监听三种用法
- 华为云实战 之 对象存储的使用以及与腾讯云COS对比
- 【算法讲5:乘性函数(中)】莫比乌斯函数 | 莫比乌斯反演 | 莫比乌斯反演应用
- Vue插件库汇总,收藏学习!
热门文章
- Windows 中的键盘快捷方式
- terraform_有关使用terraform优化云成本的权威指南
- 如何同时对多个 Word 的内容进行批量替换
- MSDN 、 RTM 、 OEM 、 VOL 四大版本之区别
- 设计师常用网站,建议收藏
- 随机展示一个汉字,可以用来让一二年级孩子识字
- Python中字符串前“b”,“r”,“u”,“f”的作用
- GB/T28181平台服务器解决方案简介
- 关于阿里云个人用户选择阿里云服务器配置说明
- 有向图邻接矩阵幂的意义