Android 许可证验证检查 returns 总是错误代码 6
Android License Verification Check returns always Error Code 6
我的 LicenseCheckerCallback 调用方法 applicationError 和 return 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.access0(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");
}
}
}
我已经在 BETA 测试阶段发布了该应用程序并为我的代码获取了 BASE64_PUBLIC_KEY。
我已经在 LICENSETEST
下开发者控制台的设置中添加了一个 licensetest-account
我将 Testreponse 设置为 LICENCED
现在,当我使用 eclipse 在我的电脑上本地调试应用程序时,我看到我的 LicenseCheckerCallback (MyLicenseCheckerCallback2) 调用了错误代码为 6 的 applicationError。我没有找到任何关于代码 6 的信息,我不知道可能是什么原因.
有什么提示吗?
您遇到的错误
Activity My_company.My_appname.LicenseVerification has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41da7698 that was originally bound here
告诉你你正在泄漏一个ServiceConnection
。
要解决此问题,您必须像这样
在 LicenceChecker
上调用 onDestroy
@Override
protected void onDestroy() {
super.onDestroy();
mChecker.onDestroy();
}
如 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.
从您遇到的 ErrorCode 6 开始,您需要将许可检查权限添加到您的清单中:
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
错误代码6表示您的应用没有com.android.vending.CHECK_LICENSE
权限。您需要在清单中声明您的应用使用此权限。
我的 LicenseCheckerCallback 调用方法 applicationError 和 return 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.access0(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"); } } }
我已经在 BETA 测试阶段发布了该应用程序并为我的代码获取了 BASE64_PUBLIC_KEY。
我已经在 LICENSETEST
下开发者控制台的设置中添加了一个 licensetest-account
我将 Testreponse 设置为 LICENCED
现在,当我使用 eclipse 在我的电脑上本地调试应用程序时,我看到我的 LicenseCheckerCallback (MyLicenseCheckerCallback2) 调用了错误代码为 6 的 applicationError。我没有找到任何关于代码 6 的信息,我不知道可能是什么原因.
有什么提示吗?
您遇到的错误
Activity My_company.My_appname.LicenseVerification has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41da7698 that was originally bound here
告诉你你正在泄漏一个ServiceConnection
。
要解决此问题,您必须像这样
在LicenceChecker
上调用 onDestroy
@Override
protected void onDestroy() {
super.onDestroy();
mChecker.onDestroy();
}
如 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.
从您遇到的 ErrorCode 6 开始,您需要将许可检查权限添加到您的清单中:
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
错误代码6表示您的应用没有com.android.vending.CHECK_LICENSE
权限。您需要在清单中声明您的应用使用此权限。