read_phone_state是什么权限的简单介绍
2025-03-18 20:27 - 立有生活网
本文目录一览:
- 1、Android中怎样取本机的手机号码
- 2、移动端设备标识码-DevID、IMEI、IDFA、UDID
- 3、聊聊Android6.0 以上系统权限
- 4、Android 10 之隐私权限
- 5、如何动态授权android.permission.read
- 6、如何获取Android标识
Android中怎样取本机的手机号码
Android 10 中的隐私权变更
read_phone_state是什么权限的简单介绍
read_phone_state是什么权限的简单介绍
从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否适配过Android 10。
从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android 10(即targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。而普通应用无法申请该权限。
受影响的API:
—— targetSdkVersion=29 的应用,其在获取设备ID时,会直接抛出异常SecurityException
如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:
默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。即从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址。
方法1、Google解决方案
如果您的应用有非登录用户的需求,可用ANDROID_ID来标识设备。
ANDROID_ID生成规则:签名+设备信息+设备用户
ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
方法2、移动安全联盟SDK
移动安全联盟SDK
移动安全联盟(Mobile Security Alliance,简称MSA)于2017年12月4日成立,由信息通信研究院联合终端生产企业、安全企业、高等院校、研究机构、互联网企业以及芯片企业、方案企业等产业链中各个环节的重要机构共同发起。
其他资料:
Android 设备标识(多种实现方案)
(部分内容参考于网络,如有不妥,请联系删除~)
有很多场景和需求你需要用到手机设备的标识符。例如,略。
在Android中,有以下几种方法获取这样的ID。
1. The IMEI: 仅仅只对Android手机有效:
TelephonyMar TelephonyMgr = (TelephonyMar)getSystemServ(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDevId(); // Requires READ_PHONE_STATE
采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是的,它应该类似于 359881030314356(除非你有一个没有量产的手机()它可能有无效的IMEI,如:0000000000000)。
2. Pseudo-Unique ID, 这个在任何Android手机中都有效
有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:
String m_szDevIDShort = "35" + //we make this look like a valid IMEI
Build.BOARD.length()%10+ Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits
大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。
3. The Android ID , 通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Returns: 9774d56d682e549c . 无需任何许可。
4. The WLAN MAC Address string, 是另一个ID。但是你需要为你的工程加入android.permission.ACCESS_WIFI_STATE 权限,否则这个地址会为null。
WifiMar wm = (WifiMar)getSystemServ(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。).WLan不必打开,就可读取些值。
5. The BT MAC Address string, 只在有蓝牙的设备上运行。并且要加入android.permission.BLUETOOTH 权限.
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也能读取。
Combined Dev ID
综上所述,我们一共有五种方式取得设备的标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。
String m_szLongID = m_szImei + m_szDevIDShort
+ m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
// com md5
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for (int i=0;i
[img]移动端设备标识码-DevID、IMEI、IDFA、UDID
Android 10 中的隐私权变更
从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否适配过Android 10。
从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android 10(即targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。而普通应用无法申请该权限。
受影响的API:
—— targetSdkVersion=29 的应用,其在获取设备ID时,会直接抛出异常SecurityException
如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:
默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。即从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址。
方法1、Google解决方案
如果您的应用有非登录用户的需求,可用ANDROID_ID来标识设备。
ANDROID_ID生成规则:签名+设备信息+设备用户
ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
方法2、移动安全联盟SDK
移动安全联盟SDK
移动安全联盟(Mobile Security Alliance,简称MSA)于2017年12月4日成立,由信息通信研究院联合终端生产企业、安全企业、高等院校、研究机构、互联网企业以及芯片企业、方案企业等产业链中各个环节的重要机构共同发起。
其他资料:
Android 设备标识(多种实现方案)
(部分内容参考于网络,如有不妥,请联系删除~)
有很多场景和需求你需要用到手机设备的标识符。例如,略。
在Android中,有以下几种方法获取这样的ID。
1. The IMEI: 仅仅只对Android手机有效:
TelephonyMar TelephonyMgr = (TelephonyMar)getSystemServ(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDevId(); // Requires READ_PHONE_STATE
采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是的,它应该类似于 359881030314356(除非你有一个没有量产的手机()它可能有无效的IMEI,如:0000000000000)。
2. Pseudo-Unique ID, 这个在任何Android手机中都有效
有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:
String m_szDevIDShort = "35" + //we make this look like a valid IMEI
Build.BOARD.length()%10+ Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits
大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。
3. The Android ID , 通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Returns: 9774d56d682e549c . 无需任何许可。
4. The WLAN MAC Address string, 是另一个ID。但是你需要为你的工程加入android.permission.ACCESS_WIFI_STATE 权限,否则这个地址会为null。
WifiMar wm = (WifiMar)getSystemServ(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。).WLan不必打开,就可读取些值。
5. The BT MAC Address string, 只在有蓝牙的设备上运行。并且要加入android.permission.BLUETOOTH 权限.
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也能读取。
Combined Dev ID
综上所述,我们一共有五种方式取得设备的标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。
String m_szLongID = m_szImei + m_szDevIDShort
+ m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
// com md5
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for (int i=0;i
聊聊Android6.0 以上系统权限
Android 10 中的隐私权变更
从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否适配过Android 10。
从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android 10(即targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。而普通应用无法申请该权限。
受影响的API:
—— targetSdkVersion=29 的应用,其在获取设备ID时,会直接抛出异常SecurityException
如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:
默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。即从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址。
方法1、Google解决方案
如果您的应用有非登录用户的需求,可用ANDROID_ID来标识设备。
ANDROID_ID生成规则:签名+设备信息+设备用户
ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
方法2、移动安全联盟SDK
移动安全联盟SDK
移动安全联盟(Mobile Security Alliance,简称MSA)于2017年12月4日成立,由信息通信研究院联合终端生产企业、安全企业、高等院校、研究机构、互联网企业以及芯片企业、方案企业等产业链中各个环节的重要机构共同发起。
其他资料:
Android 设备标识(多种实现方案)
(部分内容参考于网络,如有不妥,请联系删除~)
有很多场景和需求你需要用到手机设备的标识符。例如,略。
在Android中,有以下几种方法获取这样的ID。
1. The IMEI: 仅仅只对Android手机有效:
TelephonyMar TelephonyMgr = (TelephonyMar)getSystemServ(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDevId(); // Requires READ_PHONE_STATE
采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是的,它应该类似于 359881030314356(除非你有一个没有量产的手机()它可能有无效的IMEI,如:0000000000000)。
2. Pseudo-Unique ID, 这个在任何Android手机中都有效
有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:
String m_szDevIDShort = "35" + //we make this look like a valid IMEI
Build.BOARD.length()%10+ Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits
大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。
3. The Android ID , 通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Returns: 9774d56d682e549c . 无需任何许可。
4. The WLAN MAC Address string, 是另一个ID。但是你需要为你的工程加入android.permission.ACCESS_WIFI_STATE 权限,否则这个地址会为null。
WifiMar wm = (WifiMar)getSystemServ(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。).WLan不必打开,就可读取些值。
5. The BT MAC Address string, 只在有蓝牙的设备上运行。并且要加入android.permission.BLUETOOTH 权限.
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也能读取。
Combined Dev ID
综上所述,我们一共有五种方式取得设备的标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。
String m_szLongID = m_szImei + m_szDevIDShort
+ m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
// com md5
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for (int i=0;i0&& grantResults[0] == PackageMar.PERMISSION_GRANTED) {
// permission was granted, yay! Do the contacts-related task you need to do.
}else{
// permission denied, boo! Disable the functionality that depends on this permission.
}
return;
}
}
}
ok,对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了!
那么将上述几个步骤结合到一起就是:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageMar.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user asynchronously -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback mod gets the
// result of the request.
}
}
谢幕,至此有关于android6.0 以上权限相关的内容已经详细讲完了!
Android 10 之隐私权限
Android 10 中的隐私权变更
从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否适配过Android 10。
从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android 10(即targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。而普通应用无法申请该权限。
受影响的API:
—— targetSdkVersion=29 的应用,其在获取设备ID时,会直接抛出异常SecurityException
如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:
默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。即从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址。
方法1、Google解决方案
如果您的应用有非登录用户的需求,可用ANDROID_ID来标识设备。
ANDROID_ID生成规则:签名+设备信息+设备用户
ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
方法2、移动安全联盟SDK
移动安全联盟SDK
移动安全联盟(Mobile Security Alliance,简称MSA)于2017年12月4日成立,由信息通信研究院联合终端生产企业、安全企业、高等院校、研究机构、互联网企业以及芯片企业、方案企业等产业链中各个环节的重要机构共同发起。
其他资料:
Android 设备标识(多种实现方案)
(部分内容参考于网络,如有不妥,请联系删除~)
如何动态授权android.permission.read
Android 10 中的隐私权变更
从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否适配过Android 10。
从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android 10(即targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。而普通应用无法申请该权限。
受影响的API:
—— targetSdkVersion=29 的应用,其在获取设备ID时,会直接抛出异常SecurityException
如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:
默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。即从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址。
方法1、Google解决方案
如果您的应用有非登录用户的需求,可用ANDROID_ID来标识设备。
ANDROID_ID生成规则:签名+设备信息+设备用户
ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
方法2、移动安全联盟SDK
移动安全联盟SDK
移动安全联盟(Mobile Security Alliance,简称MSA)于2017年12月4日成立,由信息通信研究院联合终端生产企业、安全企业、高等院校、研究机构、互联网企业以及芯片企业、方案企业等产业链中各个环节的重要机构共同发起。
其他资料:
Android 设备标识(多种实现方案)
(部分内容参考于网络,如有不妥,请联系删除~)
有很多场景和需求你需要用到手机设备的标识符。例如,略。
在Android中,有以下几种方法获取这样的ID。
1. The IMEI: 仅仅只对Android手机有效:
TelephonyMar TelephonyMgr = (TelephonyMar)getSystemServ(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDevId(); // Requires READ_PHONE_STATE
采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是的,它应该类似于 359881030314356(除非你有一个没有量产的手机()它可能有无效的IMEI,如:0000000000000)。
2. Pseudo-Unique ID, 这个在任何Android手机中都有效
有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:
String m_szDevIDShort = "35" + //we make this look like a valid IMEI
Build.BOARD.length()%10+ Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits
大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。
3. The Android ID , 通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Returns: 9774d56d682e549c . 无需任何许可。
4. The WLAN MAC Address string, 是另一个ID。但是你需要为你的工程加入android.permission.ACCESS_WIFI_STATE 权限,否则这个地址会为null。
WifiMar wm = (WifiMar)getSystemServ(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。).WLan不必打开,就可读取些值。
5. The BT MAC Address string, 只在有蓝牙的设备上运行。并且要加入android.permission.BLUETOOTH 权限.
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也能读取。
Combined Dev ID
综上所述,我们一共有五种方式取得设备的标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。
String m_szLongID = m_szImei + m_szDevIDShort
+ m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
// com md5
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for (int i=0;i
如何获取Android标识
Android 10 中的隐私权变更
从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否适配过Android 10。
从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android 10(即targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。而普通应用无法申请该权限。
受影响的API:
—— targetSdkVersion=29 的应用,其在获取设备ID时,会直接抛出异常SecurityException
如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:
默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。即从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址。
方法1、Google解决方案
如果您的应用有非登录用户的需求,可用ANDROID_ID来标识设备。
ANDROID_ID生成规则:签名+设备信息+设备用户
ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
方法2、移动安全联盟SDK
移动安全联盟SDK
移动安全联盟(Mobile Security Alliance,简称MSA)于2017年12月4日成立,由信息通信研究院联合终端生产企业、安全企业、高等院校、研究机构、互联网企业以及芯片企业、方案企业等产业链中各个环节的重要机构共同发起。
其他资料:
Android 设备标识(多种实现方案)
(部分内容参考于网络,如有不妥,请联系删除~)
有很多场景和需求你需要用到手机设备的标识符。例如,略。
在Android中,有以下几种方法获取这样的ID。
1. The IMEI: 仅仅只对Android手机有效:
TelephonyMar TelephonyMgr = (TelephonyMar)getSystemServ(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDevId(); // Requires READ_PHONE_STATE
采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是的,它应该类似于 359881030314356(除非你有一个没有量产的手机()它可能有无效的IMEI,如:0000000000000)。
2. Pseudo-Unique ID, 这个在任何Android手机中都有效
有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:
String m_szDevIDShort = "35" + //we make this look like a valid IMEI
Build.BOARD.length()%10+ Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits
大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。
3. The Android ID , 通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Returns: 9774d56d682e549c . 无需任何许可。
4. The WLAN MAC Address string, 是另一个ID。但是你需要为你的工程加入android.permission.ACCESS_WIFI_STATE 权限,否则这个地址会为null。
WifiMar wm = (WifiMar)getSystemServ(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。).WLan不必打开,就可读取些值。
5. The BT MAC Address string, 只在有蓝牙的设备上运行。并且要加入android.permission.BLUETOOTH 权限.
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也能读取。
Combined Dev ID
综上所述,我们一共有五种方式取得设备的标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。
String m_szLongID = m_szImei + m_szDevIDShort
+ m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
// com md5
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for (int i=0;i
金属工艺品制作_金属工艺品制作研究论文范文

非物质文化遗产十大分类传统技艺有哪些 嵌象牙浮雕银壶银制高脚盖杯奥地利制《嵌象牙浮雕银壶》和德国制《银制高脚盖杯》也是新古典主义时期金属工艺的例作。前者以优美而奇特的形制和华···
东巢艺术公园 萧山东巢艺术公园

关于东巢艺术公园,萧山东巢艺术公园这个很多人还不知道,今天小天来为大家解答以上的问题,现在让我们一起来看看吧! 东巢艺术公园 萧山东巢艺术公园 东巢艺术公园 萧山东巢艺术公园 1、···
南昌航空大学鲁(南昌航空大学鲁羽新)

您好,今天小篇来为大家解答以上的问题。南昌航空大学鲁相信很多小伙伴还不知道,现在让我们一起来看看吧! 南昌航空大学鲁(南昌航空大学鲁羽新) 南昌航空大学鲁(南昌航空大学鲁羽新) 南昌航···