ing*_*.am 6 android guid uniqueidentifier
在谈论独特的Android ID时,我确信每个人都看过这个,但是我也试图想出一个解决方案来唯一识别任何Android设备.我很乐意使用公开发布的课程,但我还没找到.
在我的情况下,要求是能够唯一地识别具有某种形式的互联网连接的任何设备(例如GPRS或Wi-Fi)并在API级别8(v2.2 Froyo)上运行.我不知道任何设备没有Wi-Fi或SIM卡,所以如果有的话请告诉我!
我们通过使用Wi-Fi mac地址的哈希在iOS中解决了这个问题,因为所有iOS设备都应该具有此功能.但是对于Android,技术(例如上面引用的SO帖子的答案)指的TelephonyManager是可以返回的类null(例如当设备没有SIM连接时,如Nexus 7)或者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();
}
Run Code Online (Sandbox Code Playgroud)
因此,您可能会发现tmDeviceId设置为null,在这种情况下,customHash无论设备如何,它都将是相同的,但结合起来androidIDString应该是全局唯一的.我认为.显然,如果tmDeviceIdAND androidIDString不可用,我将需要解决并在那里抛出异常.
所以......这有点过分了吗?如果是这样,使用它是否安全context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID?
为什么不像在 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
AndoridManifest.xml如果您使用方法,请不要忘记向您的文件添加以下权限getDeviceId。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5672 次 |
| 最近记录: |