我的应用已准备好提交,但我最近了解了许可。
我已经在网上找到了一步一步的教程:http://twistbyte.com/tutorial/using-the-android-licensing-service-step-by-step
我已将许可库导入Eclipse并按照教程中的描述创建了LicenseCheckActivity
类。
我正在教程的最后一步,第7点。教程说我的课应该扩展LicenseCheckActivity
。但是,我想要检查许可的类已经扩展了Activity。
如何使用checkLicense()
课程中的LicenseCheckActivity
方法?
这是我的代码:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
// Check the license
LicenseCheckActivity l = new LicenseCheckActivity();
checkLicense();
这给了我以下错误:
无法实例化类型LicenseCheckActivity
这是我的LicenseCheckActivity
班级
public abstract class LicenseCheckActivity extends Activity {
static boolean licensed = true;
static boolean didCheck = false;
static boolean checkingLicense = false;
static final String BASE64_PUBLIC_KEY = "MY BASE KEY";
LicenseCheckerCallback mLicenseCheckerCallback;
LicenseChecker mChecker;
Handler mHandler;
SharedPreferences prefs;
// REPLACE WITH YOUR OWN SALT , THIS IS FROM EXAMPLE
private static final byte[] SALT = new byte[] { -46, 65, 30, -128, -103,
-57, 74, -64, 51, 88, -95, -45, 77, -117, -36, -113, -11, 32, -64,
89 };
private void displayResult(final String result) {
mHandler.post(new Runnable() {
public void run() {
setProgressBarIndeterminateVisibility(false);
}
});
}
protected void doCheck() {
didCheck = false;
checkingLicense = true;
setProgressBarIndeterminateVisibility(true);
mChecker.checkAccess(mLicenseCheckerCallback);
}
protected void checkLicense() {
Log.i("LICENSE", "checkLicense");
mHandler = new Handler();
// Try to use more data here. ANDROID_ID is a single point of attack.
String deviceId = Settings.Secure.getString(getContentResolver(),
Settings.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);
// mChecker = new LicenseChecker(
// this, new StrictPolicy(),
// BASE64_PUBLIC_KEY);
doCheck();
}
protected class MyLicenseCheckerCallback implements LicenseCheckerCallback {
public void allow() {
Log.i("LICENSE", "allow");
if (isFinishing()) {
// Don't update UI if Activity is finishing.
return;
}
// Should allow user access.
displayResult(getString(R.string.allow));
licensed = true;
checkingLicense = false;
didCheck = true;
}
public void dontAllow() {
Log.i("LICENSE", "dontAllow");
if (isFinishing()) {
// Don't update UI if Activity is finishing.
return;
}
displayResult(getString(R.string.dont_allow));
licensed = false;
// 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.
checkingLicense = false;
didCheck = true;
showDialog(0);
}
public void applicationError(int errorCode) {
Log.i("LICENSE", "error: " + errorCode);
if (isFinishing()) {
// Don't update UI if Activity is finishing.
return;
}
licensed = false;
// 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.
String result = String.format(
getString(R.string.application_error), errorCode);
checkingLicense = false;
didCheck = true;
displayResult(result);
// showDialog(0);
}
public void allow(int reason) {
// TODO Auto-generated method stub
}
public void dontAllow(int reason) {
// TODO Auto-generated method stub
}
}
protected Dialog onCreateDialog(int id) {
// We have only one dialog.
return new AlertDialog.Builder(this)
.setTitle(R.string.unlicensed_dialog_title)
.setMessage(R.string.unlicensed_dialog_body)
.setPositiveButton(R.string.buy_button,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Intent marketIntent = new Intent(
Intent.ACTION_VIEW,
Uri.parse("http://market.android.com/details?id="
+ getPackageName()));
startActivity(marketIntent);
finish();
}
})
.setNegativeButton(R.string.quit_button,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
finish();
}
})
.setCancelable(false)
.setOnKeyListener(new DialogInterface.OnKeyListener() {
public boolean onKey(DialogInterface dialogInterface,
int i, KeyEvent keyEvent) {
Log.i("License", "Key Listener");
finish();
return true;
}
}).create();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mChecker != null) {
Log.i("LIcense", "distroy checker");
mChecker.onDestroy();
}
}
}
答案 0 :(得分:5)
您收到该错误是因为您正在尝试
// Check the license
LicenseCheckActivity l = new LicenseCheckActivity();
实例活动。你永远不会这样做!始终使用ActivityManager和Intents来启动活动并在它们之间传递信息。
解决方案:
由于您希望您的启动类继续扩展Activity而不能扩展LicenseCheckActivity
,因此唯一的其他建议是在您的启动类中移动代码。
例如:
从LicenseCheckActivity
获取所有代码并将其移至MainActivity
课程,然后您可以在checkLicense()
MainActivity
答案 1 :(得分:3)
本教程指出使用Activity
扩展您的LicenseCheckActivity
。
示例:
class ExampleActivity extends LicenseCheckActivity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
Toast.makeText(this, "Checking Application License", Toast.LENGTH_SHORT).show();
// Check the license
checkLicense();
}
}
由于LicenseCheckActivity
扩展了Activity
,如果您使用ExampleActivity
扩展Activity
,那么您的班级LicenseCheckActivity
仍会继承您的ExampleActivity
方法。
如果您需要ListActivity
课程扩展LicenseCheckActivity
,那么您可以ListActivity
延长{{1}}而非活动。