2015-06-24 21 views
9

Tôi đang cố gắng triển khai API thanh toán trong ứng dụng trong ứng dụng của mình nhưng khi tôi chạy ứng dụng của mình, nó có một ngoại lệ. Đây là lần đầu tiên tôi giao dịch với API thanh toán trong ứng dụng nên các đề xuất sẽ được đánh giá cao. Đây là nhật ký của các ngoại lệ mà tôi nhận được:Trình trợ giúp IAB chưa được thiết lập. Không thể thực hiện thao tác: queryInventory

Process: koemdzhiev.com.quickshoppinglist, PID: 10604 
java.lang.RuntimeException: Unable to start activity ComponentInfo{koemdzhiev.com.quickshoppinglist/koemdzhiev.com.quickshoppinglist.ui.MainActivity}: java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2329) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 
     at android.app.ActivityThread.access$900(ActivityThread.java:147) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
Caused by: java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory 
     at koemdzhiev.com.quickshoppinglist.utils.IabHelper.checkSetupDone(IabHelper.java:782) 
     at koemdzhiev.com.quickshoppinglist.utils.IabHelper.queryInventoryAsync(IabHelper.java:610) 
     at koemdzhiev.com.quickshoppinglist.utils.IabHelper.queryInventoryAsync(IabHelper.java:639) 
     at koemdzhiev.com.quickshoppinglist.ui.MainActivity.queryPurchasedItems(MainActivity.java:187) 
     at koemdzhiev.com.quickshoppinglist.ui.MainActivity.onStart(MainActivity.java:193) 
     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220) 

Mã của tôi vào các hoạt động chính:

public class MainActivity extends AppCompatActivity { 
private static final String TAG = MainActivity.class.getSimpleName(); 
private Toolbar mToolbar; 
private RecyclerView mRecyclerView; 
private ArrayList<String> shoppingListItems; 
private SharedPreferences mSharedPreferences; 
private SharedPreferences.Editor mEditor; 
private TextView mEmptyTextView; 
private ShoppingListAdapter adapter; 
private ActionButton actionButton; 
private MaterialDialog addItemdialog = null; 
private AdView mAdView; 
private IabHelper mHelper; 
private String SKU_REMOVE_ADDS = "remove_adds_sku"; 
private boolean mIsRemoveAdds = false; 
private IabHelper.OnIabPurchaseFinishedListener mPurchasedFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    @Override 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
     if (result.isFailure()) { 
      Log.d(TAG, "Error purchasing: " + result); 
      return; 
     } 
     else if (purchase.getSku().equals(SKU_REMOVE_ADDS)) { 
      // consume the gas and update the UI 
      mIsRemoveAdds = true; 
      mAdView.setVisibility(View.GONE); 
      Toast.makeText(MainActivity.this,"Purchase successful",Toast.LENGTH_LONG).show(); 
     } 
    } 
}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
String publicKey = s1+s2+s3+s4+s5; 

    mHelper = new IabHelper(this,publicKey); 
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     @Override 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       //error 
       Log.d(TAG, "Proglem setting up in-app Billing: " + result); 
      } 
      //Horay, IAB is fully set up! 
      Log.d(TAG, "Horay, IAB is fully set up!"); 
      queryPurchasedItems(); 
     } 
    }); 
private void queryPurchasedItems() { 
    //check if user has bought "remove adds" 
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
     @Override 
     public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
      if (result.isFailure()) { 
       // handle error here 
       Toast.makeText(MainActivity.this,"error",Toast.LENGTH_LONG).show(); 
      } 
      else{ 
       // does the user have the premium upgrade? 
       mIsRemoveAdds = inventory.hasPurchase(SKU_REMOVE_ADDS); 
       if(!mIsRemoveAdds) { 
        Toast.makeText(MainActivity.this,"no premium",Toast.LENGTH_LONG).show(); 
        mAdView = (AdView) findViewById(R.id.adView); 
        AdRequest adRequest = new AdRequest.Builder().build(); 
        mAdView.loadAd(adRequest); 
       }else{ 
        mAdView.setVisibility(View.GONE); 
        Toast.makeText(MainActivity.this,"premium",Toast.LENGTH_LONG).show(); 
       } 

      } 
     } 
    }; 
    mHelper.queryInventoryAsync(mGotInventoryListener); 
} 
@Override 
protected void onStart() { 
    super.onStart(); 
    queryPurchasedItems(); 
    isListEmpty(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    queryPurchasedItems(); 
    isListEmpty(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (mHelper != null) mHelper.dispose(); 
    mHelper = null; 
    mAdView.destroy(); 
} 

Trả lời

19

Cuối cùng sau nhiều giờ thử và lỗi, thử nhiều giải pháp được đề xuất, tôi có toàn bộ công việc và không có ngoại lệ này "Trình trợ giúp IAB không được thiết lập. Không thể thực hiện thao tác: queryInventory" hoặc một điều nữa mà tôi đã nhận được "Không thể bắt đầu hoạt động không đồng bộ (tiêu thụ) vì một hoạt động không đồng bộ (tiêu thụ) đang được tiến hành". Việc đầu tiên mà bạn phải làm là thêm 2 phương thức trong lớp IabHelper.java:

public boolean isAsyncInProgress(){ 
    return mAsyncInProgress; 
} 
public boolean isSetupDone(){ 
    return mSetupDone; 
} 

và hơn đối với hoạt động chính của bạn:

public class MainActivity extends AppCompatActivity { 
private IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
    @Override 
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
     if (result.isFailure()) { 
      // handle error here 
      Toast.makeText(MainActivity.this,"error",Toast.LENGTH_LONG).show(); 
     } 
     else{ 
      // does the user have the premium upgrade? 
      mIsRemoveAdds = inventory.hasPurchase(SKU_REMOVE_ADDS); 
      if(!mIsRemoveAdds) { 
       Toast.makeText(MainActivity.this,"no premium",Toast.LENGTH_LONG).show(); 
       mAdView = (AdView) findViewById(R.id.adView); 
       AdRequest adRequest = new AdRequest.Builder().build(); 
       mAdView.loadAd(adRequest); 
      }else{ 
       mAdView.setVisibility(View.GONE); 
       Toast.makeText(MainActivity.this,"premium",Toast.LENGTH_LONG).show(); 
      } 

     } 
    } 
}; 
private IabHelper.OnIabPurchaseFinishedListener mPurchasedFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    @Override 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
     if (result.isFailure()) { 
      Log.d(TAG, "Error purchasing: " + result); 
      return; 
     } 
     else if (purchase.getSku().equals(SKU_REMOVE_ADDS)) { 
      // consume the gas and update the UI 
      mIsRemoveAdds = true; 
      mAdView.setVisibility(View.GONE); 
      Toast.makeText(MainActivity.this,"Purchase successful",Toast.LENGTH_LONG).show(); 
     } 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
String publicKey = s1+s2+s3+s4+s5; 

    mHelper = new IabHelper(this,publicKey); 
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     @Override 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       //error 
       Log.d(TAG, "Proglem setting up in-app Billing: " + result); 
      } 
      if (result.isSuccess()) { 
       //Horay, IAB is fully set up! 
       Log.d(TAG, "Horay, IAB is fully set up!"); 
       //queryPurchasedItems; 
       mHelper.queryInventoryAsync(mGotInventoryListener); 
      } 
     } 
    }); 

Và bây giờ, khi nó được khuyến khích trong Google guide cho API, chúng tôi phải kiểm tra những mặt hàng mà người dùng đã mua vào khi bắt đầu hoặc tiếp tục phương thức. Ở đây chúng ta sẽ cần 2 phương thức mà chúng ta đã thêm vào trong lớp IabHelper.java.

private void queryPurchasedItems() { 
    //check if user has bought "remove adds" 
    if(mHelper.isSetupDone() && !mHelper.isAsyncInProgress()) { 
     mHelper.queryInventoryAsync(mGotInventoryListener); 
    } 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    queryPurchasedItems(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    queryPurchasedItems(); 
    isListEmpty(); 
} 
1

kiểm tra OnIabSetupFinishedListener của bạn cho (! Result.isSuccess())

nhưng bạn không quay trở lại hoặc hủy bỏ ở đây trong trường hợp sự tái phạm KHÔNG thành công.

Tôi nghĩ rằng mHelper.startSetup của bạn không thành công và bạn không xử lý lỗi này.

+0

Cảm ơn bạn đã bình luận. Tôi biết rằng có vấn đề, điều này là tôi không biết làm thế nào để sửa chữa nó. –

Các vấn đề liên quan