Exemple #1
0
  /*
   * Starts an appropriate intent or dialog for user interaction to resolve
   * the current error preventing the user from being signed in. This could be
   * a dialog allowing the user to select an account, an activity allowing the
   * user to consent to the permissions being requested by your app, a setting
   * to enable device networking, etc.
   */
  private void resolveSignInError() {
    if (mSignInIntent != null) {
      // We have an intent which will allow our user to sign in or
      // resolve an error. For example if the user needs to
      // select an account to sign in with, or if they need to consent
      // to the permissions your app is requesting.

      try {
        // Send the pending intent that we stored on the most recent
        // OnConnectionFailed callback. This will allow the user to
        // resolve the error currently preventing our connection to
        // Google Play services.
        mSignInProgress = STATE_IN_PROGRESS;
        startIntentSenderForResult(mSignInIntent.getIntentSender(), RC_SIGN_IN, null, 0, 0, 0);
      } catch (SendIntentException e) {
        Timber.e(TAG, "Sign in intent could not be sent: " + e.getLocalizedMessage());
        // The intent was canceled before it was sent. Attempt to
        // connect to
        // get an updated ConnectionResult.
        mSignInProgress = STATE_SIGN_IN;
        mGoogleApiClient.connect();
      }
    } else {
      // Google Play services wasn't able to provide an intent for some
      // error types, so we show the default Google Play services error
      // dialog which may still start an intent on our behalf if the
      // user can resolve the issue.
      showDialog(DIALOG_PLAY_SERVICES_ERROR);
    }
  }
  /**
   * Initiate the UI flow for an in-app purchase. Call this method to initiate an in-app purchase,
   * which will involve bringing up the Google Play screen. The calling activity will be paused
   * while the user interacts with Google Play, and the result will be delivered via the activity's
   * {@link android.app.Activity#onActivityResult} method, at which point you must call this
   * object's {@link #handleActivityResult} method to continue the purchase flow. This method MUST
   * be called from the UI thread of the Activity.
   *
   * @param act The calling activity.
   * @param sku The sku of the item to purchase.
   * @param itemType indicates if it's a product or a subscription (ITEM_TYPE_INAPP or
   *     ITEM_TYPE_SUBS)
   * @param requestCode A request code (to differentiate from other responses -- as in {@link
   *     android.app.Activity#startActivityForResult}).
   * @param listener The listener to notify when the purchase process finishes
   * @param extraData Extra data (developer payload), which will be returned with the purchase data
   *     when the purchase completes. This extra data will be permanently bound to that purchase and
   *     will always be returned when the purchase is queried.
   */
  public void launchPurchaseFlow(
      Activity act,
      String sku,
      String itemType,
      int requestCode,
      OnIabPurchaseFinishedListener listener,
      String extraData) {
    checkSetupDone("launchPurchaseFlow");
    flagStartAsync("launchPurchaseFlow");
    IabResult result;

    if (itemType.equals(ITEM_TYPE_SUBS) && !mSubscriptionsSupported) {
      IabResult r =
          new IabResult(IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE, "Subscriptions are not available.");
      if (listener != null) listener.onIabPurchaseFinished(r, null);
      return;
    }

    try {
      logDebug("Constructing buy intent for " + sku + ", item type: " + itemType);
      Bundle buyIntentBundle =
          mService.getBuyIntent(3, mContext.getPackageName(), sku, itemType, extraData);
      int response = getResponseCodeFromBundle(buyIntentBundle);
      if (response != BILLING_RESPONSE_RESULT_OK) {
        logError("Unable to buy item, Error response: " + getResponseDesc(response));

        result = new IabResult(response, "Unable to buy item");
        if (listener != null) listener.onIabPurchaseFinished(result, null);
        return;
      }

      PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);
      logDebug("Launching buy intent for " + sku + ". Request code: " + requestCode);
      mRequestCode = requestCode;
      mPurchaseListener = listener;
      mPurchasingItemType = itemType;
      act.startIntentSenderForResult(
          pendingIntent.getIntentSender(),
          requestCode,
          new Intent(),
          Integer.valueOf(0),
          Integer.valueOf(0),
          Integer.valueOf(0));
    } catch (SendIntentException e) {
      logError("SendIntentException while launching purchase flow for sku " + sku);
      e.printStackTrace();

      result = new IabResult(IABHELPER_SEND_INTENT_FAILED, "Failed to send intent.");
      if (listener != null) listener.onIabPurchaseFinished(result, null);
    } catch (RemoteException e) {
      logError("RemoteException while launching purchase flow for sku " + sku);
      e.printStackTrace();

      result =
          new IabResult(
              IABHELPER_REMOTE_EXCEPTION, "Remote exception while starting purchase flow");
      if (listener != null) listener.onIabPurchaseFinished(result, null);
    }
  }
  public void purchase(final String sku, final String transactionId) {
    Log.d("XXX", "Starting purchase for: " + sku);
    PaymentsCache pc = new PaymentsCache(context);
    Boolean isBlocked = pc.getConsumableFlag("block", sku);
    //		if(isBlocked){
    //			Log.d("XXX", "Is awaiting payment confirmation");
    //			error("Awaiting payment confirmation");
    //			return;
    //		}
    final String hash = transactionId;

    Bundle buyIntentBundle;
    try {
      buyIntentBundle =
          mService.getBuyIntent(
              3, context.getApplicationContext().getPackageName(), sku, "inapp", hash);
    } catch (RemoteException e) {
      //			Log.d("XXX", "Error: " + e.getMessage());
      error(e.getMessage());
      return;
    }
    Object rc = buyIntentBundle.get("RESPONSE_CODE");
    int responseCode = 0;
    if (rc == null) {
      responseCode = PaymentsManager.BILLING_RESPONSE_RESULT_OK;
    } else if (rc instanceof Integer) {
      responseCode = ((Integer) rc).intValue();
    } else if (rc instanceof Long) {
      responseCode = (int) ((Long) rc).longValue();
    }
    //		Log.d("XXX", "Buy intent response code: " + responseCode);
    if (responseCode == 1 || responseCode == 3 || responseCode == 4) {
      canceled();
      return;
    }

    PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
    pc.setConsumableValue("validation_hash", sku, hash);
    try {
      if (context == null) {
        //				Log.d("XXX", "No context!");
      }
      if (pendingIntent == null) {
        //				Log.d("XXX", "No pending intent");
      }
      //			Log.d("XXX", "Starting activity for purchase!");
      context.startIntentSenderForResult(
          pendingIntent.getIntentSender(),
          PaymentsManager.REQUEST_CODE_FOR_PURCHASE,
          new Intent(),
          Integer.valueOf(0),
          Integer.valueOf(0),
          Integer.valueOf(0));
    } catch (SendIntentException e) {
      error(e.getMessage());
    }
  }
Exemple #4
0
  /**
   * Initiate the UI flow for an in-app purchase. Call this method to initiate an in-app purchase,
   * which will involve bringing up the Google Play screen. The calling activity will be paused
   * while the user interacts with Google Play, and the result will be delivered via the activity's
   * {@link android.app.Activity#onActivityResult} method, at which point you must call this
   * object's {@link #handleActivityResult} method to continue the purchase flow. This method MUST
   * be called from the UI thread of the Activity.
   *
   * @param act The calling activity.
   * @param sku The sku of the item to purchase.
   * @param requestCode A request code (to differentiate from other responses -- as in {@link
   *     android.app.Activity#startActivityForResult}).
   * @param listener The listener to notify when the purchase process finishes
   * @param extraData Extra data (developer payload), which will be returned with the purchase data
   *     when the purchase completes. This extra data will be permanently bound to that purchase and
   *     will always be returned when the purchase is queried.
   */
  public void launchPurchaseFlow(
      Activity act,
      String sku,
      int requestCode,
      OnIabPurchaseFinishedListener listener,
      String extraData) {
    checkSetupDone("launchPurchaseFlow");
    flagStartAsync("launchPurchaseFlow");
    IabResult result;

    try {
      logDebug("Constructing buy intent for " + sku);
      Bundle buyIntentBundle =
          mService.getBuyIntent(
              BILLING_API_VERSION, mContext.getPackageName(), sku, ITEM_TYPE_INAPP, extraData);
      int response = getResponseCodeFromBundle(buyIntentBundle);
      if (response != BILLING_RESPONSE_RESULT_OK) {
        logError("Unable to buy item, Error response: " + getResponseDesc(response));

        result = new IabResult(response, "Unable to buy item", requestCode);
        if (listener != null) listener.onIabPurchaseFinished(result, null);
      } else {
        PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);
        logDebug("Launching buy intent for " + sku + ". Request code: " + requestCode);
        SYSLOG("MoSync Launching buy intent for " + sku + ". Request code: " + requestCode);
        mRequestCode = requestCode;
        mPurchaseListener = listener;
        act.startIntentSenderForResult(
            pendingIntent.getIntentSender(),
            requestCode,
            new Intent(Consts.METHOD_REQUEST_PURCHASE),
            0,
            0,
            0);
      }
    } catch (SendIntentException e) {
      logError("SendIntentException while launching purchase flow for sku " + sku);
      SYSLOG("MoSync SendIntentException while launching purchase flow for sku " + sku);
      e.printStackTrace();

      result = new IabResult(IABHELPER_SEND_INTENT_FAILED, "Failed to send intent.", requestCode);
      if (listener != null) listener.onIabPurchaseFinished(result, null);
    } catch (RemoteException e) {
      logError("RemoteException while launching purchase flow for sku " + sku);
      SYSLOG("MoSync RemoteException while launching purchase flow for sku " + sku);
      e.printStackTrace();

      result =
          new IabResult(
              IABHELPER_REMOTE_EXCEPTION,
              "Remote exception while starting purchase flow",
              requestCode);
      if (listener != null) listener.onIabPurchaseFinished(result, null);
    }
  }
  @Override
  public void onConnectionFailed(ConnectionResult result) {
    Log.e(tag, "onConnectionFailed, ConnectionResult is null: " + (result == null));

    if (!mIntentInProgress && result.hasResolution()) {
      try {
        mIntentInProgress = true;
        ((Activity) mContext)
            .startIntentSenderForResult(
                result.getResolution().getIntentSender(), RC_GOOGLE_SIGN_IN, null, 0, 0, 0);
        Log.e(tag, "call startIntentSenderForResult");
      } catch (SendIntentException e) {
        e.printStackTrace();
        mIntentInProgress = false;
        mGoogleApiClient.connect();
      }
    }

    // if (!mIntentInProgress) {
    // if (mSignInClicked && result.hasResolution()) {
    // // The user has already clicked 'sign-in' so we attempt to
    // // resolve all
    // // errors until the user is signed in, or they cancel.
    // try {
    // result.startResolutionForResult(((Activity) context),
    // RC_SIGN_IN);
    // mIntentInProgress = true;
    // } catch (SendIntentException e) {
    // // The intent was canceled before it was sent. Return to the
    // // default
    // // state and attempt to connect to get an updated
    // // ConnectionResult.
    // mIntentInProgress = false;
    // mGoogleApiClient.connect();
    // }
    // }
    // }

    // if (!result.hasResolution()) {
    // Log.d(TAG, "ERROR CODE: " + result.getErrorCode());
    // GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(),
    // (Activity) context, 0).show();
    // return;
    // }
    // if (!mIntentInProgress) {
    // mConnectionResult = result;
    // if (mSignInClicked) {
    // Log.d(TAG, "REsolve in connect fail");
    // resolveSignInError();
    // }
    // }
  }
 @Override
 public void makePurchase(String itemID, Preferences pref) {
   this.pref = pref;
   try {
     Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(), itemID, "inapp", null);
     PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
     startIntentSenderForResult(
         pendingIntent.getIntentSender(),
         1001,
         new Intent(),
         Integer.valueOf(0),
         Integer.valueOf(0),
         Integer.valueOf(0));
   } catch (RemoteException e) {
     e.printStackTrace();
   } catch (SendIntentException e) {
     e.printStackTrace();
   }
 }