我正在使用AndroidBillingLibrary来实施应用内结算。购买项目应禁用所有活动中的广告。但是,当我测试我的应用程序(第一项是“android.test.purchase”,然后真实项目)发生以下情况:购买广告被禁用后,但重新启动后,应用程序广告再次显示。
项目发布在开发人员的控制台中,当我购买带有测试帐户的项目时,Google Play说一切都好。
“购买”按钮位于我的应用程序的设置中。以下是代码的一部分:
public class PreferencesActivity extends SherlockPreferenceActivity {
public final static String PUBLIC_KEY = "my public key";
public final static String ANDROID_ADS_ITEM = "ads.buy";
private AbstractBillingObserver billingObserver;
...
@Override protected void onDestroy(){
BillingController.unregisterObserver(billingObserver);
super.onDestroy();
}
private void adsDisable(){
final Preference adsDisable = (Preference) findPreference("disableAds");
billingObserver = new AbstractBillingObserver(this){
public void onRequestPurchaseResponse(String itemId, ResponseCode response){
}
public void onPurchaseStateChanged(String itemId, PurchaseState state){
}
public void onBillingChecked(boolean supported){
if(!supported)
adsDisable.setEnabled(false);
else if(!billingObserver.isTransactionsRestored())
BillingController.restoreTransactions(PreferencesActivity.this);
}
public void onSubscriptionChecked(boolean supported) {
// TODO Auto-generated method stub
}
};
BillingController.setConfiguration(new IConfiguration(){
public String getPublicKey(){
return PUBLIC_KEY;
}
public byte[] getObfuscationSalt(){
return new byte[]{ 41, -90, -116, -41, 66, -53, 122, -110, -127, -96, -88, 77, 127, 115, 1, 73, 57, 110, 48, -116 };
}
});
BillingController.registerObserver(billingObserver);
BillingController.checkBillingSupported(this);
adsDisable.setOnPreferenceClickListener(new OnPreferenceClickListener(){
public boolean onPreferenceClick(Preference preference){
BillingController.requestPurchase(PreferencesActivity.this, ANDROID_ADS_ITEM, true, null);
return false;
}
});
boolean purchased = BillingController.isPurchased(this, ANDROID_ADS_ITEM);
if(purchased){
adsDisable.setTitle(R.string.disableAdsYes_prefs); adsDisable.setEnabled(false);
}
}
这就是我尝试停用广告的方式:
public class FirstActivity extends SherlockActivity {
public final static String ANDROID_ADS_ITEM = "ads.buy";
private AdView adView;
LinearLayout layout;
@Override
public void onCreate(Bundle savedInstanceState) {
...
String adId = "my ad id";
boolean purchased = BillingController.isPurchased(this, ANDROID_ADS_ITEM);
if(purchased){
layout = (LinearLayout) findViewById(R.id.ads);
layout.removeView(layout);
} else {
adView = new AdView(this, AdSize.BANNER, adId);
layout = (LinearLayout) findViewById(R.id.ads);
layout.addView(adView);
AdRequest adRequest = new AdRequest();
adView.loadAd(adRequest);
}
}
....
}
请帮忙。对不起我的英语。
答案 0 :(得分:1)
问题很可能是您在首选项活动中初始化库配置(公钥和盐)。这意味着在打开首选项之前,将无法正确配置库。引用自述文件:
此外,BillingController需要一个 BillingController.IConfiguration实例从中获取公钥 需要验证签名的消息和盐来进行混淆 获得交易。提供配置的好地方 在Application子类中。
在这种情况下,当您在 FirstActivity 中呼叫isPurcharsed
时,结算控制器没有盐来对数据库进行反混淆。
查看DungeonsRedux以获取在Application子类中设置配置的示例。