天天看點

java擷取裝置編号不一緻_android唯一裝置辨別、裝置号、裝置ID的擷取方法

##如何擷取Android裝置唯一ID?

###問題 每一個android裝置都有唯一ID嗎?如果有?怎麼用java最簡單取得呢?

###回答1(最佳)

如何取得android唯一碼?

好處:

1.不需要特定權限.

2.在99.5% Android裝置(包括root過的)上,即API => 9,保證唯一性.

3.重裝app之後仍能取得相同唯一值.

僞代碼:

if API => 9/10: (99.5% of devices)

return unique ID containing serial id (rooted devices may be different)

else

return unique ID of build information (may overlap data - API < 9)

代碼:

@SuppressLint("NewApi")public staticString getUniquePsuedoID() {//If all else fails, if the user does have lower than API 9 (lower//than Gingerbread), has reset their device 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.//Thankshttp://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[] supportedABIArray;if (Build.VERSION.SDK_INT >= 21) {

supportedABIArray=Build.SUPPORTED_ABIS;

}else{

supportedABIArray= newString[] {Build.CPU_ABI};

}

String supportedABIs= "";try{for(String s : supportedABIArray) {

supportedABIs+=s;

}

}catch(Exception e) {

supportedABIs= "";

}

String m_szDevIDShort= "35";if (null != Build.BOARD) m_szDevIDShort += (Build.BOARD.length() % 10);if (null != Build.BRAND) m_szDevIDShort += (Build.BRAND.length() % 10);if (null != supportedABIs) m_szDevIDShort += (supportedABIs.length() % 10);if (null != Build.DEVICE) m_szDevIDShort += (Build.DEVICE.length() % 10);if (null != Build.MANUFACTURER) m_szDevIDShort += (Build.MANUFACTURER.length() % 10);if (null != Build.MODEL) m_szDevIDShort += (Build.MODEL.length() % 10);if (null != Build.PRODUCT) m_szDevIDShort += (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 device, 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 newUUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();

}catch(Exception exception) {//serial = "serial";//constant value

serial = "" + Calendar.getInstance().getTimeInMillis(); //variable 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 newUUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();

}

###回答2 好處:

1.不需要特定權限.

2.在100% Android裝置(包括root過的)上,保證唯一性.

壞處

1.重裝app之後不能取得相同唯一值.

private static String uniqueID = null;private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";public synchronized staticString id(Context context) {if (uniqueID == null) {

SharedPreferences sharedPrefs=context.getSharedPreferences(

PREF_UNIQUE_ID, Context.MODE_PRIVATE);

uniqueID= sharedPrefs.getString(PREF_UNIQUE_ID, null);if (uniqueID == null) {

uniqueID=UUID.randomUUID().toString();

Editor editor=sharedPrefs.edit();

editor.putString(PREF_UNIQUE_ID, uniqueID);

editor.commit();

}

}returnuniqueID;

}

###回答3(需要有電話卡)

好處: 1.重裝app之後仍能取得相同唯一值.

代碼:

final TelephonyManager tm =(TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);finalString tmDevice, tmSerial, androidId;

tmDevice= "" +tm.getDeviceId();

tmSerial= "" +tm.getSimSerialNumber();

androidId= "" +android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

UUID deviceUuid= new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) |tmSerial.hashCode());

String deviceId= deviceUuid.toString();

謹記:要取得以下權限