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;
    }
}
4

4 に答える 4

5

誰かがこの方法が機能するかどうか疑問に思っている場合、答えは「はい」です。私はそれを試しました (そして、何千ものダウンロードで Android マーケットに置いたアプリで使用しました)。注: GSF ID KEY は、ユーザーが工場出荷時の設定にリセットしたり、Google サービスを台無しにしたりするたびに変更されますが、私の目的には十分でした。

于 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 に答える