6

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

4 回答 4

5

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

于 2014-04-17T13:14:34.680 回答
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;
    }
}
于 2017-04-26T04:03:49.797 回答
0

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

于 2015-01-02T20:50:27.250 回答
0

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

分享 改进这个答案

于 2021-09-24T16:14:24.900 回答