Android 生成特定于设备的序列号

Android 生成特定于设备的序列号,android,licensing,license-key,Android,Licensing,License Key,我希望能够为每个Android设备生成唯一的序列号,用于解锁应用程序。我怎么能这样做 编辑: 原因是我想改造一个付费应用程序,并为那些为旧版本付费的用户提供一个不同的软件包名称,一种通过下载该应用程序的可解锁免费版本来获取完整版本的方法。我会推送一个旧版本的更新,生成并显示他们可以输入的代码,以将免费版本转换为功能齐全的版本。你可以使用IMEI no来实现这一点。Android已经为付费应用程序提供了一个新版本。你不想用这个有什么原因吗?请记住,试图将你的应用程序锁定到特定的手机上会让切换设备的

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

编辑:


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

你可以使用IMEI no来实现这一点。

Android已经为付费应用程序提供了一个新版本。你不想用这个有什么原因吗?请记住,试图将你的应用程序锁定到特定的手机上会让切换设备的用户非常恼火(例如,所有设备迟早都会被锁定)。

你可以使用。此id对于设备来说应该是唯一的,但其设置方式取决于设备制造商的实施

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

Android Id可能会在手机出厂重置时更改,用户也可以在根手机上更改。但是如果你需要一个id来识别你的用户,那就没问题了。

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

在舱单中:

<manifest ... >
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    ...
</manifest>
要检索名称,请执行以下操作:

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();

您可以使用序列号作为唯一标识符,因为它们在所有设备中都可用。您不应该使用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) {
    }
试试看{
Class c=Class.forName(“android.os.SystemProperties”);
方法get=c.getMethod(“get”,String.class,String.class);
serial=(String)get.invoke(c,“ril.serialnumber”,“unknown”);
}捕获(忽略异常){
}

来自谷歌开发者解决PRNG问题的解决方案,通过反射获得唯一的设备序列号:


我不会为此使用imei。访问imei需要特殊权限,这些权限看起来像是您正在使用不应该使用的数据,并使用户产生怀疑。imei不是你应该在手机上保存的东西。补充了提问的原因。不幸的是,过去有制造商将ANDROID_ID设置为空,或者更糟的是,在所有设备上都是一样的!看看这个。从android 8.0开始,这需要用户权限。否则,它只返回一个空的帐户数组。
    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) {
    }
/**
 * 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;
    }
}