Проверка лицензии Android всегда возвращает код ошибки 6

Мой LicenseCheckerCallback вызывает метод applicationError и возвращает errorCode 6. В моем LogCat я получаю следующий JavaStack:

02-27 08:55:18.258: I/LicenseChecker(19572): Binding to licensing service.
02-27 08:55:18.268: D/dalvikvm(19572): threadid=1: still suspended after undo (sc=1 dc=1)
02-27 08:55:18.268: D/dalvikvm(19572): GC_CONCURRENT freed 112K, 12% free 7284K/8263K, paused 12ms+2ms, total 27ms
02-27 08:55:28.233: I/System.out(19728): broadcast Received
02-27 08:55:29.408: I/System.out(19572): DIALOG_RETRY Error
02-27 08:55:29.603: E/ActivityThread(19572): Activity My_company.My_appname.LicenseVerification has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41da7698 that was originally bound here
02-27 08:55:29.603: E/ActivityThread(19572): android.app.ServiceConnectionLeaked: Activity My_company.My_appname.LicenseVerification has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41da7698 that was originally bound here
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:966)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:860)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.ContextImpl.bindService(ContextImpl.java:1364)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.ContextImpl.bindService(ContextImpl.java:1356)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.content.ContextWrapper.bindService(ContextWrapper.java:401)
02-27 08:55:29.603: E/ActivityThread(19572):    at com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
02-27 08:55:29.603: E/ActivityThread(19572):    at My_company.My_appname.LicenseVerification.bCheckLicense(LicenseVerification.java:84)
02-27 08:55:29.603: E/ActivityThread(19572):    at My_company.My_appname.LicenseVerification.onCreate(LicenseVerification.java:65)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.Activity.performCreate(Activity.java:5188)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.ActivityThread.access$700(ActivityThread.java:140)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.os.Looper.loop(Looper.java:137)
02-27 08:55:29.603: E/ActivityThread(19572):    at android.app.ActivityThread.main(ActivityThread.java:4921)
02-27 08:55:29.603: E/ActivityThread(19572):    at java.lang.reflect.Method.invokeNative(Native Method)
02-27 08:55:29.603: E/ActivityThread(19572):    at java.lang.reflect.Method.invoke(Method.java:511)
02-27 08:55:29.603: E/ActivityThread(19572):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
02-27 08:55:29.603: E/ActivityThread(19572):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
02-27 08:55:29.603: E/ActivityThread(19572):    at dalvik.system.NativeStart.main(Native Method)
  • Моя реализация проверки лицензии:

    public class LicenseVerification  extends Activity {
    
    private static final int LICENSED = 0x0;
    private static final int NOT_LICENSED = 0x1;
    private static final int LICENSED_OLD_KEY = 0x2;
    private static final int ERROR_NOT_MARKET_MANAGED = 0x3;
    private static final int ERROR_SERVER_FAILURE = 0x4;
    private static final int ERROR_OVER_QUOTA = 0x5;
    
    private static final int ERROR_CONTACTING_SERVER = 0x101;
    private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
    private static final int ERROR_NON_MATCHING_UID = 0x103;
    
    ApplicationContextProvider application;
    
     private static final byte[] SALT = new byte[] {
            -46, 65, 37, -128, -103, -57, 74, -64, 51, 88, -91, -45, 77, -17, -36, -113, -11, 32, -64,
            89
        };
    
     private LicenseCheckerCallback mLicenseCheckerCallback;
     private LicenseChecker mChecker;
     private static final String BASE64_PUBLIC_KEY = "MYKEY";
    
     public void sendBackLicenseCheck(String sStatus, int errorCode){
            Intent replyIntent = new Intent("My_company.My_app.A_CUSTOM_INTENT");
            replyIntent.putExtra("Status", sStatus);
            replyIntent.putExtra("ErrorCode", errorCode);
            this.sendBroadcast(replyIntent);
     }
     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Toast.makeText(this, "LicenseVerification ", Toast.LENGTH_SHORT);
            CheckLicense();
            finish();
     }
     public void CheckLicense(){
            Context AppContext=application.getContext();
            String sPackageName=AppContext.getPackageName();
            //Toast.makeText(this, "sPackageName: "+sPackageName, Toast.LENGTH_LONG).show();
            mLicenseCheckerCallback = new MyLicenseCheckerCallback2();
            String deviceId = Secure.getString(AppContext.getContentResolver(), Secure.ANDROID_ID);
            mChecker = new LicenseChecker(this, new ServerManagedPolicy(AppContext, new AESObfuscator(SALT, sPackageName, deviceId)),BASE64_PUBLIC_KEY);
            mChecker.checkAccess(mLicenseCheckerCallback);
     }
     private class MyLicenseCheckerCallback2 implements LicenseCheckerCallback {
            public void allow(int reason) {
                System.out.println("Allow");
                sendBackLicenseCheck("Allow",-1);
            }
            public void dontAllow(int reason) {
    
                sendBackLicenseCheck("Deny",0);
                System.out.println("DIALOG_GOTOMARKET");
    
                if (reason == Policy.RETRY) {
                    System.out.println("DIALOG_RETRY");
                } else {
                    System.out.println("DIALOG_GOTOMARKET");
                }
            }
            @Override
            public void applicationError(int errorCode) {
                sendBackLicenseCheck("Error",errorCode);
                System.out.println("DIALOG_RETRY Error");
            }
        }
    }
    
  • Я опубликовал приложение на этапе БЕТА-ТЕСТА и получил ключ BASE64_PUBLIC_KEY для своего кода.

  • Я добавил учетную запись licensetest в настройках консоли разработчика в разделе LICENSETEST.

  • Я установил Testresponse на LICENSED

Теперь, когда я отлаживаю приложение локально на своем компьютере с помощью eclipse, я вижу, что мой LicenseCheckerCallback (MyLicenseCheckerCallback2) вызывает applicationError с кодом ошибки 6. Я не нашел никакой информации о коде 6 и понятия не имею, в чем может быть причина.

Любые подсказки?


person mcfly soft    schedule 27.02.2015    source источник
comment
Есть ли у вашего приложения разрешение CHECK_LICENSE?   -  person user253751    schedule 27.02.2015
comment
Большое спасибо. Вот оно. Я глуп, потому что я думаю, что это один из первых шагов в Google Guide. Теперь я получаю код ошибки 3. Таким образом, на вопрос отвечает: ErrorCode 6 означает отсутствие разрешений для проверки лицензии. Спасибо. Любые предположения о коде ошибки 3?   -  person mcfly soft    schedule 27.02.2015
comment
Для ErrorCode 3 уже существует поток. Я проверю это. Большое спасибо всем. stackoverflow.com/questions/10377325/   -  person mcfly soft    schedule 27.02.2015
comment
Нам не нужно гадать, поскольку в вашем коде очевидно, что код 3 является ERROR_NOT_MARKET_MANAGED.   -  person JHH    schedule 27.02.2015


Ответы (2)


Код ошибки 6 означает, что у вашего приложения нет разрешения com.android.vending.CHECK_LICENSE. Вам нужно объявить в своем манифесте, что ваше приложение использует это разрешение.

person user253751    schedule 27.02.2015

Ошибка, которую вы получаете

Activity My_company.My_appname.LicenseVerification has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41da7698 that was originally bound here

Говорит вам, что вы пропускаете ServiceConnection.

Чтобы исправить это, вы должны позвонить onDestroy на свой LicenceChecker следующим образом.

@Override
protected void onDestroy() {
    super.onDestroy();
    mChecker.onDestroy();
} 

Как указано в руководстве:

Отсутствие вызова метода onDestroy() объекта LicenseChecker может привести к проблемам в течение жизненного цикла вашего приложения. Например, если пользователь меняет ориентацию экрана во время активной проверки лицензии, контекст приложения уничтожается. Если ваше приложение не закрывает IPC-соединение LicenseChecker должным образом, ваше приложение аварийно завершает работу при получении ответа. Точно так же, если пользователь выходит из вашего приложения во время проверки лицензии, ваше приложение аварийно завершает работу при получении ответа, если только оно не вызвало правильно метод onDestroy() объекта LicenseChecker для отключения от службы.

Начиная с ErrorCode 6, с которым вы сталкиваетесь, вам нужно будет добавить разрешение на проверку лицензии в свой манифест:

<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
person Marcus    schedule 27.02.2015
comment
Спасибо большое. Это помогло удалить Javastack. Очевидно, мой вопрос касается двух вещей. ErrorCode 6 и Javatsack, которые являются независимыми. Иммибис выручил меня, потому что я забыл установить разрешение, чтобы избавиться от кода ошибки 6. Теперь я не знаю, кому я должен принять :-) - person mcfly soft; 27.02.2015
comment
@ user1344545 Рад помочь. Я добавил uses-permission к своему ответу. Принятие зависит исключительно от вас, мой друг. - person Marcus; 27.02.2015
comment
Downvoter может любезно объясниться, поскольку, очевидно, мой ответ сработал. - person Marcus; 27.02.2015
comment
Дорогой Маркус. Я проголосовал за ваш ответ и принял иммибис. Но теперь это 0. Когда я снова проголосую, это -1. Я снова проголосовал. Так есть кто-то еще, кто проголосовал против? Извините за эту ситуацию. Всего наилучшего.. - person mcfly soft; 27.02.2015