noclassdeferror для внутреннего класса MyLicenseCheckerCallback

Я пытаюсь сделать этот учебник Но продолжайте получать эту ошибку:

08-21 14: 12: 49.599: E / AndroidRuntime (714): java.lang.NoClassDefFoundError: com.akiraapps.LicenseCheck $ MyLicenseCheckerCallback

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.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;

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;


public class LicenseCheck extends Activity {

    private static final String BASE64_PUBLIC_KEY = "no";

    private static final byte[] SALT = new byte[] { no};

    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) {
            System.out.println("Allow");
            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) {
            System.out.println("dontAllow");
            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) {
            System.out.println("applicationError");
            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();
    }

}

Я следую руководству по настройке LVL в качестве проекта библиотеки, и этот импорт кажется нормальным.

Почему я получаю эту ошибку? Почему он не может найти внутренний класс? Если я щелкну правой кнопкой мыши и скажу «Показать определение», он перейдет во внутренний класс.


person owen gerig    schedule 21.08.2012    source источник
comment
эта тема та же, но без ответа :( stackoverflow.com/questions/9740514/   -  person owen gerig    schedule 21.08.2012
comment
скопировал образец из каталога образцов и все еще та же ошибка (обновленный код выше, чтобы отразить это)?   -  person owen gerig    schedule 22.08.2012
comment
использовал только образец из android и все равно получил ошибку. на мой взгляд, это настройка затмения (хотя все равно что-то с путем к классу).   -  person owen gerig    schedule 22.08.2012


Ответы (3)


У меня была такая же проблема.

Ниже шаги решили проблему

  1. возьмем пример стандартной библиотеки
  2. скопировал файл library.jar из проекта библиотеки в вашу папку libs
person Rakesh Patil    schedule 29.08.2013

Итак, этот ответ SO - это то, что исправлено. Я создал папку с именем libs и скопировал файл library.jar из включенного проекта библиотеки. в лицензионном пакете, скачанном с менеджером

Я не понимаю, что в этом ответе это должно было быть сделано для меня, поскольку я использую ADT 20.0.3

В основном это сводится к примеру, который я загрузил прямо с Android и застрял на несколько часов, пытаясь выяснить, что было не так, и похоже, что этот шаг должен был быть в readme / help docs ИЛИ Я делаю что-то не так.

Если вы знаете, почему это ответ и как это сделать лучше, пожалуйста, ответьте, и я изменю ответ на ваш.

person owen gerig    schedule 22.08.2012
comment
Еще один интересный момент заключается в том, что jar по-прежнему не находится на пути к классу (включен только проект библиотеки). Имея в виду, что это похоже на файлы классов времени выполнения, которые ищут в каталоге / libs? - person owen gerig; 22.08.2012

У меня было точно такое же исключение, и ни одна из приведенных выше рекомендаций не сработала для меня.

Однако я получил свою работу, убедившись, что ваш проект LVL является проектом библиотеки (щелкните правой кнопкой мыши проект -> свойства -> android и установите флажок «Is Libary»).

Чтобы включить это в свой проект приложения, удалите все другие ссылки на это и примените изменения. Затем, если еще нет, перейдите к (щелкните правой кнопкой мыши проект приложения -> свойства -> android) и в разделе библиотеки щелкните Добавить и выберите свой проект LVL. Применить изменения. Хорошо и чистый проект.

Надеюсь, это кому-то поможет.

person davejwakley    schedule 17.01.2014