Turns out getting unique hardware identifiers is getting harder and harder, so it's best to plan the application around not having access to these kinds of pieces of information, and instead to create your own.
I read a LOT of articles and tested a lot of code samples, and ultimately stumbled across this gem and find it to be very useful:
Create a Class called Installation:
public static class Installation {
private static String sID = null;
private static final String INSTALLATION = "INSTALLATION";
public synchronized static String id(Context context) {
if (sID == null) {
File installation = new File(context.getFilesDir(), INSTALLATION);
try {
if (!installation.exists())
writeInstallationFile(installation);
sID = readInstallationFile(installation);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return sID;
}
private static String readInstallationFile(File installation) throws IOException {
RandomAccessFile f = new RandomAccessFile(installation, "r");
byte[] bytes = new byte[(int) f.length()];
f.readFully(bytes);
f.close();
return new String(bytes);
}
private static void writeInstallationFile(File installation) throws IOException {
FileOutputStream out = new FileOutputStream(installation);
String id = UUID.randomUUID().toString();
out.write(id.getBytes());
out.close();
}
}
Anywhere in your application that you need that unique ID - just call this to get it - or create it the first time:
//INSTALLATION ID
String installID = Installation.id(this);
Log.w("INSTALLATION_ID", installID);
Super easy
And extensible if you ever need to or want to save anything else unique to your apps installation to the same place.