2012-08-14 49 views
1

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

的logcat如下:

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(); 
} 

我已经抹去授权码我的钥匙。 你应该输入你的代码来尝试,否则它将是无效的关键异常。 在此先感谢。

回答

2

AndroidApplication需要您到initialize(...)initializeForView(...)onCreate(...)。既然你没有在上面包括它,我只能假设你的代码中缺少它。

如果您需要拥有原生Android UI,则需要使用initializeForView(...)来获取LibGDX曲面,然后将其插入到视图层次结构中。或者,您可以通过界面在游戏中触发支票。

+0

现在应用程序在初始化(...)libgdx之前崩溃。 Logcat不显示行号。这对我来说是一种神秘感。现在的应用程序。应该显示授权错误消息。当然libgdx不会启动。后来,我想排除MainActivity中的Android文本输出。也许我会在render()中的libgdx start后添加许可证检查。 – nms 2012-08-15 08:51:26

+0

顺便说一句,那里有初始化(..)。但现在评论。 – nms 2012-08-15 08:58:39

+0

当你的回调函数被调用'onCreate'已过去时,你对'initialize'的调用在回调(注释)中,而不是在'onCreate'中。 – 2012-08-15 13:07:24

相关问题