Android 判断App运行在模拟器还是真机上的最终解决方案
Android 判断App运行在模拟器还是真机上的最终解决方案
最近公司搞了一波送福利的活动,被人用模拟器恶意刷注册量了.
后来我经过研究和实测,得出以下方法,目前还没有发现有模拟器能突破这个检测,方法如下:
方法使用:
- if(Android_ID_Utils.notHasBlueTooth()
- ||Android_ID_Utils.notHasLightSensorManager(this)
- ||Android_ID_Utils.isFeatures()
- ||Android_ID_Utils.checkIsNotRealPhone()
- ||Android_ID_Utils.checkPipes()){
- ToastUtils.ToastLong(this,"检查到您的设备违规,将限制您的所有功能使用!");
- return;
- }
方法实体:
- /*
- *作者:赵星海
- *时间:2019/2/21 17:50
- *用途:判断蓝牙是否有效来判断是否为模拟器
- *返回:true 为模拟器
- */
- public static boolean notHasBlueTooth() {
- BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
- if (ba == null) {
- return true;
- } else {
- // 如果有蓝牙不一定是有效的。获取蓝牙名称,若为null 则默认为模拟器
- String name = ba.getName();
- if (TextUtils.isEmpty(name)) {
- return true;
- } else {
- return false;
- }
- }
- }
- /*
- *作者:赵星海
- *时间:2019/2/21 17:55
- *用途:依据是否存在光传感器来判断是否为模拟器
- *返回:true 为模拟器
- */
- public static Boolean notHasLightSensorManager(Context context) {
- SensorManager sensorManager = (SensorManager) context.getSystemService(context.SENSOR_SERVICE);
- Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); //光
- if (null == sensor8) {
- return true;
- } else {
- return false;
- }
- }
- /*
- *作者:赵星海
- *时间:2019/2/21 17:56
- *用途:根据部分特征参数设备信息来判断是否为模拟器
- *返回:true 为模拟器
- */
- public static boolean isFeatures() {
- 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);
- }
- /*
- *作者:赵星海
- *时间:2019/2/21 17:58
- *用途:根据CPU是否为电脑来判断是否为模拟器
- *返回:true 为模拟器
- */
- public static boolean checkIsNotRealPhone() {
- String cpuInfo = readCpuInfo();
- if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {
- return true;
- }
- return false;
- }
- /*
- *作者:赵星海
- *时间:2019/2/21 17:58
- *用途:根据CPU是否为电脑来判断是否为模拟器(子方法)
- *返回:String
- */
- public static String readCpuInfo() {
- String result = "";
- try {
- String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
- ProcessBuilder cmd = new ProcessBuilder(args);
- Process process = cmd.start();
- StringBuffer sb = new StringBuffer();
- String readLine = "";
- BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
- while ((readLine = responseReader.readLine()) != null) {
- sb.append(readLine);
- }
- responseReader.close();
- result = sb.toString().toLowerCase();
- } catch (IOException ex) {
- }
- return result;
- }
- /*
- *作者:赵星海
- *时间:2019/2/21 17:50
- *用途:检测模拟器的特有文件
- *返回:true 为模拟器
- */
- private static String[] known_pipes = {"/dev/socket/qemud", "/dev/qemu_pipe"};
- public static boolean checkPipes() {
- for (int i = 0; i < known_pipes.length; i++) {
- String pipes = known_pipes[i];
- File qemu_socket = new File(pipes);
- if (qemu_socket.exists()) {
- Log.v("Result:", "Find pipes!");
- return true;
- }
- }
- Log.i("Result:", "Not Find pipes!");
- return false;
- }
如果您有什么建议的话,欢迎留言评论.谢谢.
Android 判断App运行在模拟器还是真机上的最终解决方案相关推荐
- android5.0以后获取应用运行状态,Android判断App前台运行还是后台运行(运行状态)...
本文通过图文并茂的方式给大家介绍android判断app状态的相关内容,具体详情如下所示: 要了解这块,首先需要明白一些概念,app,process,task 1.process就是进程,是linux ...
- Android 判断app是否在前台还是在后台运行
Android 判断app是否在前台还是在后台运行,直接看代码,可直接使用. [java] view plain copy public static boolean isBackground(Co ...
- 写入iCloud在模拟器和真机上失败的解决办法
使用CloudKit将数据写入iCloud时无论是在真机还是模拟器上均出现错误,提示网络连接失败. 开发环境为Xcode 8.3.2,iOS版本为10.3. 当提示网络错误时可以确认网络是没有问题的. ...
- Android判断软键盘弹出并隐藏的简单完美解决方案
Android判断软键盘弹出并隐藏的简单完美解决方案 参考文章: (1)Android判断软键盘弹出并隐藏的简单完美解决方案 (2)https://www.cnblogs.com/thare1307/ ...
- Android 启动APP时黑屏白屏的三个解决方案
Android 启动APP时黑屏白屏的三个解决方案 参考文章: (1)Android 启动APP时黑屏白屏的三个解决方案 (2)https://www.cnblogs.com/liqw/p/42634 ...
- android判断app前后台状态
项目中需要在应用从后台切换到前台时做操作,自己实现了功能,但对这块的机制不太了解,So.找了相关的资料来学习总结下. !!! 部分资料来源https://github.com/wenmingvs/An ...
- Android Screen Monitor抓取模拟器与真机界面
ASM(Android Screen Monitor)下载地址: https://code.google.com/archive/p/android-screen-monitor/ 获取ASM.jar ...
- Android判断app是不是第一次启动
判断APP是不是第一次启动 基本思路就是,在第一次启动APP的时候,在本地保存一个布尔数据进行记录.如果是第一次启动保存为true,然后进行判断,如果是true,则提示是第一次启动并且修改为false ...
- 《Buildozer打包实战指南》第五节 在安卓模拟器和真机上运行apk文件并查看日志
目录 5.1 在安卓模拟器上运行apk文件并查看日志 5.2 在真机上运行并查看日志 5.3 查看apk包内日志 成功打包出apk文件并不代表真正成功,只
最新文章
- 谨慎能捕千秋蝉(二)——CSRF
- python3爬虫实例-python3.7简单的爬虫实例详解
- 【数字信号处理】线性常系数差分方程 ( 概念 | 线性常系数差分方程解法 )
- 米的建站日记(2014年12月18日)
- RxJava 教程第一部分:为何使用RxJava
- Linux内存管理 (4)分配物理页面
- 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch
- NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询
- 密实逃脱1深红色房间攻略
- 让ListView中的控件失去焦点:android:descendantFocusability=blocksDescendants
- 实验吧-PHP大法-eregi()函数
- 夜店App不应该是SNS,而应该是O2O
- TextRank算法学习笔记
- WPF 设置窗口不跟随触摸惯性拖动抖动
- 雷诺rarone机械手表日期怎么调?
- 谷歌将发布全新搜索引擎,你期待吗?
- LOJ10155 一本通1577 数字转换 题解
- PDF怎么修改文字?其实修改PDF内容很简单
- canvas图片绘制-两张图片的叠加
- Ubuntu解压缩命令详解