在网上试了很多区分方法感觉都被模拟器破了,只能说一句模拟器太强大了,当我快要放弃的时候,突然想到个方法,方法分为获取手机的短信,获取手机的图片,获取手机的通讯录,一个正常的用户不可能没有这些信息,当然这些需要用户同意授权,所以当这些没用没授权的时候,我们就要执行第二个方案,那就是获取手机的温度和电量电压,分别在刚启动游戏或者软件时获取一次数据,然后用户登录是获取一次数据,如果两次数据一样那就是模拟器,用这两个方案结合我试了夜神模拟器,雷电模拟器,蓝叠模拟器都可以检测到是模拟器,下面我放上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;
}
}
}
如果有什么问题欢迎私信或者留言,希望对你会有所帮助!!!