1

我要求在我的代码中找到一个导致应用程序崩溃的问题。我有许可代码和 libgdx 代码,它们可以作为单独的应用程序正常工作。我在 Libgdx 项目的主要活动中添加了许可代码。之后,应用程序在设备上崩溃。我不知道为什么。

Logcat如下:

日志猫

主要活动代码在这里:

public class MyActivity extends AndroidApplication {
private static final String BASE64_PUBLIC_KEY = "!!!!! PLACE YOUR KEY HERE!!!!!!";


// Generate your own 20 random bytes, and put them here.
private static final byte[] SALT = new byte[] {
        -45, 65, 30, -128, -103, -57, 74, -64, 51, 88, -95, -45, 77, -117, -36, -113, -11, 32, -64,
        89
};

private TextView mStatusText;
private Button mCheckLicenseButton;

private LicenseCheckerCallback mLicenseCheckerCallback;
private LicenseChecker mChecker;
// A handler on the UI thread.
private Handler mHandler;



public void onCreate (android.os.Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    print("MyLog====","00000000000000000");

    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);
    print("MyLog====","11111111111111");
    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 displayDialog(final boolean showRetry) {
    print("MyLog====","DisplayDialog");
    mHandler.post(new Runnable() {
        public void run() {
            setProgressBarIndeterminateVisibility(false);
            showDialog(showRetry ? 1 : 0);
            mCheckLicenseButton.setEnabled(true);
        }
    });

}


private void doCheck() {
    mCheckLicenseButton.setEnabled(false);
    setProgressBarIndeterminateVisibility(true);
    mStatusText.setText(R.string.checking_license);
    mChecker.checkAccess(mLicenseCheckerCallback);
}

private void displayResult(final String result) {
    print("MyLog====","3333333333333");

    mHandler.post(new Runnable() {
        public void run() {
            print("MyLog====","aaaaaaaaaaaa");
            mStatusText.setText(result);
            print("MyLog====","bbbbbbbb");
            setProgressBarIndeterminateVisibility(false);
            print("MyLog====","cccccccc");
            mCheckLicenseButton.setEnabled(true);
            print("MyLog====","ddddddd");
        }
    });
}


private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
    public void allow(int policyReason) {
        print("MyLog====","444444444444444");
        if (isFinishing()) {
            // Don't update UI if Activity is finishing.
            return;
        }
        // Should allow user access.
        displayResult(getString(R.string.allow));
        // setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
       // initialize(new Game3(), false);

    }

    public void dontAllow(int policyReason) {
        print("MyLog====","55555555555555555");
        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) {
        print("MyLog====","6666666666666666666666");
        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.
        //if (errorCode==Policy.
        String result = String.format(getString(R.string.application_error), errorCode);
        displayResult(result);
        print("MyLog====","9999999999999999999");
        String msg="";
        if (errorCode==1) msg="1-NOT_LICENSED";
        if (errorCode==2) msg="2-LICENSED_OLD_KEY";
        if (errorCode==3) msg="3-ERROR_NOT_MARKET_MANAGED";
        if (errorCode==4) msg="4-ERROR_SERVER_FAILURE";
        if (errorCode==5) msg="5-ERROR_OVER_QUOTA";
        if (errorCode==6) msg="6-ERR";
        print("MyLog====",msg);

    }
}

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

我已经从许可代码中删除了我的密钥。您应该输入您的代码来尝试,否则它将是无效的密钥异常。提前致谢。

4

1 回答 1

2

AndroidApplication要求您initialize(...)initializeForView(...)onCreate(...). 由于您没有在上面包含它,我只能假设您的代码中缺少它。

如果你需要一个原生的 Android UI,你需要使用initializeForView(...)来获取一个 LibGDX 表面,然后将它插入到视图层次结构中。或者,您可以通过界面从游戏内触发检查。

于 2012-08-15T03:45:22.423 回答