1

ServerManagedPolicy公開する前に、アプリケーションにを適用しようとしています。Saltの配列を定義しbyte[]、公開鍵を取得し、getPackageName()からデバイスIDを取得しましたSettings.Secure.ANDROID_IDLicenseCheckerCallbackまた、実装を保持するメインアクティビティ内にプライベートクラスを定義しました。コードについて話しましょう:

onCreate()

public void onCreate(Bundle savedInstanceState) { // line 47
    String deviceId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);

    checker = new LicenseChecker(this, new ServerManagedPolicy(this,
        new AESObfuscator(SALT, getPackageName(), deviceId)),
        BASE64_PUBLIC_KEY
    );
    checkerCallback = new MyCheckerCallback();

    checker.checkAccess(checkerCallback); // line 56

内部onDestroy()

@Override
protected void onDestroy() { // line 125
    super.onDestroy();
    checker.onDestroy();
}

MyCheckerCallback

private class MyCheckerCallback implements LicenseCheckerCallback {

    @Override
    public void allow(int reason) {
        if (isFinishing()) {
            return;
        }
        displayResult("Allow");
    }

    @Override
    public void dontAllow(int reason) {
        if (isFinishing()) {
            return;
        }
        displayResult("Don't allow");

        if (reason == ServerManagedPolicy.RETRY) {
            displayResult("Retry");
        } else {
            displayResult("Go to market");
        }
    }

    @Override
    public void applicationError(int errorCode) {

        displayResult((errorCode==LicenseCheckerCallback.ERROR_CHECK_IN_PROGRESS)+" progress");
        displayResult((errorCode==LicenseCheckerCallback.ERROR_INVALID_PACKAGE_NAME)+" package");
        displayResult((errorCode==LicenseCheckerCallback.ERROR_INVALID_PUBLIC_KEY)+" public");
        displayResult((errorCode==LicenseCheckerCallback.ERROR_MISSING_PERMISSION)+" permission");
        displayResult((errorCode==LicenseCheckerCallback.ERROR_NON_MATCHING_UID)+" uid");
        displayResult((errorCode==LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED)+" market");
    }
}

これは、開発者チュートリアルのこのページに完全に基づいています。displayResult()メッセージ付きのアラートを表示します。

private void displayResult(String message) {
    AlertDialog dialog = new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.ic_dialog_alert).setTitle("Status")
            .setMessage(message)
            .setPositiveButton("Ok", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            }).create();
    dialog.show();
}

このすべてのコードを設定すると、いくつかのダイアログが返されます。[許可しない]と[再試行]です。場合によっては、アプリに少しストレスをかけた後、このエラーがログに表示されます。

11-18 18:50:17.566: E/ActivityThread(23675): Activity com.package.test.TestActivity has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41a74ad0 that was originally bound here
11-18 18:50:17.566: E/ActivityThread(23675): android.app.ServiceConnectionLeaked: Activity com.package.test.TestActivity has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41a74ad0 that was originally bound here
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:965)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:859)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.ContextImpl.bindService(ContextImpl.java:1191)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.ContextImpl.bindService(ContextImpl.java:1183)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.content.ContextWrapper.bindService(ContextWrapper.java:394)
11-18 18:50:17.566: E/ActivityThread(23675):    at com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
11-18 18:50:17.566: E/ActivityThread(23675):    at com.package.test.TestActivity.onCreate(TestActivity.java:56)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.Activity.performCreate(Activity.java:5008)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3512)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.ActivityThread.access$700(ActivityThread.java:130)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.os.Looper.loop(Looper.java:137)
11-18 18:50:17.566: E/ActivityThread(23675):    at android.app.ActivityThread.main(ActivityThread.java:4745)
11-18 18:50:17.566: E/ActivityThread(23675):    at java.lang.reflect.Method.invokeNative(Native Method)
11-18 18:50:17.566: E/ActivityThread(23675):    at java.lang.reflect.Method.invoke(Method.java:511)
11-18 18:50:17.566: E/ActivityThread(23675):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-18 18:50:17.566: E/ActivityThread(23675):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-18 18:50:17.566: E/ActivityThread(23675):    at dalvik.system.NativeStart.main(Native Method)

これまでにこのエラーに直面したことがありますか?

4

1 に答える 1

1

ああ、運が良かった。最後に、私はそれを機能させました。再試行の問題は、開発者コンソールがしばらく前(1時間程度など)に通常の回答を返すように設定されていて、デバイスが3Gにしか接続されていなかったことです。サーバーに正しく接続されませんでした。Wi-Fiに移行すると、応答がより便利になり始めました(NOT_MARKET_MANAGED私の場合、アプリはまだアップロードされていないため)。

2番目の問題であるログに記録されたエラーは、ダイアログを開いた状態でデバイスを回転させたときに発生しました。

于 2012-11-18T22:27:23.940 に答える