1

My LicenseCheckerCallback calls method applicationError and return errorCode 6. In my LogCat I get the following 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)
  • My License Verification Implementation :

    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");
            }
        }
    }
    
  • I have published the app in the BETA TEST Phase and fetched the BASE64_PUBLIC_KEY for my code.

  • I have added a licensetest-account in the settings in the developer console under LICENSETEST

  • I set the Testreponse to LICENCED

Now when I debug the application locally on my pc using eclipse I see that my LicenseCheckerCallback (MyLicenseCheckerCallback2) calls applicationError with ErrorCode 6. I did not found any information about Code 6 and I have no clue what could be the reason.

Any hints ?

mcfly soft
  • 11,289
  • 26
  • 98
  • 202
  • Does your app have the CHECK_LICENSE permission? – user253751 Feb 27 '15 at 08:20
  • Thanks a lot. That was it. I am stupid, because I guess its one of the first steps in the Google Guide. Now I get an errorcode 3. So the question is answered with : ErrorCode 6 means no permissions to check license. Thank you. Any guess about the errorcode 3 ? – mcfly soft Feb 27 '15 at 08:27
  • For ErrorCode 3 exists already a thread. I will check this out. Thanks a lot to all. http://stackoverflow.com/questions/10377325/how-do-you-deal-with-licensecheckercallback-error-not-market-managed-error-code – mcfly soft Feb 27 '15 at 08:34
  • We don't really need to guess since in your code it's evident that code 3 is "ERROR_NOT_MARKET_MANAGED" – JHH Feb 27 '15 at 08:35

2 Answers2

4

Error code 6 means that your app does not have the com.android.vending.CHECK_LICENSE permission. You need to declare in your manifest that your app uses this permission.

user253751
  • 57,427
  • 7
  • 48
  • 90
1

The error that you are getting

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

Is telling you that you are leaking a a ServiceConnection.

To fix this, you have to call onDestroy on your LicenceChecker like this

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

As stated in the tutorial:

Failing to call the LicenseChecker's onDestroy() method can lead to problems over the lifecycle of your application. For example, if the user changes screen orientation while a license check is active, the application Context is destroyed. If your application does not properly close the LicenseChecker's IPC connection, your application will crash when the response is received. Similarly, if the user exits your application while a license check is in progress, your application will crash when the response is received, unless it has properly called the LicenseChecker's onDestroy() method to disconnect from the service.

As of the ErrorCode 6 that you are experiencing, you will need to add the permission for license checking to your manifest:

<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
Marcus
  • 6,697
  • 11
  • 46
  • 89
  • Thank you very much. That helped removing the Javastack. Obviously my question is asking for 2 things. ErrorCode 6 and the Javatsack, which are independent. Immibis helped me out, because I forgot to set a permission to get rid of the errorcode 6. Now I don't know to whom I should accept:-) – mcfly soft Feb 27 '15 at 08:32
  • @user1344545 I'm glad to help. I added the `uses-permission` to my answer. The acceptance is solely up to you my friend. – Marcus Feb 27 '15 at 08:34
  • The downvoter may kindly explain himself, since obviously my answer worked. – Marcus Feb 27 '15 at 08:39
  • Dear Marcus. I upvoted your answer and accepted immibis ones. But now its "0". When I vote up again its "-1". I upvoted again. So there is someone else that downvoted ? Sorry for this situation. All the best.. – mcfly soft Feb 27 '15 at 09:37