android 生成序列号,关于android:生成特定于设备的序列号

在Android应用中,开发者希望生成唯一的序列号用于解锁应用程序。考虑过使用AndroidID,但注意到它可能在设备恢复出厂设置时改变。还讨论了通过反射获取设备序列号的方法,但指出IMEI可能在某些设备或情况下不可用。谷歌提供的许可服务被提及,但似乎开发者有特殊需求,如为已付费用户创建不同包名的更新。文章提到了需要避免对用户造成不便,并提供了获取设备帐户名的代码片段,但可能需要用户权限。
摘要由CSDN通过智能技术生成

本问题已经有最佳答案,请猛点这里访问。

我希望能够为每个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并不是什么你应该在电话外存储的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值