Java tutorial
package com.gark.aircraftviewer.ui; import com.google.android.vending.licensing.AESObfuscator; import com.google.android.vending.licensing.LicenseChecker; import com.google.android.vending.licensing.LicenseCheckerCallback; import com.google.android.vending.licensing.Policy; import com.google.android.vending.licensing.ServerManagedPolicy; 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.os.Handler; import android.provider.Settings.Secure; import android.support.v4.app.FragmentActivity; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.TextView; /** * Created by Artem on 25.12.13. */ public class LicenseActivity extends FragmentActivity { private static final String BASE64_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiP0BYh25lgYZdJJdncxY0e3ueFz58ScWHV0Oa/fki42qcXHd8ByCQFp3q4cDtMUlLBTrFApo/vh3yGRTyYPb1CF2D3Kx8bMevUi/QND3PmtHodKkljH9uTeAX0Gr+1C7CiO0pEPv4gMALDf814hIXgrEDntsLLac2UGtzTikmzIs8ANs5VSCdaWoccsI0zQhUwYbxh6enndF3FPUDbuD6UemeFfmPb1gc6/I7mOrNPTbP+IQyhHbq5f+2J90flFVYBSTqZkVApvq9oXIotLsT7sQeDCcuQGGV8saEqXUncTdZBQS6GoTl3AQqxpjwTzM5wqcxoCo85/84WGYOPINSwIDAQAB"; // Generate your own 20 random bytes, and put them here. private static final byte[] SALT = new byte[] { -42, 69, 31, -128, -103, -37, 74, -64, 51, 88, -95, -45, 77, -117, -36, -103 - 11, 32, -64, 89 }; // private TextView mStatusText; // private Button mCheckLicenseButton; private LicenseCheckerCallback mLicenseCheckerCallback; private LicenseChecker mChecker; // A handler on the UI thread. private Handler mHandler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); // setContentView(R.layout.main); // // mStatusText = (TextView) findViewById(R.id.status_text); // mCheckLicenseButton = (Button) findViewById(R.id.check_license_button); // mCheckLicenseButton.setOnClickListener(new View.OnClickListener() { // public void onClick(View view) { // doCheck(); // } // }); mHandler = new Handler(); // 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(); } // protected Dialog onCreateDialog(int id) { // final boolean bRetry = id == 1; // return new AlertDialog.Builder(this) // .setTitle(R.string.unlicensed_dialog_title) // .setMessage( // bRetry ? R.string.unlicensed_dialog_retry_body // : R.string.unlicensed_dialog_body) // .setPositiveButton( // bRetry ? R.string.retry_button : R.string.buy_button, // new DialogInterface.OnClickListener() { // boolean mRetry = bRetry; // // public void onClick(DialogInterface dialog, // int which) { // if (mRetry) { // doCheck(); // } else { // Intent marketIntent = new Intent( // Intent.ACTION_VIEW, // Uri.parse("http://market.android.com/details?id=" // + getPackageName())); // startActivity(marketIntent); // } // } // }) // .setNegativeButton(R.string.quit_button, // new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, // int which) { // finish(); // } // }).create(); // } private void doCheck() { // mCheckLicenseButton.setEnabled(false); // setProgressBarIndeterminateVisibility(true); // mStatusText.setText(R.string.checking_license); mChecker.checkAccess(mLicenseCheckerCallback); } private void displayResult(final String result) { mHandler.post(new Runnable() { public void run() { // mStatusText.setText(result); // setProgressBarIndeterminateVisibility(false); // mCheckLicenseButton.setEnabled(true); } }); } private void displayDialog(final boolean showRetry) { mHandler.post(new Runnable() { public void run() { // setProgressBarIndeterminateVisibility(false); // showDialog(showRetry ? 1 : 0); // mCheckLicenseButton.setEnabled(true); } }); } private class MyLicenseCheckerCallback implements LicenseCheckerCallback { public void allow(int policyReason) { if (isFinishing()) { // Don't update UI if Activity is finishing. return; } // Should allow user access. // displayResult(getString(R.string.allow)); } public void dontAllow(int policyReason) { if (isFinishing()) { // Don't update UI if Activity is finishing. return; } // displayResult(getString(R.string.dont_allow)); // 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. // If the reason for the lack of license is that the service is // unavailable or there is another problem, we display a // retry button on the dialog and a different message. displayDialog(policyReason == Policy.RETRY); } public void applicationError(int 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. // String result = String.format( // getString(R.string.application_error), errorCode); // displayResult(result); } } @Override protected void onDestroy() { super.onDestroy(); mChecker.onDestroy(); } }