2

Android の携帯電話とタブレットの一意の ID を生成しようとしています。興味深い機能を見つけましたが、新しい Galaxy Tab 2 では機能しません。ここに私の機能があります:

public String generateId(TelephonyManager tm, ContentResolver resolver) {
    final String tmDevice, tmSerial, androidId;
    tmDevice  = "" + tm.getDeviceId();
    tmSerial  = "" + tm.getSimSerialNumber();
    androidId = "" + Secure.getString(resolver, Secure.ANDROID_ID);
    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
    return deviceUuid.toString();
}
4

3 に答える 3

0

私は単に電話のミリ秒のタイムスタンプを使用し、それを文字列に変換し、0 から 10000 までの乱数の 16 進表現を追加します (アプリの初回実行時に、それを生成して共有設定に保存します)。例: 1342603520897_1bf

1 ミリ秒あたり数千回のインストールが予想される場合、これは機能しません。そうでない場合は、問題ありません。

このソリューションの欠点は、インストール間で永続化されないことですが、プラスになる可能性のある匿名 ID が提供されることです。

于 2012-07-18T09:25:34.440 に答える
0

試してください:String secureId = Secure.ANDROID_ID; 詳細: http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID

これは、デバイスの存続期間中 (または工場出荷時設定へのリセット、新しい ROM など) に割り当てられた 64 ビット ハッシュです。

- 編集 -

// usage:
Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID));

-- edit2 --

String id = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID));
if(id==null || id=="9774d56d682e549c") { // emulator id
    WifiManager wm = (WifiManager)Ctxt.getSystemService(Context.WIFI_SERVICE);
    id = wm.getConnectionInfo().getMacAddress();
}

-- edit3 --

これは、Google自身が提案したソリューションです。つまり、アプリの最初の実行時にハッシュを生成し、それを永続的に保存します:)。

于 2012-07-27T13:39:35.023 に答える
0

OKここに実用的なソリューションがあります。前のものほどエレガントではありません...しかし、うまくいきます。

public String generateId(TelephonyManager tm, WifiInfo wi, ContentResolver resolver) {
    String m_szImei = "";
    String m_szDevIDShort = "";
    String m_szAndroidID = "";
    String m_szSim = "";
    String uniqueId = "";
    //imei
    try {
        m_szImei = tm!=null ? tm.getDeviceId() : "";
    } catch(Exception e) {}
    //sim
    try {
        m_szSim = tm!=null && new Checker().isSim(tm) ? tm.getSimSerialNumber() : wi!=null ? wi.getMacAddress() : "";
    } catch(Exception e) {}
    //"fake" imei for tablets
    try {
        m_szDevIDShort = "35" + //we make this look like a valid IMEI
            Build.BOARD.length()%10+ Build.BRAND.length()%10 +
            Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
            Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
            Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
            Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
            Build.TAGS.length()%10 + Build.TYPE.length()%10 +
            Build.USER.length()%10 ; //13 digits
    } catch(Exception e) {}
    //android id (may be null)
    m_szAndroidID = Secure.getString(resolver, Secure.ANDROID_ID);
    //unique id
    try {
        uniqueId = SHA256.compute(m_szImei+m_szSim+m_szDevIDShort+m_szAndroidID);
    } catch (Exception e) {}
    return uniqueId;
}
于 2012-07-27T13:34:00.860 に答える