Проверка лицензирования Android при отсутствии сервера / службы - PullRequest
3 голосов
/ 15 января 2012

У меня есть приложение, и я пытаюсь добавить лицензирование Google вместо защиты от копирования.

Моя проблема: Когда устройство может подключиться, проблем нет, и если есть лицензия, оно предоставляет доступ. Если устройство может подключиться и лицензия отсутствует, доступ к нему запрещается.

НО, когда устройство НЕ МОЖЕТ подключиться из-за режима полета, мертвой зоны и т. Д., Приложение выдает нелицензированный ответ.

Вот мой код: пакет "имя пакета";

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;


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 =     "MY KEY";

private static final byte[] SALT = new byte[] { "20 RANDOM INTEGERS"  };
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 the 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, MY_Activity.class));  
    finish();
}

public void toast(String string) {
    Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
}

}

Я даже хочу заблокировать доступ, только если он вернется, НЕТ лицензии. Я бы предпочел проверять каждый раз, когда приложение работает и сервер доступен. Даже если бы я мог запустить проверку, чтобы увидеть, может ли он добраться до сервера и пойти оттуда.

Ответы [ 3 ]

1 голос
/ 15 апреля 2012

Возможно, вы используете тестовый аккаунт с библиотекой LVL.При использовании учетной записи Google Test лицензия будет действительна только в течение 1 минуты, а по истечении минуты для любых дальнейших проверок лицензии потребуется сетевой доступ для возврата действительного ответа.С реальной учетной записью, которая приобрела приложение, действительный лицензионный ответ будет кэшироваться в течение нескольких дней (при условии, что вы используете ServerManagedPolicy).

1 голос
/ 15 января 2012

Я нашел работу вокруг.Я не нашел исправления.После исчерпывающего исследования я обнаружил, что по умолчанию, если нет соединения или в режиме полета, проверка лицензирования автоматически по умолчанию принимает значение NOT_LICENSED.

То, что я сделал, было проверкой соединения.Если есть подключение, он запускает проверку лицензии.Если нет соединения, он просто переходит к основному действию.

0 голосов
/ 22 июля 2013
public void dontAllow(int policyReason) {

   if (isFinishing()) {
       // Don't update UI if Activity is finishing.
       return;
    }

    if (policyReason == Policy.RETRY) {
        //-- no connection (unable to validate license).
    } else { 
        //-- no license (application is not licensed).
    }

    showDialog(0);
}
...