在安卓系统中,限制每个账户(根据唯一设备)的应用程序安装数量。

15
我已经发布了一款Android应用程序。
问题是,如果有人购买了我的应用程序,他可以使用同一个帐户在多个设备上安装它。
我能否将安装限制为每个帐户的几个(比如2个)唯一设备?
如果用户想要在另一个使用相同帐户的设备上使用它,他将不得不先从另一个设备卸载。
例如,MyBackup Pro仅允许两个唯一设备。 我该如何在我的应用程序中实现这一点?

1
大多数用户可能会期望应用程序能在他们所有的设备上运行。如果您有像MyBackup Pro这样的原因(例如每个设备都会增加存储和传输成本),那么我认为只要在用户购买之前明确说明,那就没问题了。如果您没有限制设备的理由,我建议不要这样做,以免影响用户体验。 - Alec
3个回答

12

谷歌可以帮助你完成这个。

这个页面可以帮助你进行设置。

更具体地说,看起来你想要添加一个设备限制器。

在某些情况下,您可能希望您的策略限制实际设备的数量,这些设备被允许使用单个许可证。这将防止用户将已经获得许可的应用程序移动到多个设备上,并在同一帐户ID下在这些设备上使用该应用程序。它还将防止用户通过向与许可证相关联的帐户提供帐户信息来“共享”应用程序,然后其他人可以登录到其设备上的该帐户并访问应用程序的许可证。 LVL通过提供DeviceLimiter接口来支持每个设备的许可证,该接口声明一个方法allowDeviceAccess()。当LicenseValidator正在处理来自许可证服务器的响应时,它调用allowDeviceAccess(),传递从响应中提取的用户ID字符串。如果您不想支持设备限制,则不需要任何工作- LicenseChecker类自动使用称为NullDeviceLimiter的默认实现。顾名思义,NullDeviceLimiter是一个“无操作”类,其allowDeviceAccess()方法仅返回所有用户和设备的LICENSED响应。注意:对于大多数应用程序,不建议使用每个设备的许可证,因为:它要求您提供一个后端服务器来管理用户和设备映射,这可能会意外地导致用户无法访问他们在另一个设备上合法购买的应用程序。 DeviceLimiter的源代码可以在这里找到。 源代码基本上解释了如何使用DeviceLimiter来实现你想要的功能:
/* The LICENSED response from the server contains a user identifier unique to
 * the <application, user> pair. The developer can send this identifier
 * to their own server along with some device identifier (a random number
 * generated and stored once per application installation,
 * {@link android.telephony.TelephonyManager#getDeviceId getDeviceId},
 * {@link android.provider.Settings.Secure#ANDROID_ID ANDROID_ID}, etc).
 *
 * The more sources used to identify the device, the harder it will be for an
 * attacker to spoof.

3
Ascorbin和yarian的回答都很好,可以解释清楚。根据我的了解,它可以通过两种方式来管理。
1. 通过Google自己
2. 通过您自己的实现
让我们逐个检查:
1. 通过Google自己
Ascorbin的答案很好地解释了如何实现以及Google是如何管理它的。所以希望你明白了。如果没有,就让我知道。
2. 通过您自己的实现
如果您有自己的服务器,则可以放置检查已安装应用程序设备的代码。每个设备都有唯一的IMEI号码,因此您可以轻松跟踪相同的IMEI号码并阻止或允许应用程序的安装或运行。
注意:Google允许您在另一个设备上使用相同的应用程序,如果该设备配置了相同的帐户。因此,在这种情况下,只有通过检测具有不同IMEI或MAC地址的相同帐户才能实现。
希望你明白了。
欢迎留言 :)

请注意,从Android 10开始,您的应用程序将无法访问IMEI或其他设备标识符(仅限系统应用程序)。您需要创建自己的ID(如果您有登录,则可以从登录数据中创建)或使用类似Firebase的东西来提供ID。 - FrankKrumnow

2
你可以通过Android系统服务获取无线局域网模块的MAC地址或IMEI来识别设备。接下来,你需要通过与服务器通信来识别应用程序的安装情况。如果服务器回复该用户/客户已在另一台设备上安装了该应用程序,则锁定应用程序并告知用户情况。请注意保留HTML标签。

我不想为此维护一个服务器。我更愿意检查谷歌的清单或服务器是否允许这样做(就像谷歌许可证一样)。 - Programer
一个应用程序的安装如何知道已经在另一台设备上安装了该应用程序?Google 可能提供这样的功能,但我认为他们并没有。 - fweigl
我已经使用了Google许可证。他们提供了一个服务器,程序会检查文件是否从一台机器复制到另一台机器,并通过Google服务器服务进行检查(检查此机器或帐户是否购买了该应用)。我希望这个服务器不仅限制盗版,还可以限制合法购买。 - Programer
2
+1 使用服务器是唯一的方法来实现这一点。您无法在每个设备上维护所有设备的列表——您需要在某个地方进行查询。 - Phil
这是不可能的。我无法在我的服务器内部知道一个程序是否已被卸载(以释放服务器上的行),只有谷歌知道。 - Programer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接