IMEI
只有Android手机才有, IMEI号是一串15位的号码,比如像这样 359881030314356
TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDeviceId();
需要权限android.permission.READ_PHONE_STATE
通常用户会因为你向他们要了这个权限而给你一个差评,因为他们觉得你就是在窃取他们的隐私,很明显,你就是在收集一些数据
Android ID
这个是不靠谱的,因为有时候它是null的,文档中明确说明,如果你恢复了出厂设置,那他就会改变的。而且如果你root了手机,你也可以手动改变这个ID。
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
它返回的是9774d56d682e549c这样一串东西,倒是不需要什么权限。
部分设备由于制造商错误实现,导致多台设备会返回相同的 Android_ID.
WLAN MAC地址
这也可以得到一个独一无二的ID号,返回的是 00:11:22:33:44:55 。但是当没有wifi的时候,我们是无法获得数据的。
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
需要权限 android.permission.ACCESS_WIFI_STATE
蓝牙MAC地址
市面上大部分的应用不使用蓝牙,如果你的应用根本没用蓝牙,而你却和用户要了蓝牙权限的,那你很可疑。
BluetoothAdapter m_BluetoothAdapter = null;
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_szBTMAC = m_BluetoothAdapter.getAddress();
需要权限android.permission.BLUETOOTH
设备序列号(Serial Number, SN)
获取办法:
String serialNum = android.os.Build.SERIAL;
// android 8.0之后要用下面
String serialNum = android.os.Build.getSerial()
比如 01b4549262d6a4a2,是比较稳定的设备硬件标识符
从api 26:android 8.0 oreo开始,需要 android.permission.READ_PHONE_STATE
权限。不推荐使用
AAID 和 OAID
AAID是Android平台内的广告跟踪ID,OAID为AAID在国内的替代ID。
由于AAID依托于Google服务框架,但在国内使用Google服务并不可行,而且大部分国产手机内置的Google服务并不完整,所以App开发者需要寻找新的方式去标识用户,于是OAID应运而生。
可以通过miit_mdid包来获取AAID和OAID。
下载miit_mdid_1.0.10.aar
,放进项目的libs路径下
在模块的<build.gradle>的dependencies段加入:
implementation fileTree(dir: 'libs', include: ['*.aar'])
//初始化
fun initJLibrary(context: Context?) {
if (Build.VERSION.SDK_INT > 28) {
JLibrary.InitEntry(context)
}
}
// MdidSdkHelper.InitSdk的回调函数中获取oaid和aaid
@Synchronized
fun updateOaidIfNull(context: Context?) {
if (Build.VERSION.SDK_INT <= 28)
return
MdidSdkHelper.InitSdk(context, true,
IIdentifierListener { z, idSupplier ->
val oaid = idSupplier.oaid
var aaid = idSupplier.aaid
Pseudo ID
使用硬件信息拼凑出来的15位号码
/**
* Return pseudo unique ID
* @return ID
*/
public static String getPsuedoUniqueID()
{
// If all else fails, if the user does have lower than API 9 (lower
// than Gingerbread), has reset their phone or 'Secure.ANDROID_ID'
// returns 'null', then simply the ID returned will be solely based
// off their Android device information. This is where the collisions
// can happen.
// Thanks http://www.pocketmagic.net/?p=1662!
// Try not to use DISPLAY, HOST or ID - these items could change.
// If there are collisions, there will be overlapping data
String m_szDevIDShort = "35" +
(Build.BOARD.length() % 10)
+ (Build.BRAND.length() % 10)
+ (Build.CPU_ABI.length() % 10)
+ (Build.DEVICE.length() % 10)
+ (Build.MANUFACTURER.length() % 10)
+ (Build.MODEL.length() % 10)
+ (Build.PRODUCT.length() % 10);
// Thanks to @Roman SL!
// http://stackoverflow.com/a/4789483/950427
// Only devices with API >= 9 have android.os.Build.SERIAL
// http://developer.android.com/reference/android/os/Build.html#SERIAL
// If a user upgrades software or roots their phone, there will be a duplicate entry
String serial = null;
try
{
serial = android.os.Build.class.getField("SERIAL").get(null).toString();
// Go ahead and return the serial for api => 9
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
catch (Exception e)
{
// String needs to be initialized
serial = "serial"; // some value
}
// Thanks @Joe!
// http://stackoverflow.com/a/2853253/950427
// Finally, combine the values we have found by using the UUID class to create a unique identifier
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
Widevine ID
DRM数字版权管理ID
MediaDrm 是一个 Android 框架 API,允许用户安全地向 MediaCodec 提供加密密钥,以便以安全的方式播放优质内容。
MediaDrm 与不同的 DRM 提供商合作。Google 的 Widevine,以及 Microsoft 的 PlayReady,具体取决于设备。
当设备第一次使用 DRM 时,会发生设备配置,这意味着设备将获得唯一的证书,并将存储在设备的 DRM 服务中。
此配置文件具有唯一 ID,您可以通过简单的调用获取它。文章来源:https://www.toymoban.com/news/detail-501183.html
/**
* 获取数字版权管理设备ID
*
* @return WidevineID,可能为空
*/
public static String getWidevineID() {
try {
//See https://stackoverflow.com/questions/16369818/how-to-get-crypto-scheme-uuid
//You can find some UUIDs in the https://github.com/google/ExoPlayer source code
final UUID WIDEVINE_UUID = new UUID(0xEDEF8BA979D64ACEL, 0xA3C827DCD51D21EDL);
MediaDrm mediaDrm = new MediaDrm(WIDEVINE_UUID);
byte[] widevineId = mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID);
if (widevineId == null) {
return "";
}
StringBuilder sb = new StringBuilder();
for (byte aByte : widevineId) {
sb.append(String.format("%02x", aByte));
}
return sb.toString();
} catch (Exception e) {
OAIDLog.print(e);
} catch (Error e) {
OAIDLog.print(e);
}
return "";
}
访问此 ID 不需要任何权限。
您将获得的 ID 是一个 16 字节数组,这个 ID 不仅在所有应用程序上都是相同的,而且对于设备的所有用户也是相同的。因此,来宾帐户也将获得相同的 ID。文章来源地址https://www.toymoban.com/news/detail-501183.html
到了这里,关于Android设备的各种唯一标识符 ID的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!