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;    }    

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

如果深海写的东西对您有用,请您给该博客点个赞吧

大家的支持就是深海写博客的动力,谢过各位

更多相关文章

  1. 英特尔® 硬件加速执行管理器安装指南 — Mac OS X*
  2. Android提高二十一篇
  3. Android: INSTALL_FAILED_UPDATE_INCOMPATIBLE错误解决措施
  4. windows 使用QUME跑Android系统
  5. Android(安卓)蓝牙操作--读取远程已配对的蓝牙设备
  6. android-JNI
  7. Android中BLE连接出现“BluetoothGatt status 133”的解决方法
  8. 【Appium】打开手机自带的浏览器
  9. android 模拟器 获取gps 值

随机推荐

  1. Executors创建线程池有哪几种方式?
  2. 招聘h5页面是什么?这支科技感招聘H5模板助
  3. 如何使用PHP if-else语句检查学生成绩等
  4. PHP switch计算器
  5. 用小鸟云服务器如何实现Nginx静态资源配
  6. .NET Core 中的并发编程
  7. 一起学习laravel中的事件以及观察者吧!
  8. 四种Laravel ORM开启created_at的方法
  9. 使用json_encode快速将中文转为Unicode编
  10. 分享高效处理laravel中curd的操作