本问题已经有最佳答案,请猛点这里访问。
我希望能够为每个Android设备生成唯一的序列号,用于解锁应用程序。我怎么能这样做?
编辑:
原因是我想修改一个付费的应用程序,并为那些为旧版本付费的用户提供一个不同的包名,一种通过下载一个可解锁的免费版本的应用程序来获得完整版本的方法。我会将更新推到旧版本,生成并显示他们可以输入的代码,以将自由版本转换为完全功能版本。
为什么不使用谷歌帐户名?很容易获得,只需要清单文件上的一个简单请求。他们已经用gplay购买了许可证,所以g+帐户名应该足够…
在清单中:
...
要检索帐户名:
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 8.0开始,这需要用户权限。否则,它只返回一个空的帐户数组。
您可以使用Android ID。此ID对于设备应该是唯一的,但是如何设置取决于设备制造商的实现。
String deviceId = Secure.getString(context.getContentResolver(),Secure.ANDROID_ID);
Android ID可能会在手机恢复出厂设置时更改,用户也可以在根电话上更改。但是如果你需要一个ID来识别你的用户,那就没问题了。
不幸的是,过去有制造商将Android_id设置为空,或者更糟的是,在所有设备上都是一样的!看看这条线索。
从google developer解决prng问题的解决方案中,通过反射获得唯一的设备序列号:
http://android-developers.blogspot.com/2013/08/some-securerandom-thounds.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;
}
}
Android已经为付费应用程序提供了许可服务。你不想用这个有什么原因吗?请记住,尝试将应用锁定到某个特定的手机上会让切换设备的用户非常恼火(例如,所有用户,迟早都会这样)。
增加了提问的理由
您可以使用序列号作为唯一标识符,因为它们在所有设备中都可用。您不应该使用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) {
}
你可以用IMEI NO来做这个。
我不会用IMEI来做这个。访问IMEI需要特殊的权限,这些权限看起来像您正在使用不应该使用的数据,并使用户感到可疑。IMEI并不是什么你应该在电话外存储的东西。