0

アプリ内課金を実装するために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);
       }
    }
  ....
}

助けてください。そして私の英語でごめんなさい。

4

1 に答える 1

1

最も可能性の高い問題は、設定アクティビティでライブラリ構成 (公開鍵とソルト) を初期化していることです。これは、設定を開くまでライブラリが適切に構成されないことを意味します。README の引用:

さらに、BillingController には BillingController.IConfiguration インスタンスが必要です。このインスタンスから、署名付きメッセージを検証するために必要な公開鍵と、トランザクションを難読化するためのソルトが取得されます。構成を提供するのに適した場所は、Application サブクラスです。

この場合、FirstActivityisPurcharsedを呼び出しているときに、請求コントローラーにはデータベースの難読化を解除するためのソルトがありません。

Application サブクラスで構成を設定する例については、DungeonsReduxを確認してください。

于 2012-09-10T07:09:56.340 に答える