Android关于手机和模拟器的区分
在网上试了很多区分方法感觉都被模拟器破了,只能说一句模拟器太强大了,当我快要放弃的时候,突然想到个方法,方法分为获取手机的短信,获取手机的图片,获取手机的通讯录,一个正常的用户不可能没有这些信息,当然这些需要用户同意授权,所以当这些没用没授权的时候,我们就要执行第二个方案,那就是获取手机的温度和电量电压,分别在刚启动游戏或者软件时获取一次数据,然后用户登录是获取一次数据,如果两次数据一样那就是模拟器,用这两个方案结合我试了夜神模拟器,雷电模拟器,蓝叠模拟器都可以检测到是模拟器,下面我放上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关于手机和模拟器的区分相关推荐
- Android获取手机设备信息并区分真机与模拟器
有些时候我们不想App在模拟器上被别人使用,所以我们禁止在模拟器上使用App 判断是否为真机: 根据以下四图,我们可以对真机与模拟器来做一个简单区分: 如果Serial码为unkonwn或者andro ...
- unable to locate adb , android studio无法识别模拟器和手机
配置环境变量:新建变量[Android_Home],内容: sdk绝对路径+分号+sdk下的plateform-tools的绝对路径,例如:F:\Android\Sdk;F:\Android\Sdk ...
- android外接手机模拟器,HBuilderX 连接网易mumu手机模拟器进行App开发
1.下载安装手机模拟器 常见的安卓手机模拟器: 手机模拟器名称对应端口号 夜神模拟器 62001 天天模拟器 6555 海马玩模拟器 26944 逍遥模拟器 21503 网易mumu模拟器 7555 ...
- UNIAPP 找不到手机或模拟器解决办法 android.os.DeadObjectException解决办法
参考链接: https://www.jianshu.com/p/c63272c2cfa9 https://blog.csdn.net/it1988888/article/details/1055479 ...
- android studio手机模拟器开启刘海屏
android studio创建好模拟器后都是英文的,为了方便操作,可以设置为中文. 一.设置中文 手机模拟器启动后,点击桌面上的Settings图标,如下图所示: 打开Settings面板后,拖动到 ...
- ionic 环境搭建,运行项目到浏览器,android手机,模拟器
1.node.js安装 ,去官网下载mostusers版本,不需要最新版,最新版不太稳定,安装之后会在环境变量里面自动添加,可在命令行输入:node --version 查看是否安装成功 2,进入命令 ...
- windows10 android模拟器,手机windows10模拟器安卓版
手机windows10模拟器安卓版是一款非常有趣的模拟休闲类游戏.玩家可以根据自己的需求,去选择装备各种不一样的配件,将里面的各种任务都给完成了.当然很多时候你可能会遇见到一些挑战,随着你自己的操作在 ...
- 【游戏测试】用 python 写个自动拉取手机或模拟器游戏 log 到本地的工具
情景:开发人员在查 bug 时经常需要我们提供手机或模拟器中的 log,之前都是手动或用adb命令拉取后再发送给前端程序员,鉴于不太方便自己写了个脚本实现一键拉去日志到本地的功能. 运行后的效果,所有 ...
- android系统手机的基本知识和介绍
android系统手机的基本知识和介绍 2011年11月14日 android系统手机的基本知识和介绍 Android系统的手机现在是越来越受欢迎了.看到周边的同事个个都换上了android系统的手机 ...
最新文章
- 完整的Blender三维课程:素描到三维艺术的初学者
- jQuery 中 attr() 和 prop() 方法的区别
- Spark源码阅读02-Spark核心原理之消息通信原理
- 运行nltk示例 Resource u'tokenizers punkt english.pickle' not found解决
- 通过反射获取DLL的类实现加载窗体
- POJ-2746:约瑟夫问题(Java版)
- Python 实用冷门知识整理
- VTK:网格之Triangulate
- 新手站长必须养成的五个好习惯
- C#继承与多态 virtual虚方法的使用 在子类中使用override重写父类函数
- 更换ubuntu的root的默认python版本
- python是一种面相什么语言_Python面相对象编程的知识总结
- java开源论坛 discuz_Discuz开源论坛
- 11.Doctrine2 (3)
- Pandas数据框索引函数 iloc、loc和ix学习使用
- Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
- 台式计算机技术参数响应表,详细技术参数响应表介绍.doc
- Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
- C++之类和对象基础认知
- B站 根据BV 获取av号 api
热门文章
- vue : 无法加载文件 C:\Users\jhy\AppData\Roaming\npm\vue.ps1
- linux广播命令,Linux下用命令行实现录像和广播教学功能
- python之基础数据类型初识,int,bool,str 转化,for循环
- Java企业级开发框架(三):POM文件——1概述
- java计算机毕业设计无人值守台球厅智能管理监控系统源码+数据库+lw文档+系统+部署
- Kstry框架一种服务编排的实现
- k8s中升级应用出现的问题
- 通俗理解查准率(precision)和查全率(recall)
- HTML提供了许多标记,HTML提供了许多标记,下列选项中,不属于HTML标记的是
- 学术英语 | (8) WordList7