如何为Android应用实现Google Play许可?

如何为Android应用实现Google Play许可?,第1张

如何为Android应用实现Google Play许可?

我已经在我的应用程序中实现许可已有一段时间了,终于使它工作了。我想分享一些我认为对入门有用的东西,以及与大家一起发现的一些问题和解决方案。我在下面链接的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。找到

SDK
SDK管理员顶部列出的安装路径。

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还有更多空间! 他们会来!

希望对您有帮助!我尽力与大家分享我的头痛和修复方法,希望对您有所帮助!

如果我有任何错误,请务必告诉我有关它们的信息,以便尽快解决它们!



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5478604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存