Is there a unique Android device ID?
Android设备有没有惟一的id?若是有的话,我怎么经过java代码得到这个id?java
我读了stack OverStack上每个答案,谷歌的开发者博客和Android文档,我认为’Pseudo ID’ 是最好的选择。android
用户能够更改他们的email (很是不可靠)ui
API5+须要权限
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
spa
<uses-permission android:name="android.permission.READ_CONTACTS" />
用户能够更改他们的手机号 (很是不可靠)code
须要权限<uses-permission android:name="android.permission.READ_PHONE_STATE" />
接口
TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); String szImei = TelephonyMgr.getDeviceId();
须要权限<uses-permission android:name="android.permission.READ_PHONE_STATE" />
开发
一般用户会由于你向他们要了这个权限而给你一个差评,由于他们以为你就是在窃取他们的隐私,很明显,你就是在收集一些数据文档
String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
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();
<uses-permission android:name="android.permission.BLUETOOTH "/>
API >=9:经过“Build.SERIAL”这个属性来保证ID的独一无二。API 9 以上的Android设备目前市场占有率在99.5%
记住:你只在技术上忽略了0.5%的用户,你能够专一于99.5%的用户字符串
Android系统2.3版本以上能够经过下面的方法获得Serial Number,且非手机设备也能够经过该接口获取。get
API < 9:咱们能够经过读取设备的ROM版本号、厂商名、CPU型号和其余硬件信息来组合出一串15位的号码,这15位号码有可能重复,可是概率过小了,小到能够忽略,何况就算重复了,咱们损失的用户最多也只不过是0.5%而已。
String m_szDevIDShort = "35" + 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 位
“35”加上后面的13位一共15位,咱们能够获得355715565309247这样一串号码,不须要任何的权限,很是方便。
//得到独一无二的Psuedo ID public static String getUniquePsuedoID() { String serial = null; String m_szDevIDShort = "35" + 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 位 try { serial = android.os.Build.class.getField("SERIAL").get(null).toString(); //API>=9 使用serial号 return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString(); } catch (Exception exception) { //serial须要一个初始化 serial = "serial"; // 随便一个初始化 } //使用硬件信息拼凑出来的15位号码 return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
最终会获得这样的一串ID:00000000-28ee-3eab-ffff-ffffe9374e72