I am trying to implement IAB in my app. Each time the app starts, the start up fails with:
Problem setting up In-app Billing: IabResult: Billing service unavailable on device. (response: 3:Billing Unavailable)
I've tried literally everything:
com.android.vending.BILLING
permission in the manifest.build.gradle
.But no matter what, the error still persists. I've read all the SO questions & answers about it but I can't figure out what am I missing!
Here is my relevant code:
public class MainActivity extends AppCompatActivity {
IabHelper mHelper;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHelper = new IabHelper(this, Billing.ENCODED_PUBLIC_KEY);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
// Oh noes, there was a problem.
Log.d("LOG", "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
}
});
final SharedPreferences saved_values = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
IabHelper.QueryInventoryFinishedListener mGotInventoryListener
= new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if (result.isFailure()) {
SettingsActivity.premium = saved_values.getBoolean("premium",false);
}
else {
// does the user have the premium upgrade?
SettingsActivity.premium = inventory.hasPurchase(Billing.SKU_PREMIUM);
// update UI accordingly
}
}
};
try{
mHelper.queryInventoryAsync(mGotInventoryListener);
}
catch (Exception e){
SettingsActivity.premium = saved_values.getBoolean("premium",false);
}
}
@Override public void onDestroy() {
super.onDestroy();
if (mHelper != null)
mHelper.dispose();
mHelper = null;
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("LOG", "onActivityResult(" + requestCode + "," + resultCode + "," + data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.i("LOG", "onActivityResult handled by IABUtil.");
}
}
Here is the console output:
03-11 20:35:27.896 710-710/? W/ActivityManager: Permission Denial: getCurrentUser() from pid=14441, uid=10189 requires android.permission.INTERACT_ACROSS_USERS
03-11 20:35:28.516 14441-14441/com.johan.app D/LOG: Problem setting up In-app Billing: IabResult: Billing service unavailable on device. (response: 3:Billing Unavailable)
03-11 20:35:28.516 14441-14441/com.johan.app E/IabHelper: In-app billing error: Illegal state for operation (queryInventory): IAB helper is not set up.
Note that I have code querying the inventory somewhere else, but the fact that it doesn't go beyond mHelper.startUpSetup()
makes it irrelevant.
Try this! Go to the IabHelper
class, in startSetup
method under onServiceConnected
callback you can see an Intent.
Just replace with the below code. (or just Find for BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE
).
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0).isEmpty()) {
// service available to handle that Intent
mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
} else {
// no service available to handle that Intent
if (listener != null) {
listener.onIabSetupFinished(
new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE, "Billing service unavailable on device."));
}
}