版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接: https://blog.csdn.net/qq_39731011/article/details/87865778

Android 判断App运行在模拟器还是真机上的最终解决方案

最近公司搞了一波送福利的活动,被人用模拟器恶意刷注册量了.

后来我经过研究和实测,得出以下方法,目前还没有发现有模拟器能突破这个检测,方法如下:

方法使用:

  1. if(Android_ID_Utils.notHasBlueTooth()
  2. ||Android_ID_Utils.notHasLightSensorManager(this)
  3. ||Android_ID_Utils.isFeatures()
  4. ||Android_ID_Utils.checkIsNotRealPhone()
  5. ||Android_ID_Utils.checkPipes()){
  6. ToastUtils.ToastLong(this,"检查到您的设备违规,将限制您的所有功能使用!");
  7. return;
  8. }

方法实体:

  1. /*
  2. *作者:赵星海
  3. *时间:2019/2/21 17:50
  4. *用途:判断蓝牙是否有效来判断是否为模拟器
  5. *返回:true 为模拟器
  6. */
  7. public static boolean notHasBlueTooth() {
  8. BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
  9. if (ba == null) {
  10. return true;
  11. } else {
  12. // 如果有蓝牙不一定是有效的。获取蓝牙名称,若为null 则默认为模拟器
  13. String name = ba.getName();
  14. if (TextUtils.isEmpty(name)) {
  15. return true;
  16. } else {
  17. return false;
  18. }
  19. }
  20. }
  21. /*
  22. *作者:赵星海
  23. *时间:2019/2/21 17:55
  24. *用途:依据是否存在光传感器来判断是否为模拟器
  25. *返回:true 为模拟器
  26. */
  27. public static Boolean notHasLightSensorManager(Context context) {
  28. SensorManager sensorManager = (SensorManager) context.getSystemService(context.SENSOR_SERVICE);
  29. Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); //光
  30. if (null == sensor8) {
  31. return true;
  32. } else {
  33. return false;
  34. }
  35. }
  36. /*
  37. *作者:赵星海
  38. *时间:2019/2/21 17:56
  39. *用途:根据部分特征参数设备信息来判断是否为模拟器
  40. *返回:true 为模拟器
  41. */
  42. public static boolean isFeatures() {
  43. return Build.FINGERPRINT.startsWith("generic")
  44. || Build.FINGERPRINT.toLowerCase().contains("vbox")
  45. || Build.FINGERPRINT.toLowerCase().contains("test-keys")
  46. || Build.MODEL.contains("google_sdk")
  47. || Build.MODEL.contains("Emulator")
  48. || Build.MODEL.contains("Android SDK built for x86")
  49. || Build.MANUFACTURER.contains("Genymotion")
  50. || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
  51. || "google_sdk".equals(Build.PRODUCT);
  52. }
  53. /*
  54. *作者:赵星海
  55. *时间:2019/2/21 17:58
  56. *用途:根据CPU是否为电脑来判断是否为模拟器
  57. *返回:true 为模拟器
  58. */
  59. public static boolean checkIsNotRealPhone() {
  60. String cpuInfo = readCpuInfo();
  61. if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {
  62. return true;
  63. }
  64. return false;
  65. }
  66. /*
  67. *作者:赵星海
  68. *时间:2019/2/21 17:58
  69. *用途:根据CPU是否为电脑来判断是否为模拟器(子方法)
  70. *返回:String
  71. */
  72. public static String readCpuInfo() {
  73. String result = "";
  74. try {
  75. String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
  76. ProcessBuilder cmd = new ProcessBuilder(args);
  77. Process process = cmd.start();
  78. StringBuffer sb = new StringBuffer();
  79. String readLine = "";
  80. BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
  81. while ((readLine = responseReader.readLine()) != null) {
  82. sb.append(readLine);
  83. }
  84. responseReader.close();
  85. result = sb.toString().toLowerCase();
  86. } catch (IOException ex) {
  87. }
  88. return result;
  89. }
  90. /*
  91. *作者:赵星海
  92. *时间:2019/2/21 17:50
  93. *用途:检测模拟器的特有文件
  94. *返回:true 为模拟器
  95. */
  96. private static String[] known_pipes = {"/dev/socket/qemud", "/dev/qemu_pipe"};
  97. public static boolean checkPipes() {
  98. for (int i = 0; i < known_pipes.length; i++) {
  99. String pipes = known_pipes[i];
  100. File qemu_socket = new File(pipes);
  101. if (qemu_socket.exists()) {
  102. Log.v("Result:", "Find pipes!");
  103. return true;
  104. }
  105. }
  106. Log.i("Result:", "Not Find pipes!");
  107. return false;
  108. }

如果您有什么建议的话,欢迎留言评论.谢谢.

Android 判断App运行在模拟器还是真机上的最终解决方案相关推荐

  1. android5.0以后获取应用运行状态,Android判断App前台运行还是后台运行(运行状态)...

    本文通过图文并茂的方式给大家介绍android判断app状态的相关内容,具体详情如下所示: 要了解这块,首先需要明白一些概念,app,process,task 1.process就是进程,是linux ...

  2. Android 判断app是否在前台还是在后台运行

    Android 判断app是否在前台还是在后台运行,直接看代码,可直接使用. [java]  view plain copy public static boolean isBackground(Co ...

  3. 写入iCloud在模拟器和真机上失败的解决办法

    使用CloudKit将数据写入iCloud时无论是在真机还是模拟器上均出现错误,提示网络连接失败. 开发环境为Xcode 8.3.2,iOS版本为10.3. 当提示网络错误时可以确认网络是没有问题的. ...

  4. Android判断软键盘弹出并隐藏的简单完美解决方案

    Android判断软键盘弹出并隐藏的简单完美解决方案 参考文章: (1)Android判断软键盘弹出并隐藏的简单完美解决方案 (2)https://www.cnblogs.com/thare1307/ ...

  5. Android 启动APP时黑屏白屏的三个解决方案

    Android 启动APP时黑屏白屏的三个解决方案 参考文章: (1)Android 启动APP时黑屏白屏的三个解决方案 (2)https://www.cnblogs.com/liqw/p/42634 ...

  6. android判断app前后台状态

    项目中需要在应用从后台切换到前台时做操作,自己实现了功能,但对这块的机制不太了解,So.找了相关的资料来学习总结下. !!! 部分资料来源https://github.com/wenmingvs/An ...

  7. Android Screen Monitor抓取模拟器与真机界面

    ASM(Android Screen Monitor)下载地址: https://code.google.com/archive/p/android-screen-monitor/ 获取ASM.jar ...

  8. Android判断app是不是第一次启动

    判断APP是不是第一次启动 基本思路就是,在第一次启动APP的时候,在本地保存一个布尔数据进行记录.如果是第一次启动保存为true,然后进行判断,如果是true,则提示是第一次启动并且修改为false ...

  9. 《Buildozer打包实战指南》第五节 在安卓模拟器和真机上运行apk文件并查看日志

    目录 5.1 在安卓模拟器上运行apk文件并查看日志 5.2 在真机上运行并查看日志 5.3 查看apk包内日志 成功打包出apk文件并不代表真正成功,只

最新文章

  1. 谨慎能捕千秋蝉(二)——CSRF
  2. python3爬虫实例-python3.7简单的爬虫实例详解
  3. 【数字信号处理】线性常系数差分方程 ( 概念 | 线性常系数差分方程解法 )
  4. 米的建站日记(2014年12月18日)
  5. RxJava 教程第一部分:为何使用RxJava
  6. Linux内存管理 (4)分配物理页面
  7. 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch
  8. NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询
  9. 密实逃脱1深红色房间攻略
  10. 让ListView中的控件失去焦点:android:descendantFocusability=blocksDescendants
  11. 实验吧-PHP大法-eregi()函数
  12. 夜店App不应该是SNS,而应该是O2O
  13. TextRank算法学习笔记
  14. WPF 设置窗口不跟随触摸惯性拖动抖动
  15. 雷诺rarone机械手表日期怎么调?
  16. 谷歌将发布全新搜索引擎,你期待吗?
  17. LOJ10155 一本通1577 数字转换 题解
  18. PDF怎么修改文字?其实修改PDF内容很简单
  19. canvas图片绘制-两张图片的叠加
  20. Ubuntu解压缩命令详解

热门文章

  1. 设置VMware workstation开启共享文件夹
  2. java实现飞机_java实现飞机游戏代码
  3. 租服务器理财项目,四五个人租一台服务器就可以办团购网站
  4. java职业发展之路
  5. openpyxl修改图表中纯色填充的透明度和颜色
  6. 蓝宝小企鹅双面取暖器,安全增暖,如春天般舒适
  7. 如何在R中绘制热力地图
  8. 使用UltralISO(软碟通)制作ubuntu系统的U盘启动
  9. Python爬虫 | 爬取json数据 实现酷我音乐下载
  10. uni-app格式化代码