Created
October 22, 2015 19:28
-
-
Save mwinters-stuff/2cdc92ca18e0c0d885b5 to your computer and use it in GitHub Desktop.
Android Device UUID Factory.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package apackage; | |
import android.content.Context; | |
import android.content.SharedPreferences; | |
import android.provider.Settings.Secure; | |
import android.telephony.TelephonyManager; | |
import java.io.UnsupportedEncodingException; | |
import java.util.UUID; | |
public class DeviceUuidFactory | |
{ | |
protected static final String PREFS_FILE = "device_id.xml"; | |
protected static final String PREFS_DEVICE_ID = "device_id"; | |
protected static UUID uuid; | |
public DeviceUuidFactory(Context context) | |
{ | |
if (uuid == null) | |
{ | |
synchronized (DeviceUuidFactory.class) | |
{ | |
if (uuid == null) | |
{ | |
final SharedPreferences prefs = context.getSharedPreferences(PREFS_FILE, 0); | |
final String id = prefs.getString(PREFS_DEVICE_ID, null); | |
if (id != null) | |
{ | |
// Use the ids previously computed and stored in the prefs file | |
uuid = UUID.fromString(id); | |
} else | |
{ | |
final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); | |
// Use the Android ID unless it's broken, in which case fallback on | |
// deviceId, | |
// unless it's not available, then fallback on a random number which | |
// we store | |
// to a prefs file | |
try | |
{ | |
if (androidId != null && (!"9774d56d682e549c".equals(androidId))) | |
{ | |
uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")); | |
} else | |
{ | |
final String deviceId = ((TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); | |
if(deviceId == null) | |
{ | |
uuid = UUID.randomUUID(); | |
prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit(); | |
}else{ | |
uuid = deviceId != null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID(); | |
prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit(); | |
} | |
} | |
} catch (UnsupportedEncodingException e) | |
{ | |
throw new RuntimeException(e); | |
} | |
} | |
} | |
} | |
} | |
} | |
/** | |
* Returns a unique UUID for the current android device. As with all UUIDs, | |
* this unique ID is "very highly likely" to be unique across all Android | |
* devices. Much more so than ANDROID_ID is. | |
* | |
* The UUID is generated by using ANDROID_ID as the base key if appropriate, | |
* falling back on TelephonyManager.getDeviceID() if ANDROID_ID is known to be | |
* incorrect, and finally falling back on a random UUID that's persisted to | |
* SharedPreferences if getDeviceID() does not return a usable value. | |
* | |
* In some rare circumstances, this ID may change. In particular, if the | |
* device is factory reset a new device ID may be generated. In addition, if a | |
* user upgrades their phone from certain buggy implementations of Android 2.2 | |
* to a newer, non-buggy version of Android, the device ID may change. Or, if | |
* a user uninstalls your app on a device that has neither a proper Android ID | |
* nor a Device ID, this ID may change on reinstallation. | |
* | |
* Note that if the code falls back on using TelephonyManager.getDeviceId(), | |
* the resulting ID will NOT change after a factory reset. Something to be | |
* aware of. | |
* | |
* Works around a bug in Android 2.2 for many devices when using ANDROID_ID | |
* directly. | |
* | |
* @see http://code.google.com/p/android/issues/detail?id=10603 | |
* | |
* @return a UUID that may be used to uniquely identify your device for most | |
* purposes. | |
*/ | |
public UUID getDeviceUuid() | |
{ | |
return uuid; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment