GSF ID KEY(谷歌服务框架ID)作为Android设备的唯一标识符

时间:2014-03-30 10:53:52

标签: android android-identifiers

我需要唯一识别Android设备。我读到了关于ANDROID_ID但它似乎与Android 2.2有问题。然后还有其他与TelephonyManager相关的标识符,但我认为它们不适用于平板电脑 因此,寻找在每台设备上工作的东西我偶然发现了GSF ID KEY(谷歌服务框架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;
    }
}

3 个答案:

答案 0 :(得分:5)

如果有人想知道这种方法是否有效,答案是肯定的,我尝试过(并在我放在Android市场上的应用程序中使用了数千次下载)并且它可以正常工作。注意:每次用户恢复出厂设置或与Google服务混淆时,GSF ID KEY都会更改,但这对我的目的来说已经足够了。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

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