public static PaymentIntent fromBitcoinUri(@Nonnull final BitcoinURI bitcoinUri) {
    final Output[] outputs = buildSimplePayTo(bitcoinUri.getAmount(), bitcoinUri.getAddress());
    final String bluetoothMac = (String) bitcoinUri.getParameterByName(Bluetooth.MAC_URI_PARAM);

    return new PaymentIntent(
        PaymentIntent.Standard.BIP21,
        null,
        null,
        outputs,
        bitcoinUri.getLabel(),
        bluetoothMac != null ? "bt:" + bluetoothMac : null,
        null,
        bitcoinUri.getPaymentRequestUrl());
  }
 /**
  * Returns a future that will be notified with a PaymentSession object after it is fetched using
  * the provided uri. uri is a BIP-72-style BitcoinURI object that specifies where the {@link
  * Protos.PaymentRequest} object may be fetched in the r= parameter. If verifyPki is specified and
  * the payment request object specifies a PKI method, then the system trust store will be used to
  * verify the signature provided by the payment request. An exception is thrown by the future if
  * the signature cannot be verified. If trustStorePath is not null, the trust store used for PKI
  * verification will be loaded from the given location instead of using the system default trust
  * store location.
  */
 public static ListenableFuture<PaymentSession> createFromBitcoinUri(
     final BitcoinURI uri, final boolean verifyPki, @Nullable final String trustStorePath)
     throws PaymentRequestException {
   String url = uri.getPaymentRequestUrl();
   if (url == null)
     throw new PaymentRequestException.InvalidPaymentRequestURL(
         "No payment request URL (r= parameter) in BitcoinURI " + uri);
   try {
     return fetchPaymentRequest(new URI(url), verifyPki, trustStorePath);
   } catch (URISyntaxException e) {
     throw new PaymentRequestException.InvalidPaymentRequestURL(e);
   }
 }