我希望能够为每个 Android 设备生成唯一的序列号,以用于解锁应用程序。我怎么能这样做?
编辑:
原因是我想改造一个付费应用程序,并为已支付旧版本(将有不同的包名称)的用户提供一种通过下载该应用程序的可解锁免费版本来获得完整版本的方法。我会向旧版本推送更新,该更新将生成并显示他们可以输入的代码,从而将免费版本转变为功能齐全的版本。
我希望能够为每个 Android 设备生成唯一的序列号,以用于解锁应用程序。我怎么能这样做?
编辑:
原因是我想改造一个付费应用程序,并为已支付旧版本(将有不同的包名称)的用户提供一种通过下载该应用程序的可解锁免费版本来获得完整版本的方法。我会向旧版本推送更新,该更新将生成并显示他们可以输入的代码,从而将免费版本转变为功能齐全的版本。
您可以使用Android id。这个 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>
检索帐户名称:
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();
Android 已经为付费应用提供了许可服务。你有什么不想使用它的理由吗?请记住,尝试将您的应用程序锁定到特定手机会真正惹恼切换设备的用户(例如,迟早所有设备)。
从 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;
}
}
您可以使用序列号作为唯一标识符,因为它们在所有设备中都可用。您不应使用 IMEI 作为唯一标识符,因为它们在 WIFI 标签(没有 SIM 卡插槽的标签)中不是 abalibale。
您可以使用
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) {
}
您可以为此使用 IMEI 号。