Проверка лицензии на про ключ - PullRequest
3 голосов
/ 07 ноября 2011

Так что я хотел бы сделать бесплатное приложение с загруженной полной функциональностью. Функциональность pro будет отключена, пока приложение не обнаружит лицензионный ключ pro. И, конечно же, я хотел бы, чтобы профессиональный ключ проверил его лицензию с использованием LVL. До тех пор, пока я знаю, как все делать правильно, я не знаю, как заставить Pro-ключ связываться с приложением, чтобы оно включало функцию Pro.

Вот основной код приложения (com.test.mainapp):

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    context = getApplicationContext();

    final PackageManager pacman = getPackageManager();
    final int signatureMatch = pacman.checkSignatures(getPackageName(),
            "com.test.mainapp_key");

    if (signatureMatch == PackageManager.SIGNATURE_MATCH) {
        Toast.makeText(context, "Pro key detected!", Toast.LENGTH_SHORT)
                .show();
    } else {
        Toast.makeText(context, "Free version", Toast.LENGTH_SHORT).show();
    }
}

Несмотря на то, что это мешает другим создавать поддельные ключи для моего приложения, они все равно могут делиться приложением с ключами онлайн, и оно будет работать. Поскольку мы не можем выполнить проверку LVL из другого приложения, я бы хотел, чтобы приложение с лицензионным ключом проверило свою собственную лицензию, и если она правильная, только тогда пользователь получит профессиональную функциональность. Как сделать так, чтобы приложение с лицензионным ключом и основное приложение взаимодействовали друг с другом следующим образом?

Функциональность, которую я пытаюсь получить, аналогична, например, для Titanium Backup.

Ответы [ 2 ]

10 голосов
/ 07 ноября 2011

Вы можете отправлять намерения между основным приложением и ключевым приложением.Если вы используете LVL в ключевом приложении, то пример обратного вызова будет:

private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
    public void allow() {
        Log.i("Key", "License Accepted");
        Intent i = new Intent();
        i.setAction("intent.to.call.on.success");
        i.putExtra("licenseresult", 0);
        c.sendBroadcast(i);
        mChecker.onDestroy();
    }

    public void dontAllow() {
        Log.e("Key", "License Denied");
        Intent i = new Intent();
        i.setAction("intent.to.call.on.failure");
        i.putExtra("licenseresult", 1);
        c.sendBroadcast(i);
        mChecker.onDestroy();
    }

    public void applicationError(ApplicationErrorCode errorCode) {
        Log.i("Key", "LR Error");
        Intent i = new Intent();
        i.setAction("intent.to.call.on.error");
        i.putExtra("licenseresult", 2);
        c.sendBroadcast(i);
        mChecker.onDestroy();
    }
}

В обоих приложениях вы настроите широковещательные приемники, чтобы инициировать проверку лицензии и обработать результат.например,

public class License extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals("intent.called.to.initiate.request")) {
                // Initiate the license request here (possibly using a service)
        return;
    }
}

} 

Вы должны ограничить доступ к намерениям, используя разрешения на основе сертификатов, чтобы другие приложения не могли отправлять поддельные намерения "Успех лицензии".

http://developer.android.com/reference/android/content/BroadcastReceiver.html#Permissions

Короткая версия.

Определение разрешения в манифесте

< permission android:name="my.package.LicenseCheck" android:protectionLevel="signature"/> 

Использование разрешения в декларации получателя:

<receiver android:name="name.of.your.receiver" android:permission="my.package.LicenseCheck"> 
<intent-filter>
    <action android:name="name.of.intent"/>
</intent-filter>
</receiver>
1 голос
/ 05 сентября 2012

@ MainApp

<permission android:name="myapp.permission.RESPOND" protectionLevel="signature" />

<receiver android:name=".receiver.WhichHandlesValidationResponse" android:permisssion="myapp.permission.RESPOND">
    <intent-filter>
            <action android:name="myapp.action.VALIDATION_RESPONSE" />
    </intent-filter>
</receiver>

@ KeyApp

<uses-permission android:name="myapp.permission.RESPOND" />

Создать класс LvlValidationHandler.class, содержащий:

Intent i = new Intent("myapp.action.VALIDATION_RESPONSE");
sendBroadcast(i);
...