avt*_*ate 4 c# android unity-game-engine
该文档说明了iOS/Windows版本中使用的标识符,而不是Android版本.SystemInfo.deviceUniqueIdentifier在Android 上使用什么标识符?
我不明白为什么Doc没有提到.
上次我检查时,Unity使用 Secure.ANDROID_ID获取Android ID字符串然后将其转换为字符串.如果你这样做,你应该是相同的值SystemInfo.deviceUniqueIdentifier.这就是我的设备上发生的事情.
不幸的是,后台正在发生更多事情.
Unity在其论坛上记录了他们的唯一标识符详细信息实施.
1.获取DeviceIdcontext.getSystemService(Context.TElEPHONY_SERVICE).getDeviceId()
2.如果#1失败,请使用Android IDcontext.getContentResolver().getString(Secure.ANDROID_ID);
3.如果#2失败,请获取Mac地址.
4.将#1,#2或#3(其中一个成功的)的结果转换为MD5哈希.
由于某些Unity版本的行为略有不同,因此值得阅读该论坛帖子.
以下是他们提供的示例代码:
// 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.ComputeHash(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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5457 次 |
| 最近记录: |