在网上试了很多区分方法感觉都被模拟器破了,只能说一句模拟器太强大了,当我快要放弃的时候,突然想到个方法,方法分为获取手机的短信,获取手机的图片,获取手机的通讯录,一个正常的用户不可能没有这些信息,当然这些需要用户同意授权,所以当这些没用没授权的时候,我们就要执行第二个方案,那就是获取手机的温度和电量电压,分别在刚启动游戏或者软件时获取一次数据,然后用户登录是获取一次数据,如果两次数据一样那就是模拟器,用这两个方案结合我试了夜神模拟器,雷电模拟器,蓝叠模拟器都可以检测到是模拟器,下面我放上Android代码:

获取手机电压:

 public int Voltage(){IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);Intent batteryStatusIntent = registerReceiver(null, intentFilter);int voltage = batteryStatusIntent.getIntExtra("voltage", 99999);return voltage;}

获取手机温度:

 public int Temperature(){IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);Intent batteryStatusIntent = registerReceiver(null, intentFilter);int temperature = batteryStatusIntent.getIntExtra("temperature", 99999);return temperature;}

获取手机照片数量:(需要加权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

public int GetPhonePhotoCount(){//获取手机照片数量Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;ContentResolver contentResolver = getContentResolver();if (contentResolver !=null){Cursor mCursor = contentResolver.query(uri,null,null,null,null);return mCursor.getCount();}else{Log.i("Unity", "获取ContentResolver失败");}return -1;}

获取手机联系人数量:(需要动态获取权限最后会附上如何动态获取)

public int GetPhoneContacts(){//读取联系人权限
//      JSONArray allArray = new JSONArray();int count=0;StringBuffer info = new StringBuffer();Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;ContentResolver resolver = this.getContentResolver();//需要查找的信息final String[] PHONES_PROJECTION = new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME};// 获取手机联系人Cursor phoneCursor = resolver.query(uri,PHONES_PROJECTION, null, null, null);if(phoneCursor!=null){while (phoneCursor.moveToNext()){count+=1;
//              //得到手机号码
//              String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//              String nickName = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//              if(!TextUtils.isEmpty(phoneNumber))
//              {//                  try {//                      JSONObject jsonObject=new JSONObject();
//                      jsonObject.put("name",nickName);
//                      jsonObject.put("phone",phoneNumber);
//                      allArray.put(jsonObject);
//                  } catch (JSONException e) {//                      e.printStackTrace();
//                  }
//              }}phoneCursor.close();}// 获取Sims卡联系人uri = Uri.parse("content://icc/adn");phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null,null);if(phoneCursor!=null){while (phoneCursor.moveToNext()){count+=1;
//              try
//              {//                  //得到手机号码
//                  String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//                  String nickName = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//                  if(!TextUtils.isEmpty(phoneNumber))
//                  {//                      JSONObject jsonObject=new JSONObject();
//                      jsonObject.put("name",nickName);
//                      jsonObject.put("phone",phoneNumber);
//                      allArray.put(jsonObject);
//                  }
//              }
//              catch(Exception e)
//              {//                  break;
//              }}phoneCursor.close();}uri = Uri.parse("content://sim/adn");phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null,null);if(phoneCursor!=null){while (phoneCursor.moveToNext()){count+=1;
//              try
//              {//                  //得到手机号码
//                  String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//                  String nickName = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//                  if(!TextUtils.isEmpty(phoneNumber))
//                  {//
//                      JSONObject jsonObject=new JSONObject();
//                      jsonObject.put("name",nickName);
//                      jsonObject.put("phone",phoneNumber);
//                      allArray.put(jsonObject);
//                  }
//              }
//              catch(Exception e)
//              {//                  break;
//              }}phoneCursor.close();}return count;}

获取手机短信数量:(需要动态获取权限最后会附上如何动态获取)

private Uri SMS_INBOX = Uri.parse("content://sms/");private int obtainPhoneMessage() {ContentResolver cr = getContentResolver();String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};Cursor cur = cr.query(SMS_INBOX, projection, null, null, "date desc");if (null == cur) {return 0;}return cur.getCount();}

动态获取权限:

private static final int MY_PERMISSION_REQUEST_CODE = 10000;public void checkPermission() {/*** 第 1 步: 检查是否有相应的权限*/boolean isAllGranted = checkPermissionAllGranted(new String[] {Manifest.permission.READ_CONTACTS,Manifest.permission.READ_SMS,Manifest.permission.RECEIVE_SMS,
//                        Manifest.permission.CAMERA});// 如果这3个权限全都拥有, 则直接执行读取短信代码if (isAllGranted) {Log.i("unity", "所有权限已经授权!");if (GetPhoneContacts() == 0 && obtainPhoneMessage() == 0 && GetPhonePhotoCount()==0){_IsSimulator = true;}else{_IsSimulator = false;}return;}/*** 第 2 步: 请求权限*/// 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.READ_CONTACTS,Manifest.permission.READ_SMS,Manifest.permission.RECEIVE_SMS,
//                        Manifest.permission.CAMERA},MY_PERMISSION_REQUEST_CODE);}/*** 检查是否拥有指定的所有权限*/private boolean checkPermissionAllGranted(String[] permissions) {for (String permission : permissions) {if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {// 只要有一个权限没有被授予, 则直接返回 falseLog.i("unity", "检查权限!");_IsSimulator = true;return false;}}return true;}/*** 第 3 步: 申请权限结果返回处理*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == MY_PERMISSION_REQUEST_CODE) {boolean isAllGranted = true;// 判断是否所有的权限都已经授予了for (int grant : grantResults) {if (grant != PackageManager.PERMISSION_GRANTED) {isAllGranted = false;break;}}if (isAllGranted) {// 如果所有的权限都授予了, 则执行读取短信代码Log.i("unity", "所有权限已经授权!");if (GetPhoneContacts() == 0 && obtainPhoneMessage() == 0 && GetPhonePhotoCount()==0){_IsSimulator = true;}else{_IsSimulator = false;}return;} else {// 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
//                openAppDetails();Log.i("unity", "检查权限!");_IsSimulator = true;}}}

如果有什么问题欢迎私信或者留言,希望对你会有所帮助!!!

Android关于手机和模拟器的区分相关推荐

  1. Android获取手机设备信息并区分真机与模拟器

    有些时候我们不想App在模拟器上被别人使用,所以我们禁止在模拟器上使用App 判断是否为真机: 根据以下四图,我们可以对真机与模拟器来做一个简单区分: 如果Serial码为unkonwn或者andro ...

  2. unable to locate adb , android studio无法识别模拟器和手机

    配置环境变量:新建变量[Android_Home],内容:  sdk绝对路径+分号+sdk下的plateform-tools的绝对路径,例如:F:\Android\Sdk;F:\Android\Sdk ...

  3. android外接手机模拟器,HBuilderX 连接网易mumu手机模拟器进行App开发

    1.下载安装手机模拟器 常见的安卓手机模拟器: 手机模拟器名称对应端口号 夜神模拟器 62001 天天模拟器 6555 海马玩模拟器 26944 逍遥模拟器 21503 网易mumu模拟器 7555 ...

  4. UNIAPP 找不到手机或模拟器解决办法 android.os.DeadObjectException解决办法

    参考链接: https://www.jianshu.com/p/c63272c2cfa9 https://blog.csdn.net/it1988888/article/details/1055479 ...

  5. android studio手机模拟器开启刘海屏

    android studio创建好模拟器后都是英文的,为了方便操作,可以设置为中文. 一.设置中文 手机模拟器启动后,点击桌面上的Settings图标,如下图所示: 打开Settings面板后,拖动到 ...

  6. ionic 环境搭建,运行项目到浏览器,android手机,模拟器

    1.node.js安装 ,去官网下载mostusers版本,不需要最新版,最新版不太稳定,安装之后会在环境变量里面自动添加,可在命令行输入:node --version 查看是否安装成功 2,进入命令 ...

  7. windows10 android模拟器,手机windows10模拟器安卓版

    手机windows10模拟器安卓版是一款非常有趣的模拟休闲类游戏.玩家可以根据自己的需求,去选择装备各种不一样的配件,将里面的各种任务都给完成了.当然很多时候你可能会遇见到一些挑战,随着你自己的操作在 ...

  8. 【游戏测试】用 python 写个自动拉取手机或模拟器游戏 log 到本地的工具

    情景:开发人员在查 bug 时经常需要我们提供手机或模拟器中的 log,之前都是手动或用adb命令拉取后再发送给前端程序员,鉴于不太方便自己写了个脚本实现一键拉去日志到本地的功能. 运行后的效果,所有 ...

  9. android系统手机的基本知识和介绍

    android系统手机的基本知识和介绍 2011年11月14日 android系统手机的基本知识和介绍 Android系统的手机现在是越来越受欢迎了.看到周边的同事个个都换上了android系统的手机 ...

最新文章

  1. 完整的Blender三维课程:素描到三维艺术的初学者
  2. jQuery 中 attr() 和 prop() 方法的区别
  3. Spark源码阅读02-Spark核心原理之消息通信原理
  4. 运行nltk示例 Resource u'tokenizers punkt english.pickle' not found解决
  5. 通过反射获取DLL的类实现加载窗体
  6. POJ-2746:约瑟夫问题(Java版)
  7. Python 实用冷门知识整理
  8. VTK:网格之Triangulate
  9. 新手站长必须养成的五个好习惯
  10. C#继承与多态 virtual虚方法的使用 在子类中使用override重写父类函数
  11. 更换ubuntu的root的默认python版本
  12. python是一种面相什么语言_Python面相对象编程的知识总结
  13. java开源论坛 discuz_Discuz开源论坛
  14. 11.Doctrine2 (3)
  15. Pandas数据框索引函数 iloc、loc和ix学习使用
  16. Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
  17. 台式计算机技术参数响应表,详细技术参数响应表介绍.doc
  18. Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
  19. C++之类和对象基础认知
  20. B站 根据BV 获取av号 api

热门文章

  1. vue : 无法加载文件 C:\Users\jhy\AppData\Roaming\npm\vue.ps1
  2. linux广播命令,Linux下用命令行实现录像和广播教学功能
  3. python之基础数据类型初识,int,bool,str 转化,for循环
  4. Java企业级开发框架(三):POM文件——1概述
  5. java计算机毕业设计无人值守台球厅智能管理监控系统源码+数据库+lw文档+系统+部署
  6. Kstry框架一种服务编排的实现
  7. k8s中升级应用出现的问题
  8. 通俗理解查准率(precision)和查全率(recall)
  9. HTML提供了许多标记,HTML提供了许多标记,下列选项中,不属于HTML标记的是
  10. 学术英语 | (8) WordList7