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

2023-11-07

在网上试了很多区分方法感觉都被模拟器破了,只能说一句模拟器太强大了,当我快要放弃的时候,突然想到个方法,方法分为获取手机的短信,获取手机的图片,获取手机的通讯录,一个正常的用户不可能没有这些信息,当然这些需要用户同意授权,所以当这些没用没授权的时候,我们就要执行第二个方案,那就是获取手机的温度和电量电压,分别在刚启动游戏或者软件时获取一次数据,然后用户登录是获取一次数据,如果两次数据一样那就是模拟器,用这两个方案结合我试了夜神模拟器,雷电模拟器,蓝叠模拟器都可以检测到是模拟器,下面我放上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) {
				// 只要有一个权限没有被授予, 则直接返回 false
				Log.i("unity", "检查权限!");
				_IsSimulator = true;
				return false;
			}
		}
		return true;
	}

	/**
	 * 第 3 步: 申请权限结果返回处理
	 */
	@Override
	public 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;
			}
		}
	}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android关于手机和模拟器的区分 的相关文章

随机推荐

  • js实现轮播图原理及示例(转)

    网上有很多的例子介绍 在这里我所做的 无缝滚动 就是 通过改变元素的left值让图片呈现左右滚动的效果 我们首先看一下 div css 的结构样式 div css代码
  • 计算机二级excel评选投票,计算机二级-31-2.电子表格题(小刘-评选投票)

    1 首先查看本节课的课程题目 要求如图所示 2 然后打开 考试素材 具体目录如图所示 3 然后是 第一小题 修改文件名为Excel 进行另存 默认一般跟素材文件夹目录相同 4 第二小题 题目要求如图所示 5 首先检查 代码地址是否对应 然后
  • 正则表达式攻略

    第一章 正则表达式字符匹配攻略 正则表达式是匹配模式 要么匹配字符 要么匹配位置 请记住这句话 然而关于正则如何匹配字符的学习 大部分人都觉得这块比较杂乱 毕竟元字符太多了 看起来没有系统性 不好记 本章就解决这个问题 内容包括 两种模糊匹
  • Java用File完成硬盘文件的增删查改操作

    我的项目环境是eclipse 如果用的是idea的话最好创建好一个同类名的 class文件 因为字符编码不同 我用的是GBK 如果报错或者出现中文注释不出现的话 最好搜一下idea怎么改字符编码 package com bili demo3
  • siebel escript入门——基础知识一

    1 检测escript变量是否已定义 var test if typeof test undefined TheApplication RaiseErrorText test is undefined 2 escript的基本数据类型 es
  • 立式oled拼接屏有哪些产品优点?

    葫芦岛oled拼接屏是一种高清晰度的显示屏 由多个oled屏幕拼接而成 它可以用于广告牌 展览 演示 会议等场合 具有高亮度 高对比度 高色彩饱和度 高刷新率等优点 能够吸引人们的眼球 提高信息传递效果 葫芦岛oled拼接屏的优点主要有以下
  • 02node.js-◆ 模块化的基本概念 ◆ Node.js 中模块的分类 ◆ npm与包 ◆ 模块的加载机制

    学习内容 模块化的基本概念 Node js 中模块的分类 npm与包 模块的加载机制 1 模块化的基本概念 1 1 什么是模块化 模块化是指解决一个复杂问题时 自顶向下逐层把系统划分成若干模块的过程 对于整个系统来说 模块是可组合 分解和更
  • linux中,如何使用tar进行解压缩

    linux中 如何使用tar进行解压缩 环境 windows 7 virtualboax fedora 15 kde 可以使用tar命令解压缩 tar gz文件 下面以解压缩qt源文件举例 1 在windows中将qt源文件拷贝到共享文件夹
  • Python基础语法【4】—— 结构数据类型之列表

    文章目录 一 创建列表 1 使用 直接创建列表 2 使用list 函数创建列表 二 访问列表元素 1 使用索引方式访问列表元素 2 使用切片方式访问列表元素 三 添加元素到列表 1 使用append 方法添加元素 2 使用extend 方法
  • nvidia 专业显卡解码能力

    专业显卡问题 p620 解码 有时我们经常遇到专业显卡 专业显卡和非专业显卡在使用opengl 等底层调用时表现不一样 值得注意的是 专业显卡解码能力到了p400 以上才有显著的提升 p620 家族为开始又有提升 p620 不支持vp8 解
  • xml 入门 dtd

    xml dtd的格式 相
  • 入门文献复现——Murphy C K——Combining belief functions when evidence conflicts

    作者Murphy提出了综合平均法来组合多个BOE 大体的步骤如下 1 将给定的BOE进行平均 获得各个BPA的平均质量averageMass 2 利用Dempster的组合规则将 1 求得的平均质量进行组合 并且组合 n 1 次 n为BOE
  • Easyexcel 导出数据 一对多关系导出数据集合

    客户要求 要求导出的表格如图 实现这样表格 很多人会想到动态表头 easypoi可以直接实现 但是我用的是easyexcel 而easyexcel自身并没有提供自动合并的功能所以还是需要自己来合并 代码如下 首先我们来看下将嵌套数据平铺 不
  • 爬虫访问中,如何解决网站限制IP的问题?

    爬虫访问中 如何解决网站限制IP的问题 多年爬虫经验的人告诉你 国内ADSL是王道 多申请些线路 分布在多个不同的电信区局 能跨省跨市 IP覆盖面越多越好 九州动态IP是一款动态IP转换器客户端 该提供国内26个省共百万数据级动态ip切换
  • 数学建模模型_数学建模模型、算法、资料必备

    提到数学建模 首先想到的是国赛 美赛 其实不然 国内目前举办了很多类似的数学建模竞赛 比如五一数学建模竞赛 中青杯等比赛 这些竞赛都可以积极参与 积累实战经验 我曾参加过数次数学建模竞赛 作为过来人 针对往年数学建模竞赛的参赛经历 我提出两
  • Python Selenium 基础入门

    本内容主要介绍 Python Selenium 的基础使用方法 1 Python Selenium 简介和环境配置 1 1 Selenium 简介 Selenium 是一个 Web 的自动化测试工具 最初是为网站自动化测试而开发的 Sele
  • matlab如何读取一个文件夹下所有文件,Matlab获取一个文件夹下所有文件

    使用Matlab可以使用dir函数获取指定文件夹下的所有文件名 具体操作如下 首先进入指定的文件夹 例如 folder C Users example Documents 替换为你自己的文件夹路径 cd folder 进入指定文件夹中 然后
  • 10亿级数据量的系统性能优化设计,被惊艳到了!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 这篇文章 我们来聊一聊在十亿级的大数据量技术挑战下 世界上最优秀的大数据系统之一的Hadoop是如何将系统性能提升数十倍的 首先一起来画个图 回顾一下Hadoop H
  • 水面无人艇局部危险避障算法研究 参考文献

    水面无人艇局部危险避障算法研究 Local Risk Obstacle Avoidance Algorithm of USV 博主 的硕士毕业论文 参考文献 1 Manley J E Unmanned surface vehicles 15
  • Android关于手机和模拟器的区分

    在网上试了很多区分方法感觉都被模拟器破了 只能说一句模拟器太强大了 当我快要放弃的时候 突然想到个方法 方法分为获取手机的短信 获取手机的图片 获取手机的通讯录 一个正常的用户不可能没有这些信息 当然这些需要用户同意授权 所以当这些没用没授