在开始之前,请按照此处的说明将许可证库包含在项目中:

Licensing Your Applications | Android Developers

>在项目中创建名为LicenseCheck.java的新活动

>在该活动中粘贴以下内容:

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Dialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.provider.Settings.Secure;

import android.widget.Toast;

import com.android.vending.licensing.AESObfuscator;

import com.android.vending.licensing.LicenseChecker;

import com.android.vending.licensing.LicenseCheckerCallback;

import com.android.vending.licensing.ServerManagedPolicy;

/**

* NOTES ON USING THIS LICENSE FILE IN YOUR APPLICATION:

* 1. Define the package

* of you application above

* 2. Be sure your public key is set properly @BASE64_PUBLIC_KEY

* 3. Change your SALT using random digits

* 4. Under AllowAccess, Add your previously used MainActivity

* 5. Add this activity to

* your manifest and set intent filters to MAIN and LAUNCHER

* 6. Remove Intent Filters from previous main activity

*/

public class LicenseCheck extends Activity {

private class MyLicenseCheckerCallback implements LicenseCheckerCallback {

@Override

public void allow() {

if (isFinishing()) {

// Don't update UI if Activity is finishing.

return;

}

// Should allow user access.

startMainActivity();

}

@Override

public void applicationError(ApplicationErrorCode errorCode) {

if (isFinishing()) {

// Don't update UI if Activity is finishing.

return;

}

// This is a polite way of saying the developer made a mistake

// while setting up or calling the license checker library.

// Please examine the error code and fix the error.

toast("Error: " + errorCode.name());

startMainActivity();

}

@Override

public void dontAllow() {

if (isFinishing()) {

// Don't update UI if Activity is finishing.

return;

}

// Should not allow access. In most cases, the app should assume

// the user has access unless it encounters this. If it does,

// the app should inform the user of their unlicensed ways

// and then either shut down the app or limit the user to a

// restricted set of features.

// In this example, we show a dialog that takes the user to Market.

showDialog(0);

}

}

private static final String BASE64_PUBLIC_KEY = "PLACE YOUR BASE KEY FROM GOOGLE HERE";

private static final byte[] SALT = new byte[] { INPUT 20 RANDOM INTEGERS HERE };

private LicenseChecker mChecker;

// A handler on the UI thread.

private LicenseCheckerCallback mLicenseCheckerCallback;

private void doCheck() {

mChecker.checkAccess(mLicenseCheckerCallback);

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// Try to use more data here. ANDROID_ID is a single point of attack.

String deviceId = Secure.getString(getContentResolver(),

Secure.ANDROID_ID);

// Library calls this when it's done.

mLicenseCheckerCallback = new MyLicenseCheckerCallback();

// Construct the LicenseChecker with a policy.

mChecker = new LicenseChecker(this, new ServerManagedPolicy(this,

new AESObfuscator(SALT, getPackageName(), deviceId)),

BASE64_PUBLIC_KEY);

doCheck();

}

@Override

protected Dialog onCreateDialog(int id) {

// We have only one dialog.

return new AlertDialog.Builder(this)

.setTitle("Application Not Licensed")

.setCancelable(false)

.setMessage(

"This application is not licensed. Please purchase it from Android Market")

.setPositiveButton("Buy App",

new DialogInterface.OnClickListener() {

@Override

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() {

@Override

public void onClick(DialogInterface dialog,

int which) {

finish();

}

}).create();

}

@Override

protected void onDestroy() {

super.onDestroy();

mChecker.onDestroy();

}

private void startMainActivity() {

startActivity(new Intent(this, MainActivity.class)); //REPLACE MainActivity.class WITH YOUR APPS ORIGINAL LAUNCH ACTIVITY

finish();

}

public void toast(String string) {

Toast.makeText(this, string, Toast.LENGTH_SHORT).show();

}

}

>将基本密钥更改为谷歌提供的一个,在SALT中放置20个随机整数,将MainActivity.class更改为应用程序的主要活动.

>使用新活动更新您的清单文件

android:theme="@android:style/Theme.Translucent.NoTitleBar">

>在清单标记中添加权限,但不在应用程序标记中

你们都完成了!确保在发布之前进行测试. 🙂 🙂

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐