谷歌服务框架ID密钥(GSF ID KEY)作为安卓设备的唯一标识符。

6

我需要唯一地识别一个Android设备。我了解了ANDROID_ID,但它似乎在Android 2.2中存在问题。然后还有一些与TelephonyManager相关的标识符,但我认为它们在平板电脑上不起作用。
因此,在寻找适用于每个设备的东西时,我偶然发现了GSF ID KEY(Google服务框架ID)。你们认为这是可靠且始终有效的解决方案吗? 这是我找到的检索GSF ID KEY的代码:

private static String getGsfAndroidId(Context context) 
{
    Uri URI = Uri.parse("content://com.google.android.gsf.gservices");
    String ID_KEY = "android_id";
    String params[] = {ID_KEY};
    Cursor c = context.getContentResolver().query(URI, null, null, params, null);
    if (!c.moveToFirst() || c.getColumnCount() < 2)
        return null;
    try 
    {
        return Long.toHexString(Long.parseLong(c.getString(1)));
    } 
    catch (NumberFormatException e) 
    {
        return null;
    }
}

这段代码片段中的URI是什么? - aasha
抱歉,我忘记将其放入代码片段中了,现在已经好了。 - user2461515
4个回答

5

如果有人想知道这种方法是否可行,答案是肯定的,我已经尝试过(并在我发布到Android市场并被下载数千次的应用程序中使用了它),它是有效的。注意:GSF ID KEY每次用户进行出厂设置或与Google服务搞砸时都会更改,但对于我的目的来说足够好。


你需要添加 com.google.android.providers.gsf.permission.READ_GSERVICES 权限吗? - cprcrack
1
在我的情况下(Nexus 5 with Android 5.0),我必须这样做,否则会引发异常。你能验证一下在你的用户使用 Nexus 5 with Android 5.0 的情况下是否有效吗? - cprcrack
@cprcrack,您需要添加com.google.android.providers.gsf.permission.READ_GSERVICES权限。 - Abhijit Chakra

2

我使用Android Studio,从lint得到了自动建议。以下是修订后的代码,可能解决由https://stackoverflow.com/users/423171/cprcrack报告的异常。

private static String getGsfAndroidId(Context context)
{
    Uri URI = Uri.parse("content://com.google.android.gsf.gservices");
    String ID_KEY = "android_id";
    String params[] = {ID_KEY};
    Cursor c = context.getContentResolver().query(URI, null, null, params, null);
    if (c != null && (!c.moveToFirst() || c.getColumnCount() < 2)){
        if(!c.isClosed())
            c.close();
        return null;
    }

    try {
        if (c != null) {
            String result = Long.toHexString(Long.parseLong(c.getString(1)));
            if(!c.isClosed())
                c.close();
            return result;
        }else {
            return null;
        }
    } catch (NumberFormatException e) {
        if(!c.isClosed())
            c.close();
        return null;
    }
}

0

不能谈论生产测试,但我注意到在我的Nexus 5上使用Android 5.0时,我必须添加以下权限:com.google.android.providers.gsf.permission.READ_GSERVICES。否则,在使用您的代码时会引发异常。


0

不能讨论生产测试,但我注意到在我的Nexus 5上使用Android 5.0时,我必须添加以下权限:com.google.android.providers.gsf.permission.READ_GSERVICES。否则,在使用您的代码时会引发异常。

分享 改善这个答案


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接