根据来自 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();
}
如何对特定产品进行开机和恢复检查?
我如何使用AnjLab 的 Android In-App-Billing-v3 库在应用程序中禁用广告?
build.gradle模块文件/app依赖{ // 你的各种库 // ... 编译'com.anjlab.android.iab.v3:library:1.0.44' // ... // 你的各种库 编译文件树(包括:['*.jar'],目录:'libs') 测试编译'junit:junit:4.12' }跟踪库的最新发布版本,如果无法访问 GitHub 页面并从那里写出版本号,则可以执行以下操作:
compile 'com.anjlab.android.iab.v3:library:+'Android Studio,将光标放在+Alt + Enter,选择Replace with specific version继续前行 ...
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); } }其他有用信息
Google Play Developer Console您的RSA密钥 -阅读 Google 帮助Google Play Developer Console您的MERCHANT_ID-阅读 Google 帮助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` 中写下我们需要展示广告 } } }// 如果我在某处遗漏了什么,请在对我的回答的评论中告诉我