【问题标题】:GSF ID KEY (google service framework id) as Android device unique identifierGSF ID KEY (google service framework id) 作为 Android 设备唯一标识符
【发布时间】:2014-03-30 10:53:52
【问题描述】:

我需要唯一标识一台 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;
    }
}

【问题讨论】:

  • 代码sn-p这里的URI是什么?
  • 对不起,我忘了把它放在sn-p中,现在可以了

标签: android android-identifiers


【解决方案1】:

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

【讨论】:

  • 你必须添加com.google.android.providers.gsf.permission.READ_GSERVICES权限吗?
  • 好吧,就我而言,我必须这样做(Nexus 5 with Android 5.0),否则会引发异常。您能否验证它是否适用于使用 Nexus 5 和 Android 5.0 的用户?
  • @cprcrack 你必须添加权限 com.google.android.providers.gsf.permission.READ_GSERVICES
【解决方案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;
    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      分享改进这个答案

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2021-02-20
      相关资源
      最近更新 更多