我进行了应用内结算活动,在查询购买中成功处理了应用内购买,这确定了是否分配了用户。 adblock。
现在,我想在应用程序活动中的主要活动中运行我的方法,以便我可以在应用程序打开后立即进行查询。但是,当我运行该方法时,我会得到一个nullPointerException,该异常源自boolean adFree = mSharedPreferences.getBoolean(getString(R.string.remove_ads_key), false);
我的看法是,这是由于上下文问题所致,正如我在MainActivity中那样,是从InApp活动中调用方法。尽管我不知道该如何解决此问题,并且希望您能提供任何帮助。
//InApp Activity
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
private Context context;
...
public InApp(Context context){
this.context = context;
}
...
onCreate() {
context = this;
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
mEditor = mSharedPreferences.edit();
}
public void setupBillingClient(Context context){
mBillingClient = BillingClient.newBuilder(context).setListener(this).enablePendingPurchases().build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
Log.i(TAG, "Billing Connected");
List<String> skuList = new ArrayList<>();
skuList.add(ITEM_SKU_ADREMOVAL);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener(){
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null){
Log.i(TAG, "SkuDetailsResponse OK & skuDetailsList !=null - Contains: " + skuDetailsList.toString());
for (SkuDetails skuDetails : skuDetailsList) {
Log.i(TAG, "skuDetails: " + skuDetails.toString());
Log.i(TAG, "skuDetailsList: " + skuDetailsList);
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
skuDetails2 = skuDetails;
Log.i(TAG, "SkuDetailsResponse found sku: " + sku);
if (ITEM_SKU_ADREMOVAL.equals(sku)){
adRemovalPrice = price;
boolean adFree = mSharedPreferences.getBoolean(getString(R.string.remove_ads_key), false);
if (adFree == false){
ad_button.setText(adRemovalPrice);
}
}
}
}
}
});
}else{
Log.i(TAG, "setupBillingClient() ResponseCode: " + billingResult.getResponseCode());
}
//queryPurchases();
}
//MainActivity
static Context context;
...
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
mEditor = mSharedPreferences.edit();
...
onCreate(){
InApp inApp = new InApp(context);
inApp.setupBillingClient(context);
}
您不得直接从其他活动中调用方法,也不能创建它们或对其进行引用。活动是由系统创建和管理的,无论如何都不是POJO。它具有自己的生命周期,可以随时销毁,您无法控制-https://developer.android.com/reference/android/app/Activity#ActivityLifecycle因此,必须主要将应用程序逻辑与框架类分离,并传递它们以利用实际任务。