Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android应用内计费:应用内制作时,广告不会被删除_Java_Android_In App Billing_Ads - Fatal编程技术网

Java Android应用内计费:应用内制作时,广告不会被删除

Java Android应用内计费:应用内制作时,广告不会被删除,java,android,in-app-billing,ads,Java,Android,In App Billing,Ads,我已在我的活动中实施应用内计费 这是我的onIabPurchaseFinished()方法: @Override public void onIabPurchaseFinished(IabResult result, Purchase info) { if (!verifyDeveloperPayload(info)) { Toast.makeText(this, R.string.error_purchasing, Toast.LENGTH_LONG).show();

我已在我的活动中实施应用内计费

这是我的
onIabPurchaseFinished()
方法:

@Override
public void onIabPurchaseFinished(IabResult result, Purchase info) {

    if (!verifyDeveloperPayload(info)) {
        Toast.makeText(this, R.string.error_purchasing, Toast.LENGTH_LONG).show();
    }

    Toast.makeText(this, R.string.premium_bought, Toast.LENGTH_LONG).show();

    if (info.getSku().equals("chords_premium")) {

        /** salva isPremium tra SharedPreferences */
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString("status", "purchased");
        editor.apply();
    }
}
如您所见,我将字符串
“status”
保存到
SharedReferences
,这样我就可以从任何地方访问它,即使在应用程序关闭后也可以将其保存

然后在我的其他活动中,我写了这样的广告:

final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    final String status = prefs.getString("status", "free");


    /** gestisce le pubblicita */
    if (status.equals("free")) {
        MobileAds.initialize(getApplicationContext(), "ca-app-pub-6723047396589178/2654753246");

        AdView listBanner = (AdView) findViewById(R.id.chords_list_banner);
        AdRequest adRequest = new AdRequest.Builder().build();
        listBanner.loadAd(adRequest);

        /** carica Ad a tutto schermo */
        chordsListAd = new InterstitialAd(this);
        chordsListAd.setAdUnitId("ca-app-pub-6723047396589178/7447672046");
        requestNewInterstitial();


        chordsListAd.setAdListener(new AdListener() {
            @Override
            public void onAdClosed() {
                requestNewInterstitial();
            }
        });
    }
正如您在这里看到的,广告被一个
if语句所包围,该语句检查
的“status”
字符串是否设置为free


问题是,当我购买Premium时,广告仍然会显示出来。如何修复它?

检查是否进行了inapp购买:

//*************************************checking in app purchase has been made********************************// 
    void testInApp()
    {
        if (!blnBind) return;
        if (mService == null) return;

        int result;
        try {
            result = mService.isBillingSupported(3, getPackageName(), "inapp");

            //Toast.makeText(context, "isBillingSupported() - success : return " + String.valueOf(result), Toast.LENGTH_SHORT).show();
            Log.i(tag, "isBillingSupported() - success : return " + String.valueOf(result));
        } catch (RemoteException e) {
            e.printStackTrace();

            //Toast.makeText(context, "isBillingSupported() - fail!", Toast.LENGTH_SHORT).show();
            Log.w(tag, "isBillingSupported() - fail!");
            return;
        } 
    }

    void checkInApp()
    {

        if (!blnBind) return;
        if (mService == null) return;

        Bundle ownedItems;
        try {
            ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);

            //Toast.makeText(context, "getPurchases() - success return Bundle", Toast.LENGTH_SHORT).show();
            Log.i(tag, "getPurchases() - success return Bundle");
        } catch (RemoteException e) {
            e.printStackTrace();

            //Toast.makeText(context, "getPurchases - fail!", Toast.LENGTH_SHORT).show();
            Log.w(tag, "getPurchases() - fail!");
            return;
        }

        int response = ownedItems.getInt("RESPONSE_CODE");
        //Toast.makeText(context, "getPurchases() - \"RESPONSE_CODE\" return " + String.valueOf(response), Toast.LENGTH_SHORT).show();
        Log.i(tag, "getPurchases() - \"RESPONSE_CODE\" return " + String.valueOf(response));

        if (response != 0) return;

        ArrayList<String> ownedSkus = ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
        ArrayList<String> purchaseDataList = ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
        ArrayList<String> signatureList = ownedItems.getStringArrayList("INAPP_DATA_SIGNATURE");
        String continuationToken = ownedItems.getString("INAPP_CONTINUATION_TOKEN");

        Log.i(tag, "getPurchases() - \"INAPP_PURCHASE_ITEM_LIST\" return " + ownedSkus.toString());
        Log.i(tag, "getPurchases() - \"INAPP_PURCHASE_DATA_LIST\" return " + purchaseDataList.toString());
        Log.i(tag, "getPurchases() - \"INAPP_DATA_SIGNATURE\" return " + (signatureList != null ? signatureList.toString() : "null"));
        Log.i(tag, "getPurchases() - \"INAPP_CONTINUATION_TOKEN\" return " + (continuationToken != null ? continuationToken : "null"));

        // TODO: management owned purchase  


        try {


            if(purchaseDataList.size()>0){
                jinapp=new JSONArray(purchaseDataList.toString());
                JSONObject c =  jinapp.getJSONObject(0);

                String productid=c.getString("productId");

                if(productid!=null){
                    SharedPreferences.Editor editor = prefpurchase.edit();
                    editor.putBoolean(Constants.APP_IS_PURCHASED,true);
                    editor.commit();
                }
            }   
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // TODO: management owned purchase  

    }
逻辑很简单,您正在创建布局的两个版本,一个有广告,另一个没有广告

根据SharedReference的值加载正确的布局

mService:

在onCreate()之前,在splashscreen中全局编写此代码:

blnBind

全球宣布blnBind:

boolean blnBind;
在Splash活动的onCreate()中写入:

// Bind Service
        blnBind = bindService(new Intent(
                "com.android.vending.billing.InAppBillingService.BIND"),
                mServiceConn, Context.BIND_AUTO_CREATE);

        //Toast.makeText(context, "bindService - return " + String.valueOf(blnBind), Toast.LENGTH_SHORT).show();
        Log.i(tag, "bindService - return " + String.valueOf(blnBind)); 
        //In App Purchase
为共享首选项创建“在应用程序状态下获取”或“已购买应用程序”,作为首选项值的键

//Preferences to check in app purchase
    final static public String GET_IN_APP_STATE = "prefinapp";
    public static final String APP_IS_PURCHASED ="AppIsPurchased";

无论何时进行购买,不要忘记将共享首选项值设置为true。

检查是否进行了inapp购买:

//*************************************checking in app purchase has been made********************************// 
    void testInApp()
    {
        if (!blnBind) return;
        if (mService == null) return;

        int result;
        try {
            result = mService.isBillingSupported(3, getPackageName(), "inapp");

            //Toast.makeText(context, "isBillingSupported() - success : return " + String.valueOf(result), Toast.LENGTH_SHORT).show();
            Log.i(tag, "isBillingSupported() - success : return " + String.valueOf(result));
        } catch (RemoteException e) {
            e.printStackTrace();

            //Toast.makeText(context, "isBillingSupported() - fail!", Toast.LENGTH_SHORT).show();
            Log.w(tag, "isBillingSupported() - fail!");
            return;
        } 
    }

    void checkInApp()
    {

        if (!blnBind) return;
        if (mService == null) return;

        Bundle ownedItems;
        try {
            ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);

            //Toast.makeText(context, "getPurchases() - success return Bundle", Toast.LENGTH_SHORT).show();
            Log.i(tag, "getPurchases() - success return Bundle");
        } catch (RemoteException e) {
            e.printStackTrace();

            //Toast.makeText(context, "getPurchases - fail!", Toast.LENGTH_SHORT).show();
            Log.w(tag, "getPurchases() - fail!");
            return;
        }

        int response = ownedItems.getInt("RESPONSE_CODE");
        //Toast.makeText(context, "getPurchases() - \"RESPONSE_CODE\" return " + String.valueOf(response), Toast.LENGTH_SHORT).show();
        Log.i(tag, "getPurchases() - \"RESPONSE_CODE\" return " + String.valueOf(response));

        if (response != 0) return;

        ArrayList<String> ownedSkus = ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
        ArrayList<String> purchaseDataList = ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
        ArrayList<String> signatureList = ownedItems.getStringArrayList("INAPP_DATA_SIGNATURE");
        String continuationToken = ownedItems.getString("INAPP_CONTINUATION_TOKEN");

        Log.i(tag, "getPurchases() - \"INAPP_PURCHASE_ITEM_LIST\" return " + ownedSkus.toString());
        Log.i(tag, "getPurchases() - \"INAPP_PURCHASE_DATA_LIST\" return " + purchaseDataList.toString());
        Log.i(tag, "getPurchases() - \"INAPP_DATA_SIGNATURE\" return " + (signatureList != null ? signatureList.toString() : "null"));
        Log.i(tag, "getPurchases() - \"INAPP_CONTINUATION_TOKEN\" return " + (continuationToken != null ? continuationToken : "null"));

        // TODO: management owned purchase  


        try {


            if(purchaseDataList.size()>0){
                jinapp=new JSONArray(purchaseDataList.toString());
                JSONObject c =  jinapp.getJSONObject(0);

                String productid=c.getString("productId");

                if(productid!=null){
                    SharedPreferences.Editor editor = prefpurchase.edit();
                    editor.putBoolean(Constants.APP_IS_PURCHASED,true);
                    editor.commit();
                }
            }   
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // TODO: management owned purchase  

    }
逻辑很简单,您正在创建布局的两个版本,一个有广告,另一个没有广告

根据SharedReference的值加载正确的布局

mService:

在onCreate()之前,在splashscreen中全局编写此代码:

blnBind

全球宣布blnBind:

boolean blnBind;
在Splash活动的onCreate()中写入:

// Bind Service
        blnBind = bindService(new Intent(
                "com.android.vending.billing.InAppBillingService.BIND"),
                mServiceConn, Context.BIND_AUTO_CREATE);

        //Toast.makeText(context, "bindService - return " + String.valueOf(blnBind), Toast.LENGTH_SHORT).show();
        Log.i(tag, "bindService - return " + String.valueOf(blnBind)); 
        //In App Purchase
为共享首选项创建“在应用程序状态下获取”或“已购买应用程序”,作为首选项值的键

//Preferences to check in app purchase
    final static public String GET_IN_APP_STATE = "prefinapp";
    public static final String APP_IS_PURCHASED ="AppIsPurchased";

无论何时进行购买,不要忘记将共享首选项值设置为true。

这是因为您正在基本上下文中保存数据,并尝试使用(此)在当前活动上下文中查找数据

此外,查询应用程序内采购项目的一种更推荐的方法是查询应用程序内库存,而不是存储在SharedPref中

正如谷歌文档中提到的

查询采购项目

成功购买后,谷歌Play的应用内计费服务会在本地缓存用户的购买数据。经常查询用户购买的应用内账单服务是一种良好的做法,例如每当应用启动或恢复时,这样用户当前的应用内产品所有权信息总是反映在您的应用中

要从您的应用程序检索用户的购买,请在您的IbaHelper实例上调用queryInventoryAsync(QueryInventoryFinishedListener)。QueryInventoryFinishedListener参数指定在查询操作完成并处理查询响应时通知的侦听器。对你的主线程进行此调用是安全的

mHelper.queryInventoryAsync(mGotInventoryListener); //mHelper is IabHelper instance
如果查询成功,查询结果将存储在库存对象中,并传递回侦听器。应用内计费服务仅返回当前登录到设备的用户帐户进行的购买

IabHelper.QueryInventoryFinishedListener mGotInventoryListener
   = new IabHelper.QueryInventoryFinishedListener() {
   public void onQueryInventoryFinished(IabResult result,
      Inventory inventory) {

      if (result.isFailure()) {
        // handle error here
      }
      else {
        // does the user have the premium upgrade?
        mIsPremium = inventory.hasPurchase(SKU_PREMIUM);
        // update UI accordingly
      }
   }
};

这是因为您正在基本上下文中保存数据,并尝试使用(此)在当前活动上下文中查找数据

此外,查询应用程序内采购项目的一种更推荐的方法是查询应用程序内库存,而不是存储在SharedPref中

正如谷歌文档中提到的

查询采购项目

成功购买后,谷歌Play的应用内计费服务会在本地缓存用户的购买数据。经常查询用户购买的应用内账单服务是一种良好的做法,例如每当应用启动或恢复时,这样用户当前的应用内产品所有权信息总是反映在您的应用中

要从您的应用程序检索用户的购买,请在您的IbaHelper实例上调用queryInventoryAsync(QueryInventoryFinishedListener)。QueryInventoryFinishedListener参数指定在查询操作完成并处理查询响应时通知的侦听器。对你的主线程进行此调用是安全的

mHelper.queryInventoryAsync(mGotInventoryListener); //mHelper is IabHelper instance
如果查询成功,查询结果将存储在库存对象中,并传递回侦听器。应用内计费服务仅返回当前登录到设备的用户帐户进行的购买

IabHelper.QueryInventoryFinishedListener mGotInventoryListener
   = new IabHelper.QueryInventoryFinishedListener() {
   public void onQueryInventoryFinished(IabResult result,
      Inventory inventory) {

      if (result.isFailure()) {
        // handle error here
      }
      else {
        // does the user have the premium upgrade?
        mIsPremium = inventory.hasPurchase(SKU_PREMIUM);
        // update UI accordingly
      }
   }
};

谢谢你的回答。一个问题。什么是blnBind和mService?我应该在哪里获得它?我应该在哪里编写绑定服务器?在启动屏幕的oncreate()或adActivity?除此之外,什么是“constants.in_APP_PURCHASED”?它在哪里声明,应该设置在哪里?谢谢你的回答。一个问题。什么是blnBind和mService?我应该在哪里获得它?我应该在哪里编写绑定服务器?在启动屏幕的oncreate()或adActivity?除此之外,什么是“constants.in_APP_PURCHASED”?它在哪里声明,应该设置在哪里?非常感谢您的回答!我将考虑使用查询代替SyrdPoopy。使用SharedReferences有什么实际的缺点吗?如果由于某些原因自动或手动删除应用程序数据。存储在共享首选项中的数据也将丢失。非常感谢您的回答!我将考虑使用查询代替SyrdPoopy。使用SharedReferences有什么实际的缺点吗?如果由于某些原因自动或手动删除应用程序数据。存储在共享首选项中的数据也将丢失。