Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中获得唯一ID的最佳方法是什么?_Android - Fatal编程技术网

在Android中获得唯一ID的最佳方法是什么?

在Android中获得唯一ID的最佳方法是什么?,android,Android,由此可知,Settings.Secure#ANDROID有时可以为空。另一方面,基于电话的ID在平板电脑设备中也可以为空,如果用户更改SIM卡或飞行模式,则可以更改该ID 考虑到获得mac地址,从这一点上,有时也无法获得mac地址 是否有任何解决方案可以让我获得在任何情况下都不会改变的Android唯一ID?Rendy,我用于此的代码如上所述(来自emmby对问题的回答(经过最小修改): 公共类设备UUIDFactory{ 受保护的静态最终字符串PREFS\u FILE=“device\u id

由此可知,
Settings.Secure#ANDROID
有时可以为空。另一方面,基于电话的ID在平板电脑设备中也可以为空,如果用户更改SIM卡或飞行模式,则可以更改该ID

考虑到获得mac地址,从这一点上,有时也无法获得mac地址


是否有任何解决方案可以让我获得在任何情况下都不会改变的Android唯一ID?

Rendy,我用于此的代码如上所述(来自emmby对问题的回答(经过最小修改):

公共类设备UUIDFactory{
受保护的静态最终字符串PREFS\u FILE=“device\u id.xml”;
受保护的静态最终字符串PREFS\u DEVICE\u ID=“DEVICE\u ID”;
受保护的易失性静态UUID UUID;
公用设备UUIDFactory(上下文){
if(uuid==null){
已同步(DeviceUuidFactory.class){
if(uuid==null){
final SharedPreferences prefs=context.getSharedPreferences(prefs\u文件,0);
final String id=prefs.getString(prefs\u DEVICE\u id,null);
如果(id!=null){
//使用以前计算并存储在中的ID
//prefs文件
uuid=uuid.fromString(id);
}否则{
最后一个字符串ANDROID=Secure.getString(context.getContentResolver(),Secure.ANDROID_ID);
//使用Android ID,除非它坏了,在这种情况下
//依靠deviceId,
//除非它不可用,否则可以使用随机变量
//我们存储的号码
//到prefs文件
试一试{
如果(!“9774d56d682e549c.”等于(Android)){
uuid=uuid.nameUUIDFromBytes(android.getBytes(“utf8”);
}否则{
最后一个字符串deviceId=((TelephonyManager)context.getSystemService(context.TELEPHONY_SERVICE)).getDeviceId();
uuid=(deviceId!=null?uuid.nameUUIDFromBytes(deviceId.getBytes(“utf8”)):uuid.randomUUID();
}
}捕获(不支持的编码异常e){
抛出新的运行时异常(e);
}
//将该值写入prefs文件
prefs.edit().putString(prefs_DEVICE_ID,uuid.toString()).commit();
}
}
}
}
}
/**
*返回当前android设备的唯一UUID。与所有UUID一样,
*这个唯一的ID“很可能”在所有Android系统中都是唯一的
*设备。比安卓ID更重要。
* 
*UUID是通过使用ANDROID_ID作为基键(如果合适)生成的,
*如果已知ANDROID\u ID,则返回TelephonyManager.getDeviceID()
*如果不正确,最终会返回到一个持久化的随机UUID
*如果getDeviceID()未返回可用值,则返回SharedReferences。
* 
*在某些罕见的情况下,此ID可能会更改。特别是,如果
*设备出厂重置时,可能会生成新的设备ID。此外,如果
*用户从Android的某些错误实现升级手机
*2.2对于更新的、无缺陷的Android版本,设备ID可能会更改。
*或者,如果用户将应用卸载到既没有正确的
*Android ID或设备ID,此ID可能会在重新安装时更改。
* 
*请注意,如果代码转而使用TelephonyManager.getDeviceId(),
*在工厂重置后,生成的ID不会更改。需要更改的内容
*意识到。
* 
*在使用Android\u ID时,针对许多设备的Android 2.2中的一个缺陷进行了解决
*直接的。
* 
*@见http://code.google.com/p/android/issues/detail?id=10603
* 
*@返回一个UUID,该UUID可用于在大多数情况下唯一标识您的设备
*目的。
*/
公共UUID getDeviceUuid(){
返回uuid;
}
}
要在活动中使用,请执行以下操作:

UUID identifier=新设备UUID工厂(this).getDeviceUuid();

您提到的选项几乎涵盖了获得唯一ID的所有不同场景,操作系统提供的唯一ID值也被证明被某些供应商错误地实现,并且它为特定供应商的所有设备返回相同的值,因此没有,没有1,也没有唯一的最佳方法,通常,您需要组合并验证是否存在一个或另一个,例如在我们的项目中:

  • 首先,我们选择TelephonyManager,如果它存在,我们就从那里获取它

  • 如果不是(就像大多数平板电脑一样),那么我们选择MAC地址

  • 如果没有,那么我们使用设置中提供的Android唯一ID

希望有帮助


问候

对不起。我没有注意到其他答案。谢谢我也在考虑这个解决方案,但我希望如果有一个解决方案可以永远保持唯一ID:)谢谢!