生成特定于设备的序列号

时间:2010-08-12 05:06:13

标签: android licensing license-key

我希望能够为每个Android设备生成唯一的序列号,以用于解锁应用程序。我怎么能这样做?

编辑:

原因是我想要修改付费应用程序,并为付费旧版本的用户提供不同的软件包名称,通过下载可解锁的应用程序免费版本来获取完整版本。我会推送旧版本的更新,它将生成并显示他们可以输入的代码,以将免费版本转换为功能完整的版本。

6 个答案:

答案 0 :(得分:8)

您可以使用Android id。此ID应该是设备唯一的,但它的设置方式取决于设备制造商的实现。

String deviceId = Secure.getString(context.getContentResolver(),Secure.ANDROID_ID);

Android ID可能会在手机重置后更改,用户也可以在有根电话上更改它。但是如果你需要一个id来识别你的用户,它应该没问题。

答案 1 :(得分:8)

为什么不使用谷歌帐户名?很容易获得,只需要清单文件上的简单请求。他们将用gplay购买许可证,因此g +帐户名称应该足够......

清单中的

<manifest ... >
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    ...
</manifest>

检索帐户名称:

AccountManager am = AccountManager.get(this); // "this" references the current Context

Account[] accounts = am.getAccountsByType("com.google");

检索名称:

accounts[0].name

我写了一个简单的提醒,以确保我在这里找到了一个帐户:

Account[] accounts = am.getAccountsByType("com.google");
    AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);

    miaAlert.setTitle("i found an account name!");
    miaAlert.setMessage(accounts[0].name);
    AlertDialog alert = miaAlert.create();
    alert.show();

答案 2 :(得分:1)

Android已提供licensing service供付费应用使用。有没有理由你不想用这个?请记住,尝试将您的应用程序锁定到特定的手机会让用户切换设备(例如,所有这些设备,迟早会)。

答案 3 :(得分:1)

来自Google Developer的解决PRNG问题的解决方案,通过反思获取唯一的设备序列号:

http://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html

/**
 * Gets the hardware serial number of this device.
 *
 * @return serial number or {@code null} if not available.
 */
private static String getDeviceSerialNumber() {
    // We're using the Reflection API because Build.SERIAL is only available
    // since API Level 9 (Gingerbread, Android 2.3).
    try {
        return (String) Build.class.getField("SERIAL").get(null);
    } catch (Exception ignored) {
        return null;
    }
}

答案 4 :(得分:0)

您可以使用IMEI号。

答案 5 :(得分:0)

您可以将序列号用作唯一标识符,因为它们在所有设备中均可用。您不应将IMEI用作唯一标识符,因为它们在WIFI标签中不是可预订的(没有SIM卡插槽的标签)。

您可以使用

    try {
        Class<?> c = Class.forName("android.os.SystemProperties");
        Method get = c.getMethod("get", String.class, String.class);
        serial = (String) get.invoke(c, "ril.serialnumber", "unknown");
    } catch (Exception ignored) {
    }