Проверка лицензии LVL от Intent Service - PullRequest
3 голосов
/ 10 ноября 2011

У меня есть бесплатное приложение, которое также содержит профессиональные функции, которые будут доступны пользователю, если они купят профессиональный ключ для моего приложения в Android Market.Я настроил приемник в приложении Pro Key и еще один в основном приложении.Когда пользователь нажимает кнопку «Подтвердить ключ» в главном приложении, намерение транслируется получателю в приложении ключа, которое затем запускает IntentService, чтобы проверить, действительна ли лицензия профессионального ключа.Затем IntentService передает намерение получателю основного приложения, содержащее дополнительный «ответ» от проверки LVL.

Я почти на месте.Только когда я попытался выполнить проверку LVL в IntentService, я получил ошибку:

W/MessageQueue(2652): java.lang.RuntimeException: Handler{4052de20} sending message to a Handler on a dead thread
W/MessageQueue(2773):   at com.android.vending.licensing.LicenseChecker$ResultListener.verifyLicense(LicenseChecker.java:207)

Есть предложения?

источник IntentService:

public class CheckerService extends IntentService {

private static final byte[] SALT = ....;
private static final String BASE64_PUBLIC_KEY = ...;
private String device_id;

public CheckerService() {
    super("CheckerService");
}

@Override
protected void onHandleIntent(Intent intent) {
    SharedPreferences data = getSharedPreferences("data", MODE_PRIVATE);
    device_id = data.getString("device_id", null);

    if (device_id == null) {
        SharedPreferences.Editor editor = data.edit();
        device_id = new DeviceId().generate(this);
        editor.putString("device_id", device_id);
        editor.commit();
    }

    ServerManagedPolicy smp = new ServerManagedPolicy(this,
            new AESObfuscator(SALT, getPackageName(), device_id));
    LicenseChecker checker = new LicenseChecker(this, smp, BASE64_PUBLIC_KEY);
    checker.checkAccess(new LicenseCheckerCallback(){

        public void allow() {
            Intent i = new Intent();                
            i.setAction("com.mainapp.intent.action.LICENSE_RESPONSE");
            i.putExtra("response", "LICENSE_OK");
            sendBroadcast(i);
        }

        public void dontAllow() {
            Intent i = new Intent();                
            i.setAction("com.mainapp.intent.action.LICENSE_RESPONSE");
            i.putExtra("response", "LICENSE_NOT_OK");
            sendBroadcast(i);
        }

        public void applicationError(ApplicationErrorCode errorCode) {
            Intent i = new Intent();                
            i.setAction("com.mainapp.intent.action.LICENSE_RESPONSE");
            i.putExtra("response", "LICENSE_ERROR");
            sendBroadcast(i);
        }});

}


@Override
public void onDestroy() {
    super.onDestroy();
    checker.onDestroy();
}
}

1 Ответ

0 голосов
/ 07 февраля 2013

Я считаю, что эта проблема с IntentService. IntentService управляет собственным жизненным циклом. По сути, это просто служба, которая работает не в потоке пользовательского интерфейса. Служба уничтожается до того, как обратный вызов может быть обработан, поэтому, когда обратный вызов происходит, для него не существует ничего для «обратного вызова».

Вы можете попробовать запустить его в службе с помощью START_STICKY или START_NOT_STICKY и самостоятельно управлять жизненным циклом.

...