创建全球唯一的Android标识符

时间:2013-02-14 16:34:58

标签: android guid uniqueidentifier

在谈论独特的Android ID时,我确信每个人都看过this,但我也想尝试一种解决方案来唯一识别任何Android设备。我很乐意使用公开发布的课程,但我还没找到。

在我的情况下,要求是能够唯一地识别具有某种形式的互联网连接的任何设备(例如GPRS或Wi-Fi)并在API级别8(v2.2 Froyo)上运行。我不知道有任何设备没有Wi-Fi或SIM卡,所以请告诉我是否有任何设备!

我们通过使用Wi-Fi mac地址的哈希在iOS中解决了这个问题,因为所有iOS设备应该具有此功能。但是对于Android,技术(例如上面引用的SO帖子的答案)是指可以返回TelephonyManager的{​​{1}}类(例如当设备没有SIM连接时,例如Nexus 7)或null根据here在Froyo之前的版本上不是100%可靠(这对我来说是幸运的)。然而,如果有任何问题,它不会再发布任何问题,如果有的话,请告诉我!我也读过这可以返回getContext().getContentResolver(), Secure.ANDROID_ID。根据{{​​3}},它可以在出厂重置时更改,但这不是主要问题。

所以我把它放在一起生成一个有希望的唯一GUID: [此方法尚未完成!]

null

因此,您可能会发现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结合使用全球独一无二。我认为。显然,如果androidIDStringtmDeviceId不可用,我需要解决这个问题并在那里抛出异常。

所以......这有点过分吗?如果是这样,只使用androidIDString

是否安全

1 个答案:

答案 0 :(得分:3)

为什么不像在iOS中那样获得设备的MAC地址?这也可以在Android设备中执行。

我将提供一个代码片段来获取设备的mac地址..

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class HardwareUtil {

    public static String getMacAddress()
    {
        try{
            Process process = Runtime.getRuntime().exec("cat /sys/class/net/eth0/address");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            int read;
            char[] buffer = new char[4096];
            StringBuffer output = new StringBuffer();
            while ((read = reader.read(buffer)) > 0){
                output.append(buffer, 0, read);
            }
            reader.close();
            process.waitFor();
            String hwaddr = output.toString();
            return hwaddr;
        }catch (IOException e) {
            e.printstacktrace();
        }catch (InterruptedException e){
            e.printstacktrace();
        }
    }

}

HardwareUtil.getMacAddress()将返回设备的mac地址。

编辑:如果mac地址不适合您的情况。以下内容非常有用!

public static String getDeviceId(Context context) {
    final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
    if (deviceId != null) {
        return deviceId;
    } else {
        return android.os.Build.SERIAL;
    }
}

如果您使用AndoridManifest.xml方法,请不要忘记向getDeviceId文件添加以下权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />