2016-09-20 84 views
-1

!我想我怎么能识别用户使用一些替代方法:设备标识没有设备ID和Nugat

  • 我不希望使用的设备ID,因为它需要的权限,并询问用户,它毁了我的应用程序

  • 我无法使用MAC因为Nugat解决其不允许

  • 其他认证的事情不是唯一

我需要一些独特的设备标识符,我可以使用没有权限将数据库中的用户分配给他的设备。

+0

生成设备上的UUID,并将其存储在内部存储(例如'getFilesDir()')来唯一标识特定的应用程序安装。 – CommonsWare

回答

1

推荐的方法是为您的应用生成唯一的ID并将其存储在应用的本地数据中。这可以让您的应用程序记住安装时它是否是同一台设备,但不能跨安装。

例如,

SharedPrefs prefs = ...; 
String id = prefs.getString("my.id"); 
if (TextUtils.isEmpty(id)) { 
    prefs.edit.putString("my.id", UUID.randomUUID()).apply(); 
} 

注意,不能获得持久的设备标识符是由设计。你不应该这样跟踪用户。如果用户卸载你的应用程序,你应该“完全忘记”它们。

0

设备ID和MAC地址是在任何地方都使用的唯一ID。但naugat不允许访问MAC地址。

您可以使用手机的注册ID。这是谷歌服务器为我们生成的唯一id。此ID用于不遵循基于GCM的通知。我已经实现了基于GCM的通知,这就是为什么它将这个ID用作唯一ID的想法。

您可以在android中搜索基于GCM的推送通知。您将找到如何生成此注册表。 ID。它需要gcm库和internet权限。

捕获卸载 注册ID是非常长的4096个字节,因此不希望在db中作为唯一的ID注入。解决方案可以是, 当您收到NotRegistered错误或应用程序已卸载时,您应该确实从数据库中删除该注册ID(或至少将其标记为状态为已停用,并停止向其发送消息)。但是,如果应用程序将重新安装在先前卸载的设备上,那么当它再次注册到GCM时,该应用程序可能会获得相同的注册ID,因此您的服务器应允许一次注册ID使NotRegistered变为活动状态再次。

当您在Google的回复中获得规范注册ID时,您应该更新旧注册ID。

1

这正是InstanceID的用途,它会生成一个唯一的ID,然后您可以使用它来关联数据。这是一个比UUID更好的方法,因为任何时候你需要获取令牌时,你大部分时间都会得到相同的令牌,如果它发生了变化,你会收到通知,当时你会用新的ID更新后端。

一个UUID总会给你一些新的东西

https://developers.google.com/instance-id/

+0

或者如果你不想包含兆字节的Google libs,并想知道为什么Google为这样一个简单的概念创建了一个助手类,请参阅我的文章。 –

+0

@JeffreyBlattman InstanceID不仅仅是一个帮手,而且比UUID更有用。您无法查询UUID并获取有关用户是否处于活动状态或即使该密钥仍然有效的信息 – tyczj

+0

密钥将如何失效? InstanceID文档中列出的所有情况都在我发布的解决方案中处理。 –

0

我希望这不需要任何许可

import android.provider.Settings.Secure; 

private String androidId = Secure.getString(getContext().getContentResolver(), 
                Secure.ANDROID_ID);