RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 770202
Accepted
Ruslan  Chepizhko
Ruslan Chepizhko
Asked:2020-01-13 19:22:00 +0000 UTC2020-01-13 19:22:00 +0000 UTC 2020-01-13 19:22:00 +0000 UTC

Android 应用内结算 v3 库

  • 772

根据来自 GitHub 的库:“anjlab/android-inapp-billing-v3”在我的应用程序中实现了禁用广告。

public class HelpActivity extends Activity implements BillingProcessor.IBillingHandler{
    ScrollView scrollView;


    TextView mTextView;
    BillingProcessor bp;
    static final String Off_ADVERTISING = "off_advertising";
    String fileName = "data";
    boolean m_off_advertising = false;
    SharedPreferences sPref;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_help);
        // Убираем панель уведомлений
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        scrollView = (ScrollView)findViewById(R.id.scrollView);


        try {
            readFileXML();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mTextView = (TextView)findViewById(R.id.textView11);

//        String licenseKey = getResources().getString(R.string.license_key);
//        bp = new BillingProcessor(this, licenseKey, this);
        bp = new BillingProcessor(this, null, this);

        mTextView.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("ShowToast")
            @Override
            public void onClick(View v) {
               // bp.purchase(HelpActivity.this, "off_advertising");
                bp.purchase(HelpActivity.this, "android.test.purch");
            }
        });
        if(m_off_advertising){
            //показываем рекламу
            mTextView.setText("не показываем рекламу");

        }
    }

    @Override
    public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) {

        mTextView.setText("Реклама убрана");
        m_off_advertising = true;
        saveData();
    }

    @Override
    public void onPurchaseHistoryRestored() {

//        mTextView.setText("Реклама восстановлена");
//        m_off_advertising = true;
//        saveData();
    }

    @Override
    public void onBillingError(int errorCode, @Nullable Throwable error) {

    }

    @Override
    public void onBillingInitialized() {

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (!bp.handleActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    @Override
    protected void onPause() {
        saveData();
        super.onPause();
    }

    @Override
    protected void onResume() {

        try {
            readFileXML();
        } catch (IOException e) {
            e.printStackTrace();
        }

        super.onResume();
    }

    @Override
    public void onDestroy() {
        saveData();
        if (bp != null) {
            bp.release();
        }
        super.onDestroy();
    }


    void readFileXML() throws IOException {
        this.sPref = getSharedPreferences(this.fileName, 0);
        this.m_off_advertising = this.sPref.getBoolean(Off_ADVERTISING, false);

    }


    void saveData() {
        //Log.d(TAG, "m_off_advertising save " + this.m_off_advertising);
        this.sPref = getSharedPreferences(this.fileName, 0);
        SharedPreferences.Editor ed = this.sPref.edit();
        ed.putBoolean(Off_ADVERTISING, this.m_off_advertising);
        ed.commit();
    }


}

但是有2个但是: 第一:购买后,需要再次点击购买文字,才会显示购买。第二:恢复方法始终有效,并且执行其中写入的所有操作,无需检查产品 ID

 @Override
    public void onPurchaseHistoryRestored() {

//        mTextView.setText("Реклама восстановлена");
//        m_off_advertising = true;
//        saveData();
    }

如何对特定产品进行开机和恢复检查?

android
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Oleksandr.D
    2020-01-13T20:51:50Z2020-01-13T20:51:50Z

    我如何使用AnjLab 的 Android In-App-Billing-v3 库在应用程序中禁用广告?

    1. build.gradle模块文件/app
    依赖{
        // 你的各种库
        // ...
        编译'com.anjlab.android.iab.v3:library:1.0.44'
        // ...
        // 你的各种库
    
        编译文件树(包括:['*.jar'],目录:'libs')
        测试编译'junit:junit:4.12'
    }
    

    跟踪库的最新发布版本,如果无法访问 GitHub 页面并从那里写出版本号,则可以执行以下操作:

    1. compile 'com.anjlab.android.iab.v3:library:+'
    2. 此行将被突出显示Android Studio,将光标放在+
    3. 点击Alt + Enter,选择Replace with specific version

    继续前行 ...

    1. 班级SettingsFrag

    我的应用程序的工作原理是“Activity我将所有 内容Fragment合二为一”。

    包 com.my_best_of_the_best_application_name.ui.fragment;
    
    // **import** 的列表 ...
    
    公共类 SettingsFrag 扩展 Fragment 实现 BillingProcessor.IBillingHandler {
    
        私人布尔广告状态;// 存储当前广告展示状态
        私有布尔初始化;//商店准备购买
        私人 BillingProcessor bp;// 我们处理器的变量
    
        私人 PreferencesManager prefManager; // 使用 SharedPreferences 的类。我决定让自己单独拿出所有的逻辑
        私有资源资源;// 用于处理资源。一旦我们收到并不断转动
        私人切换按钮 tbAdsState;// 按钮
    
        @覆盖
        公共无效onAttach(上下文上下文){
            super.onAttach(上下文);
            this.mContext = 上下文;         
            bp = 新计费处理器(上下文,
                    InAppBillingResources.getRsaKey(), InAppBillingResources.getMerchantId(), this); // 初始化 `BillingProcessor`。`GitHub` 上的文档说,为了防止通过 `freedom` 等应用程序进行虚假购买,您还必须将 `MERCHANT_ID` 传递给 `BillingProcessor` 构造函数。从哪里得到它 - 在当前答案的底部,我将描述步骤
            prefManager = new PreferencesManager(context); // 使用 `SharedPreferences` 的类
            adsStatus = prefManager.getAdsStatus(); // 从 `SharedPreferences` (ON/OFF) 获取保存的广告状态
            资源 = context.getResources(); // 获得对资源的“访问”
        }
    
        @Nullable
        @覆盖
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 容器, @Nullable Bundle savedInstanceState) {
            // 创建设置屏幕的 `View`
            查看 settView = inflater.inflate(R.layout.frag_sett_screen, container, false);
    
            // 其他字段的初始化
            tbAdsState = (ToggleButton) settView.findViewById(R.id.tbAdsState);
            // 其他字段的初始化
    
            // 挂断按钮点击监听器 `ToggleButton`
            tbAdsState.setOnClickListener(new View.OnClickListener() {
                @覆盖
                公共无效 onClick(查看 v){
    
                    // `adsStatus` : 从 `PreferencesManager` 类获取AdsStatus
                    // true - 启用 | 假 - 禁用
                    if (adsStatus && 初始化) {
                        bp.purchase(getActivity(), InAppBillingResources.getSKU_Disable_Ads());
                    }
    
                    如果(!广告状态){
                        tbAdsState.setChecked(false);
                        toast.makeText(getActivity(),
                                getActivity().getResources().getString(R.string.txt_ads_is_already_disabled),
                                Toast.LENGTH_LONG).show();
                    }
    
                }
            });
    
            返回集合视图;
        }
    
        @覆盖
        公共无效 onResume() {
            超级.onResume();
            tbAdsState.setChecked(prefManager.getAdsStatus());
        }
    
        // 告诉用户购买后重启的对话框
        私人无效重启对话(){
            AlertDialog.Builder 生成器;
    
            查看 alertLayout = View.inflate(mContext, R.layout.dialog_restart, null);
            builder = new AlertDialog.Builder(mContext, R.style.AppThemeDialogStyleDark);
    
            builder.setTitle(resources.getString(R.string.msg_notification_Title));
            builder.setView(alertLayout);
            builder.setCancelable(false);
    
            builder.setPositiveButton(resources.getString(R.string.ans_restart),
                    新的 DialogInterface.OnClickListener() {
                        @覆盖
                        public void onClick(DialogInterface dialog, int which) {
                            重新启动应用程序();
                        }
                    });
    
            builder.show();
        }
    
        // 重启应用
        私人无效重新启动应用程序(){
            意图 rIntent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());
            如果(rIntent!= null){
                rIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                mContext.startActivity(rIntent);
            }
        }
    
        // ... 其他类方法
        // [开始计费部分类]
    
        @覆盖
        public void onProductPurchased(@NonNull String productId, TransactionDetails details) {
            // 当请求的 PRODUCT ID 被成功购买时调用
            // 当请求的 PRODUCT ID 购买成功时调用
    
            如果(bp.isPurchased(productId)){
                prefManager.setAdsStatus(false); // 1. 写入 `SharedPreferences` 广告状态 (OFF / false)
                tbAdsState.setChecked(false); // 2. 将 `TogglButton` 设置为适当的状态
                重启对话();// 3. 重新加载应用程序
            } 别的 {
                tbAdsState.setChecked(true); // 否则,如果购买失败,则离开状态(ON / true)
            }
        }
    
        @覆盖
        公共无效 onPurchaseHistoryRestored() {
            //当购买历史恢复时调用,
            // 并且已从 Google Play 下载了所有自有产品 ID 的列表
    
            //案例#2(见下文)
        }
    
        @覆盖
        公共无效 onBillingError(int errorCode, Throwable error) {
            // 发生错误时调用。查看类常量
            // 更多细节
        }
    
        @覆盖
        公共无效 onBillingInitialized() {
            // 当 bp 已初始化并准备好获取时调用
            初始化=真;
        }
        // [结束课程的计费部分]
    
    }
    

    班级InAppBillingResources

    公共类 InAppBillingResources {
    
        私有静态最终字符串 RSA_KEY = "GFGFD156GF1SDF1.... FDS156DS"; // 来自 `Google Play Developer Console` 的 `RSA` 密钥
        私有静态最终字符串 MERCHANT_ID = "16..1511.5..82"; // 您来自 `Google Play Developer Console` 的 `MERCHANT_ID`
        私有静态最终字符串 SKU_DISABLE_ADS = "disable_ads"; // 您的 `product_id`,在 `Google Play Developer Console` 中创建
    
    
        公共静态字符串 getRsaKey() {
            返回 RSA_KEY;
        }
    
        公共静态字符串 getMerchantId() {
            返回 MERCHANT_ID;
        }
    
        公共静态字符串 getSKU_Disable_Ads() {
            返回 SKU_DISABLE_ADS;
        }
    }
    

    班级PreferencesManager

    公共类 PreferencesManager {
    
        私有静态 SharedPreferences mSPref;
        私有 SharedPreferences.Editor mSPEditor;
    
        私有静态最终字符串 APP_PREF = "app_pref"; // 您的应用程序设置文件的名称
    
        私有静态最终字符串 APP_ADS_STATUS = "adsStatus"; // 广告状态
    
        公共首选项管理器(上下文上下文){
            mSPref = context.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE);
        }
    
        公共无效 setAdsStatus(布尔广告状态){
            // 真正启用 | 假 - 禁用
            mSPEditor = mSPref.edit();
            mSPEditor.putBoolean(APP_ADS_STATUS, adsStatus);
            mSPEditor.apply();
        }
    
        公共布尔 getAdsStatus() {
            返回 mSPref.getBoolean(APP_ADS_STATUS, true);
        }
    
    }
    

    其他有用信息

    1. 从哪里获取Google Play Developer Console您的RSA密钥 -阅读 Google 帮助
    2. 从哪里获得Google Play Developer Console您的MERCHANT_ID-阅读 Google 帮助
    3. 恢复方法。您可以在应用的启动活动上实施购买恢复。初始化代码是BillingProcessor一样的。方法onPurchaseHistoryRestored如下
    @覆盖
        公共无效 onPurchaseHistoryRestored() {
            //当购买历史恢复时调用,
            // 并且已从 Google Play 下载了所有自有产品 ID 的列表
    
            // 这样你就可以检查 REQUIRED 购买
            对于(字符串 sku:bp.listOwnedProducts()){
                MyAppLogs.show("拥有的被管理产品:" + sku);
                boolean wasBouhtg = sku.equals(InAppBillingResources.getSKU_Disable_Ads());
                如果(wasBouhtg){
                    // true - 已购买
                    // 写入禁用广告的 `SharedPreferences`
                } 别的 {
                    // false - 未购买
                    // 我们在 `SharedPreferences` 中写下我们需要展示广告
                }
            }
        }
    

    // 如果我在某处遗漏了什么,请在对我的回答的评论中告诉我

    • 13

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5