一意のAndroidIDについて話すとき、誰もがこれを見たことがあると思いますが、私もAndroidデバイスを一意に識別するための解決策を考え出そうとしています。公開されているクラスを利用したいのですが、まだ見つけていません。
私の状況では、何らかの形のインターネット接続(GPRSやWi-Fiなど)を備え、APIレベル8(v2.2 Froyo)で実行されているデバイスを一意に識別できることが要件です。Wi-FiやSIMが搭載されていないデバイスを知りませんので、ある場合はお知らせください。
すべてのiOSデバイスにWi-FiMACアドレスが必要なため、Wi-FiMACアドレスのハッシュを使用してiOSでこの問題を解決しました。ただし、Androidの場合、テクニック(上記のSO投稿への回答など)は、TelephonyManager
戻ることができるクラスnull
(Nexus 7のようにデバイスにSIM接続がない場合など)getContext().getContentResolver(), Secure.ANDROID_ID
を指します。 Froyoより前のバージョンでは100%信頼できません(これは私にとって幸運です)。ただし、フローズンヨーグルト後の問題は記載されていないので、問題があればお知らせください。私もこれを読んだことがありますnull
。ここによると、工場出荷時のリセットで変更される可能性がありますが、それは大きな問題ではありません。
そこで、これをまとめて、うまくいけば一意のGUIDを生成します。[このメソッドは完全ではありません。]
public static String GetDeviceId(Context context)
{
// Custom String Hash 1
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("someRandomData"); // Not really needed, but means the stringBuilders value won't ever be null
// TM Device String
final TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String tmDeviceId = tm.getDeviceId(); // Could well be set to null!
LogMsg.Tmp("TM Device String [" + tmDeviceId + "]");
// Custom String Hash 2
stringBuilder.append(tmDeviceId);
int customHash = stringBuilder.toString().hashCode();
LogMsg.Tmp("Custom String hash [" + customHash + "]");
// Device ID String
String androidIDString = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
LogMsg.Tmp("Device ID String [" + androidIDString + "]");
// Combined hashes as GUID
UUID deviceUuid = new UUID(androidIDString.hashCode(), ((long)customHash << 32));
LogMsg.Tmp("Combined hashes as GUID [" + deviceUuid.toString() + "]");
return deviceUuid.toString();
}
したがって、tmDeviceId
に設定されている場合がありますnull
。この場合、customHash
デバイスに関係なく同じになりますが、と組み合わせるとandroidIDString
グローバルに一意になります。おもう。明らかに、tmDeviceId
ANDandroidIDString
が使用できない場合は解決し、そこで例外をスローする必要があります。
それで...これはやり過ぎですか?もしそうなら、そのまま使用しても安全context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID
ですか?