Android:获取或创建每个设备的唯一ID

3

我正在使用API 14(Android 4.0)开发应用程序。

在清单文件中:

 <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

我希望能够从每个设备获得一个唯一的标识符(或创建一个),即使重新启动设备,该标识符仍然保持相同。但是重要的是,即使是两个相同的设备,该标识符也必须不同。我该怎么做呢?


你有尝试过任何东西吗? - Rod Kimble
我已经谷歌搜索过了,但是没有找到适用于所有设备(如手机、平板电脑和其他设备)的解决方案。 - m n
1
可能是是否存在唯一的Android设备ID?的重复问题。 - Zahid Rasheed
5个回答

3
你可以使用设备的IMEI号作为唯一标识符。
你想调用android.telephony.TelephonyManager.getDeviceId()
这将返回一个字符串,该字符串唯一标识设备(在GSM上是IMEI,在CDMA上是MEID)。
你需要在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

1
您可以使用GCM生成不同的设备令牌......即使您卸载并重新安装应用程序或进行出厂设置,此设备令牌也将保持不变。您需要遵循一些步骤......在Google Developers Console上创建一个新项目。在此步骤中,为简单起见,您只需记下2个值:项目编号,将在客户端项目中用作SENDER_ID;以及API服务器密钥(在凭据中创建),将在服务器项目中用作API_KEY。为服务器端创建一个新的简单Android项目(其基本源代码如下面链接中的我的答案)。为客户端创建一个新的简单Android项目(其基本源代码如下面链接中的我的答案,我从Google Cloud Messaging - GitHub的原始源代码进行了自定义)。运行客户端应用程序,您将获得注册令牌(表示您的设备已成功注册)。然后,在服务器应用程序中将此令牌粘贴(硬编码)到CLIENT_REGISTRATION_TOKEN变量中(或编写代码将此令牌发送到服务器应用程序)。您可以在以下问题中阅读更多内容,其中一个问题您之前的某个问题中已经阅读过:如何使用Android Studio实现GCM Hello World添加Google Cloud Messagin(GCM)用于Android-注册过程

1
尝试这个:String android_id = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID); 在此,android_id 是每个设备的唯一标识符。

1
尝试这段代码。
 String UniqueDeviceId = AndroidDeviceIdentifier.getUniqueDeviceIdentifier(context);

将此类也添加进去。
final class AndroidDeviceIdentifier {

private AndroidDeviceIdentifier() {
    // hidden constructor of singleton
}

/**
 * Returns a stable identifier for the current device.
 *
 * @param ctx The application's Context
 * @return The unique device identifier
 * @throws IllegalStateException If the device's identifier could not be determined
 */
public static String getUniqueDeviceIdentifier(@NonNull final Context ctx) throws IllegalStateException {
    try {
        return getDeviceUUID(ctx);
    } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
        throw new IllegalStateException("Could not determine device identifier", e);
    }
}

private static String getDeviceUUID(Context ctx) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    byte[] hash = makeHash(getMac(ctx), getSerialNumber(ctx));
    return createUUIDFromHash(hash);
}

private static String createUUIDFromHash(byte[] hash) {
    return UUID.nameUUIDFromBytes(hash).toString().toLowerCase(); // Server side wants lower cased UUIDs
}

private static byte[] makeHash(final String mac, final String serialNumber) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    MessageDigest sha;

    sha = MessageDigest.getInstance("SHA-256");
    sha.reset();

    sha.update(mac.getBytes("UTF-8"));
    sha.update(serialNumber.getBytes("UTF-8"));

    return sha.digest();
}

private static String getSerialNumber(Context context) {
    String serialNumber = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
    if (serialNumber == null) {
        serialNumber = "0000000000000000";
    }

    return serialNumber;
}

private static String getMac(Context context) {
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    String mac = wifiManager.getConnectionInfo().getMacAddress();
    if (mac == null) {
        mac = "000000000000";
    }
    return mac;
}

您将获得一个独特的设备ID。如果您有任何问题,请联系我。

如果我的回答满足了您的需求,请将其标记为正确答案。 - Cecil Paul
对于访客用户来说,它并不相同。 - Shivang Trivedi
@shivang Trivedi:应该是不同的。对吧?或者请告诉我你想要实现什么? - Cecil Paul
应该是相同的,因为我想要设备的唯一识别而不是用户。 - Shivang Trivedi

0
尝试使用下面的代码,此设备ID是恒定的,即使您卸载应用程序并重新安装,此ID仍然保持不变,您可以使用它从数据库中检索用户数据。
final String android_id = Settings.Secure.getString(getApplicationContext().getContentResolver(),
            Settings.Secure.ANDROID_ID);

只需将此代码粘贴到您的主活动或任何函数中,即可将生成的ID存储在共享首选项中以供以后使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接