我已经在我的应用程序中实现许可已有一段时间了,终于使它工作了。我想分享一些我认为对入门有用的东西,以及与大家一起发现的一些问题和解决方案。我在下面链接的android
dev教程还可以,但是对我来说并不是那么有用,所以我决定制作一个教程。享受,希望对您有所帮助!
在此处链接到开发人员页面。
1.入门
您将需要的东西。
1.1您的base64唯一应用程序密钥
如何获得:
一个。转到您的开发者控制台。链接。
b。如果尚未为您的应用程序创建应用程序草稿,请立即执行。
C。创建草稿后,最好将您的照片上传
.apk为Alpha或Beta。使其不发布。
d。请点击
Services & APIs
e。向下滚动并查找
YOUR LICENSE KEY FOR THIS APPLICATION
F。将密钥复制到您的应用中,如下所示:
private static final String base64_PUBLIC_KEY = "YOUR LICENSE KEY FOR THIS APPLICATION";
确保没有空格。
1.2盐
一个。什么是盐?
甲酸盐是随机数据即附加的输入散列密码时。它们用于防御字典攻击和彩虹表攻击。
b。我如何得到一个?
这是生成随机盐的良好链接。应该 恰好有
20个随机整数,所以
20要输入要生成的随机字符串的数量,每个字符串都应为
2字符长(在本示例中使用,不必是)。检查数字,并检查是否允许使用相同的字符串。它们也可以是负数。尝试删除任何冗余,例如
00-> 0,为了保持一致性。
C。我在哪里放盐?
声明变量时,只需输入此代码即可,随机盐除外。
private static final byte[] SALT = new byte[] {YOUR RANDOM SALT, COMMA SEPARATED, 20 INTEGERS};
2.将LVL(许可)库导入Eclipse和所需的代码
2.1导入库
一个。打开
Android SDK Manager
b。去
Extras
C。安装
Google Play Licensing Library
d。找到
SDKSDK管理员顶部列出的安装路径。
e。到达那里后,导航至:
<sdk>/extras/google/play_licensing
F。在Eclipse中单击
file,然后
import,然后
Existing Android Code IntoWorkspace当它问你的文件路径,导航到
play_licensing文件夹,点击
library。
G。
library导入名为项目的项目后,右键单击它,然后单击
properties。单击
Android左侧并导航至底部
IsLibrary,然后选择,然后单击Apply。这使eclipse知道您可以将此项目代码用作库。
H。右键单击要向其添加许可的应用程序,然后单击属性,然后单击
Android。转到底部,单击
library并将其添加到构建路径。这应该将库导入到
AndroidDependencies文件夹中。
一世。您的项目已设置为进行下一步。
2.2与您的SALT
和一起声明的变量KEY
private Handler mHandler;private LicenseChecker mChecker;private LicenseCheckerCallback mLicenseCheckerCallback;boolean licensed;boolean checkingLicense;boolean didCheck;
2.3代码
将此代码粘贴到应用程序底部附近。如果许可证无效,此实现将通知用户,并提示他们购买或退出该应用。
private void doCheck() { didCheck = false; checkingLicense = true; setProgressBarIndeterminateVisibility(true); mChecker.checkAccess(mLicenseCheckerCallback); } private class MyLicenseCheckerCallback implements LicenseCheckerCallback { @Override public void allow(int reason) { // TODO Auto-generated method stub if (isFinishing()) { // Don't update UI if Activity is finishing. return; } Log.i("License","Accepted!"); //You can do other things here, like saving the licensed status to a //SharedPreference so the app only has to check the license once. licensed = true; checkingLicense = false; didCheck = true; } @SuppressWarnings("deprecation") @Override public void dontAllow(int reason) { // TODO Auto-generated method stub if (isFinishing()) { // Don't update UI if Activity is finishing. return; } Log.i("License","Denied!"); Log.i("License","Reason for denial: "+reason); //You can do other things here, like saving the licensed status to a //SharedPreference so the app only has to check the license once. licensed = false; checkingLicense = false; didCheck = true; showDialog(0); } @SuppressWarnings("deprecation") @Override public void applicationError(int reason) { // TODO Auto-generated method stub Log.i("License", "Error: " + reason); if (isFinishing()) { // Don't update UI if Activity is finishing. return; } licensed = true; checkingLicense = false; didCheck = false; showDialog(0); } } protected Dialog onCreateDialog(int id) { // We have only one dialog. return new alertDialog.Builder(this) .setTitle("UNLICENSED APPLICATION DIALOG TITLE") .setMessage("This application is not licensed, please buy it from the play store.") .setPositiveButton("Buy", new DialogInterface.onClickListener() { public void onClick(DialogInterface dialog, int which) { Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse( "http://market.android.com/details?id=" + getPackageName())); startActivity(marketIntent); finish(); } }) .setNegativeButton("Exit", new DialogInterface.onClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }) .setNeutralButton("Re-Check", new DialogInterface.onClickListener() { public void onClick(DialogInterface dialog, int which) { doCheck(); } }) .setCancelable(false) .setonKeyListener(new DialogInterface.onKeyListener(){ public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) { Log.i("License", "Key Listener"); finish(); return true; } }) .create(); }
2.4获取您的设备ID
过去曾有过关于是否使用sim串行或是否使用sim串行的争论,
TelephonyManager.getDeviceId();但是通常建议您使用以下代码获取
ANDROID_ID设备的sim
以获得最大兼容性。
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);Log.i("Device Id", deviceId); //AN EXAMPLE OF LOGGING THAT YOU SHOULD BE DOING :)
2.5创建许可证检查器
一个。在致电之前,
doCheck();您必须将此代码放入您的应用中,以确保正确创建了所有内容。
mHandler = new Handler();mLicenseCheckerCallback = new MyLicenseCheckerCallback();mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)), base64_PUBLIC_KEY);
当我执行LVL时,我读到,如果您在许可方面遇到问题,可以
this将
mChecker = newLicenseChecker(this...to中的第一个更改为
getApplicationContext(),我的似乎没有它就可以使用,但以防万一。
2.6添加权限
一个。您需要将两个权限添加到应用程序
manifest文件中。
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.vending.CHECK_LICENSE"/>
2.7确保您有正确的进口!
您可能已经完成了此 *** 作,但是我认为这将是您检查的一个好地方。
2.8如何调用要检查的许可证
一个。
doCheck();只要您想检查许可证,只需致电。例如,如果应用程序是首次运行,请进行检查。
3.如何在发布许可之前测试许可以确保许可有效?
3.1配置测试设备
一个。我有用于测试的个人电话。建议您仅在手机上注册一个Google帐户,从历史上看,这会使事情变得简单一些。您可以转到来检查帐户
Settings ->Accounts。
3.2配置开发者控制台
一个。打开开发者控制台,然后转到
Settings左侧。
b。找
License Testing
C。确保您的电子邮件地址列在
Gmail accounts with testing access
d。现在,您可以将测试响应更改为您想要的测试目的。该应用程序应做出相应响应。请记住,如果要通过SharedPrefs保存数据,则每次测试时都需要清除应用程序数据。
请确保在更改测试响应后单击“保存”,否则将不会发生任何事情! 我多次忘记了这一点,最后以偏头痛告终,然后我看到了那个令人讨厌的保存按钮。大声笑。
4.尝试的事情
4.1有条件的许可证检查
一个。如果要将
didCheck数据保存在中,可以尝试使用此代码
SharedPreferences。
if(didCheck==false){ Toast.makeText(this, "Checking application license...", Toast.LENGTH_SHORT).show(); doCheck(); Log.i("Checking!", "Checking license!"); }
4.2加密您的SharedPreferences
使用SecurePreferences
一个。转到此链接。
b。将代码从中复制并粘贴
SecurePreferences.java到名称完全相同的类中,并将其粘贴到您的项目中。
C。阅读
ReadMe.md有关实现此功能的信息。
5.故障排除
许可问题可能是令人头疼的故障排除,仅仅是因为还有很多其他事情可能出错。例如,可能存在网络问题或服务器问题,使您想扯掉头发。使用适当的日志记录将对此有所帮助,如果出现问题,您还可以获取服务器响应代码,并将其跟踪到服务器或您的应用程序。我不得不多次这样做。
5.1我无法让我的应用从服务器返回任何内容
可能的修复:
一个。确保您的应用具有正确的
KEY。
b。确保您记录了进度的每个步骤
C。检查您的日志中是否有许可服务中的任何内容。这对于找出问题出在哪里很有用。
d。确保
allow()和
dontAllow()和
applicationError()有
@Override标签。
5.2我的应用程序总是说LICENSED
或NOT_LICENSED
不管我在测试响应中将其设置为什么
一个。我对此的最佳治疗方法就是等待。看来,如果您在短时间内进行了大量测试,它将始终向您发送服务器代码
291,即重试代码。我等了一夜,第二天早上一切正常。
b。您可以清除Google Play应用和Google Play服务应用的数据(而不仅仅是缓存)。然后打开播放备份并接受所有许可证,然后重试。
C。清除您的应用数据。
5.3用于调试的服务器响应代码列表
int reason如果将它们记录下来,则应获取这些十进制值。使用此表可以引用服务器实际发送给您的应用的内容。
LICENSED = Hex: 0x0100, Decimal: 256NOT_LICENSED = Hex: 0x0231, Decimal: 561RETRY = Hex: 0x0123, Decimal: 291LICENSED_OLD_KEY = Hex: 0x2, Decimal: 2ERROR_NOT_MARKET_MANAGED = Hex: 0x3, Decimal: 3ERROR_SERVER_FAILURE = Hex: 0x4, Decimal: 4ERROR_OVER_QUOTA = Hex: 0x5, Decimal: 5ERROR_CONTACTING_SERVER = Hex: 0x101, Decimal: 257ERROR_INVALID_PACKAGE_NAME = Hex: 0x102, Decimal: 258 ERROR_NON_MATCHING_UID = Hex: 0x103, Decimal: 259
5.4还有更多空间! 他们会来!
希望对您有帮助!我尽力与大家分享我的头痛和修复方法,希望对您有所帮助!
如果我有任何错误,请务必告诉我有关它们的信息,以便尽快解决它们!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)