Проверка лицензии LVL из службы Intent

#android #android-lvl #intentservice

#Android #android-lvl #intentservice

Вопрос:

У меня есть бесплатное приложение, которое также содержит функциональность pro, которая будет доступна пользователю, если он купит ключ pro для моего приложения в Android Market. Я настроил приемник в приложении pro key, а другой — в основном приложении. Когда пользователь нажимает кнопку «Подтвердить ключ» в главном приложении, намерение передается получателю в приложении key, которое затем запускает IntentService для проверки, действительна ли лицензия pro key. Затем 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. Смогли ли вы это сделать? Должно быть больше примеров LVL

Ответ №1:

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

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