赞
踩
只有Android手机才有, IMEI号是一串15位的号码,比如像这样 359881030314356
TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDeviceId();
需要权限android.permission.READ_PHONE_STATE
通常用户会因为你向他们要了这个权限而给你一个差评,因为他们觉得你就是在窃取他们的隐私,很明显,你就是在收集一些数据
这个是不靠谱的,因为有时候它是null的,文档中明确说明,如果你恢复了出厂设置,那他就会改变的。而且如果你root了手机,你也可以手动改变这个ID。
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
它返回的是9774d56d682e549c这样一串东西,倒是不需要什么权限。
部分设备由于制造商错误实现,导致多台设备会返回相同的 Android_ID.
这也可以得到一个独一无二的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
市面上大部分的应用不使用蓝牙,如果你的应用根本没用蓝牙,而你却和用户要了蓝牙权限的,那你很可疑。
BluetoothAdapter m_BluetoothAdapter = null;
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_szBTMAC = m_BluetoothAdapter.getAddress();
需要权限android.permission.BLUETOOTH
获取办法:
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是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
使用硬件信息拼凑出来的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(); }
DRM数字版权管理ID
MediaDrm 是一个 Android 框架 API,允许用户安全地向 MediaCodec 提供加密密钥,以便以安全的方式播放优质内容。
MediaDrm 与不同的 DRM 提供商合作。Google 的 Widevine,以及 Microsoft 的 PlayReady,具体取决于设备。
当设备第一次使用 DRM 时,会发生设备配置,这意味着设备将获得唯一的证书,并将存储在设备的 DRM 服务中。
此配置文件具有唯一 ID,您可以通过简单的调用获取它。
/** * 获取数字版权管理设备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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。