微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – “SystemInfo.deviceUniqueIdentifier”在Android版本中使用了什么?

documentation记录了iOS / Windows版本中使用的标识符,但不包括Android版本. SystemInfo.deviceUniqueIdentifier在Android上使用什么标识符?

解决方法:

我不明白为什么Doc没有提到.

上次我检查时,Unity使用Secure.ANDROID_ID获取Android id字符串,然后将其转换为字符串.如果你这样做,你应该是与SystemInfo.deviceUniqueIdentifier相同的值.这就是我的设备上发生的事情.

不幸的是,后台正在发生更多事情.

Unity在其forum上记录了他们的唯一标识符详细信息实现.

1.使用context.getSystemService(Context.TElEPHONY_SERVICE).getdeviceid()获取deviceid

2.如果#1失败,请使用context.getContentResolver()获取Android id .getString(Secure.ANDROID_ID);

3.如果#2失败,请获取Mac地址.

4.将#1,#2或#3(其中一个成功的)的结果转换为MD5哈希.

由于某些Unity版本的行为略有不同,所以值得一读forum帖子.

以下是他们提供的示例代码

// Hash an input string and return the hash as
// a 32 character hexadecimal string.
static string getMd5Hash(string input)
{
    if (input == "")
        return "";
    MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
    byte[] data = md5Hasher.Co@R_404_6466@teHash(Encoding.Default.GetBytes(input));
    StringBuilder sBuilder = new StringBuilder();
    for (int i = 0; i < data.Length; i++)
        sBuilder.Append(data[i].ToString("x2"));
    return sBuilder.ToString();
}

static string generateDeviceUniqueIdentifier(bool oldBehavior)
{
    string id = "";
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
    AndroidJavaClass contextClass = new AndroidJavaClass("android.content.Context");
    string TELEPHONY_SERVICE = contextClass.GetStatic<string>("TELEPHONY_SERVICE");
    AndroidJavaObject telephonyService = activity.Call<AndroidJavaObject>("getSystemService", TELEPHONY_SERVICE);
    bool nopermission = false;
    try
    {
        id = telephonyService.Call<string>("getdeviceid");
    }
    catch (Exception e) {
        nopermission = true;
    }
    if(id == null)
        id = "";
    // <= 4.5 : If there was a permission problem, we would not read Android id
    // >= 4.6 : If we had permission, we would not read Android id, even if null or "" was returned
    if((nopermission && !oldBehavior) || (!nopermission && id == "" && oldBehavior))
    {
        AndroidJavaClass settingsSecure = new AndroidJavaClass("android.provider.Settings$Secure");
        string ANDROID_ID = settingsSecure.GetStatic<string>("ANDROID_ID");
        AndroidJavaObject contentResolver = activity.Call<AndroidJavaObject>("getContentResolver");
        id = settingsSecure.CallStatic<string>("getString", contentResolver, ANDROID_ID);
        if(id == null)
            id = "";
    }
    if(id == "")
    {
        string mac = "00000000000000000000000000000000";
        try
        {
            StreamReader reader = new StreamReader("/sys/class/net/wlan0/address");
            mac = reader.ReadLine();
            reader.Close();
        }
        catch (Exception e) {}
        id = mac.Replace(":", "");
    }
    return getMd5Hash(id);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐