Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 空对象引用上的BraintreeHttpClient.setBaseUrl(java.lang.String)_Android_Credit Card_Braintree_Braintree Data - Fatal编程技术网

Android 空对象引用上的BraintreeHttpClient.setBaseUrl(java.lang.String)

Android 空对象引用上的BraintreeHttpClient.setBaseUrl(java.lang.String),android,credit-card,braintree,braintree-data,Android,Credit Card,Braintree,Braintree Data,我正在使用braintree api在应用程序中获取用于付款的添加卡。它可以罚款,有时还会随机崩溃 这是我的stacktrace E/AndroidRuntime: FATAL EXCEPTION: Thread-833 Process: cl.tempclick, PID: 29509

我正在使用braintree api在应用程序中获取用于付款的添加卡。它可以罚款,有时还会随机崩溃

这是我的stacktrace

E/AndroidRuntime: FATAL EXCEPTION: Thread-833
                                                          Process: cl.tempclick, PID: 29509
                                                          java.lang.NullPointerException: Attempt to invoke virtual method 'com.braintreepayments.api.internal.HttpClient com.braintreepayments.api.internal.BraintreeHttpClient.setBaseUrl(java.lang.String)' on a null object reference
                                                              at com.braintreepayments.api.BraintreeFragment.setConfiguration(BraintreeFragment.java:488)
                                                              at com.braintreepayments.api.BraintreeFragment$5.onConfigurationFetched(BraintreeFragment.java:415)
                                                              at com.braintreepayments.api.ConfigurationManager.getConfiguration(ConfigurationManager.java:46)
                                                              at com.braintreepayments.api.BraintreeFragment.fetchConfiguration(BraintreeFragment.java:412)
                                                              at com.braintreepayments.api.BraintreeFragment.waitForConfiguration(BraintreeFragment.java:458)
                                                              at com.braintreepayments.api.TokenizationClient.tokenize(TokenizationClient.java:72)
                                                              at com.braintreepayments.api.Card.tokenize(Card.java:29)
                                                              at cl.tk.ui.activities.sub_activity.AddPayment$UIThreadHandler$1.run(AddPayment.java:364)
                                                              at java.lang.Thread.run(Thread.java:818)
这是我的活动代码

package cl.tk.ui.activities.sub_activity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.braintreepayments.api.BraintreeFragment;
import com.braintreepayments.api.exceptions.InvalidArgumentException;
import    com.braintreepayments.api.interfaces.PaymentMethodNonceCreatedListener;
import com.braintreepayments.api.models.CardBuilder;
import com.braintreepayments.api.models.PaymentMethodNonce;

import cl.tk.R;
import cl.tk.controllers.constants.Constants;
import cl.tk.controllers.constants.Enums_String;
import cl.tk.controllers.listeners.ProcessedResult;
import cl.tk.controllers.rest_api.RetrofitAdapters;
import cl.tk.ui.activities.Register;
import cl.tk.ui.fragments.dialog.DTDialog;
import cl.tk.ui.iBAPViews.editext.pattern.PatternedEditText;
import cl.tk.utility.CreditCard;
import cl.tk.utility.CustomException;
import cl.tek.utility.GeneralFunctions;
import cl.tk.utility.MonthYearPicker;
import cl.tk.utility.Validation;
import cl.tk.utility.fonts.FontsManager;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;


public class AddPayment extends AppCompatActivity implements        View.OnClickListener,View.OnTouchListener, ProcessedResult,PaymentMethodNonceCreatedListener
{
private Handler uiThreadHandler;
private TextView tvExpiryDate;
//private EditText edCvv,ed_cardHOlderName,edZip;
private PatternedEditText edCardNumber;
private MonthYearPicker myp;
private String mClientToken=null;
private CreditCard creditCard =null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_payment);

    uiThreadHandler = new UIThreadHandler();
    initialze();

    downloadBraintreeTOken();
}

private void downloadBraintreeTOken()
{
    RetrofitAdapters.get().getBraintreeToken(new Callback<Response>() {
        @Override
        public void success(Response response, Response response2) {
            parseResult(response);
        }

        @Override
        public void failure(RetrofitError error) {
            uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicsCode.HIDEDIALOG);
            Message message = uiThreadHandler.obtainMessage(Constants.ActivityBasicsCode.SHOWTOAST);
            message.obj = error.getLocalizedMessage();
            uiThreadHandler.sendMessage(message);
        }
    });
}

private void initialze()
{
    GeneralFunctions.setToolbarMsgIconHide(this, Constants.ToolbarConstants.PAYMENTS, true);

    Button buttonAdd=GeneralFunctions.findViewByIdAndCast(this,R.id.payment_bt_addCard);
    buttonAdd.setOnClickListener(this);
    GeneralFunctions.setColorSelector(ContextCompat.getColor(this, R.color.color175), ContextCompat.getColor(this, R.color.color1A9), buttonAdd);

    TextView tv_defult=GeneralFunctions.findViewByIdAndCast(this,R.id.payment_ct_default);
    tv_defult.setOnClickListener(this);

    FontsManager.initFormAssets(this, Enums_String.FontsNameLato.SEMIBOLD.toString());
    FontsManager.changeFonts(tv_defult);

    edCardNumber=GeneralFunctions.findViewByIdAndCast(this,R.id.payment_ed_cardNumber);
    tvExpiryDate=GeneralFunctions.findViewByIdAndCast(this,R.id.payment_tv_expiryDate);
    tvExpiryDate.setOnTouchListener(this);

    myp = new MonthYearPicker(this);
    myp.build(new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            tvExpiryDate.setText(myp.getSelectedMonth() + 1 + "/" + myp.getSelectedYear());
        }
    }, null);
}

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter(Enums_String.LocalReceiver.INTERENT.toString());
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
}

@Override
public void onClick(View v) {
    switch (v.getId())
    {
        case R.id.payment_bt_addCard:
            uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicsCode.VALIDATION);
            break;
    }
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_UP)
    {
        if(v.getId()==R.id.payment_tv_expiryDate)
        {
            if(myp.pickerDialog != null && !myp.pickerDialog.isShowing())
                myp.pickerDialog.dismiss();
            myp.show();
        }
        return true;
    }
    return false;
}

@Override
public <IResponse, IMethod, IExtra> void processedResult(IResponse iResponse, IMethod iMethod, IExtra iExtra) {

}


@Override
public <IResponse, IMethod> void processedResult(IResponse iResponse, IMethod iMethod) {
    switch (iMethod.toString())
    {
        case Constants.CallbackConstants.VIEW_ERROR: {
            Message message = uiThreadHandler.obtainMessage(Constants.ActivityBasicsCode.SETERROR);
            message.obj=iResponse;
            uiThreadHandler.sendMessage(message);
        }
        break;
        case Constants.CallbackConstants.BACK:
            finish();
            break;
    }
}

@Override
public void onPaymentMethodNonceCreated(final PaymentMethodNonce paymentMethodNonce) {

}


private void setError(String errorMsg) {
    if (errorMsg.equalsIgnoreCase("cardNumber"))
        GeneralFunctions.setError(null,String.format(getString(R.string.ed_error_invalid),edCardNumber.getTag().toString()),edCardNumber);
    else if (errorMsg.equalsIgnoreCase("cardDate"))
        GeneralFunctions.setError(null,String.format(getString(R.string.ed_error_invalid),tvExpiryDate.getTag().toString()),tvExpiryDate);
}



private class UIThreadHandler extends Handler {
    @Override
    public void handleMessage(Message msg)
    {
        switch (msg.what) {
            case Constants.ActivityBasicsCode.CARDERROR:
                GeneralFunctions.setError((CustomException)msg.obj,null,null);
                break;
            case Constants.ActivityBasicsCode.SETERROR:
                setError(msg.obj.toString());
                break;
            case Constants.ActivityBasicsCode.SHOWTOAST:
            {
                String text=(String)msg.obj;
                GeneralFunctions.showToast(text,AddPayment.this);
            }
            break;
            case Constants.ActivityBasicsCode.HIDEDIALOG:
                GeneralFunctions.hideProgressDialog(Constants.DialogConstants.Transparent, AddPayment.this);
                break;
            case Constants.ActivityBasicsCode.SHOWDIALOG:
            {
                DTDialog dtDialog=DTDialog.newInstance();
                GeneralFunctions.showProgressDialog(dtDialog, Constants.DialogConstants.Transparent, AddPayment.this);
            }break;
            case Constants.ActivityBasicsCode.VALIDATION: {
                new Thread(new Runnable() {
                    @Override
                    public void run()
                    {
                        try {
                            if(Validation.validate(AddPayment.this)) {
                                creditCard = new CreditCard(GeneralFunctions.getText(edCardNumber),GeneralFunctions.getText(tvExpiryDate),AddPayment.this);

                                boolean validation = creditCard.validateCard();
                                if (validation) {
                                    if(mClientToken==null) {
                                        downloadBraintreeTOken();
                                        Message message = uiThreadHandler.obtainMessage(Constants.ActivityBasicsCode.SHOWTOAST);
                                        message.obj = getString(R.string.toast_payment_token);
                                        uiThreadHandler.sendMessage(message);
                                        return;
                                    }
                                    BraintreeFragment braintreeFragment= BraintreeFragment.newInstance(AddPayment.this, mClientToken);

                                    if(null==braintreeFragment)
                                    {
                                        Message message = uiThreadHandler.obtainMessage(Constants.ActivityBasicsCode.SHOWTOAST);
                                        message.obj = getString(R.string.toast_payment_fragment);
                                        uiThreadHandler.sendMessage(message);
                                        uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicsCode.SHOWDIALOG);
                                    }
                                    else {
                                        CardBuilder cardBuilder = new CardBuilder()
                                                .cardNumber(creditCard.getNumber().replaceAll("-", "").trim())
                                                .expirationDate(creditCard.getExpriyDate());
                                        com.braintreepayments.api.Card.tokenize(braintreeFragment, cardBuilder);   //On this line my app crashes randomly
                                    }
                                }
                            }
                        }catch (CustomException e)
                        {
                            Message message = uiThreadHandler.obtainMessage(Constants.ActivityBasicsCode.CARDERROR);
                            message.obj=e;
                            uiThreadHandler.sendMessage(message);
                        } catch (InvalidArgumentException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
                break;
            }
        }
        super.handleMessage(msg);
    }
}
包cl.tk.ui.activities.sub_活动;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.DialogInterface;
导入android.content.Intent;
导入android.content.IntentFilter;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Message;
导入android.support.v4.content.ContextCompat;
导入android.support.v4.content.LocalBroadcastManager;
导入android.support.v7.app.AppActivity;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.Button;
导入android.widget.ImageView;
导入android.widget.TextView;
导入com.braintreepayments.api.BraintreeFragment;
导入com.braintreepayments.api.exceptions.InvalidArgumentException;
导入com.braintreepayments.api.interfaces.PaymentMethodNonCrecatedListener;
导入com.braintreepayments.api.models.CardBuilder;
导入com.braintreepayments.api.models.PaymentMethodNonce;
进口cl.tk.R;
导入cl.tk.controllers.constants.constants;
导入cl.tk.controllers.constants.Enums_字符串;
导入cl.tk.controllers.listeners.ProcessedResult;
导入cl.tk.controllers.rest_api.adapters;
导入cl.tk.ui.activities.Register;
导入cl.tk.ui.fragments.dialog.DTDialog;
导入cl.tk.ui.iBAPViews.editext.pattern.PatternedEditText;
导入cl.tk.utility.CreditCard;
导入cl.tk.utility.CustomException;
导入cl.tek.utility.general函数;
进口cl.tk.utility.MonthYearPicker;
导入cl.tk.utility.Validation;
导入cl.tk.utility.fonts.FontsManager;
进口改装.回收;
导入改装。改装错误;
导入reformation.client.Response;
公共类AddPayment扩展AppCompatActivity实现View.OnClickListener、View.OnTouchListener、ProcessedResult、PaymentMethodNonCrecatedListener
{
私有处理器和线程处理器;
私有文本视图tvExpiryDate;
//私人编辑文本edCvv,ed_持卡人姓名,edZip;
私有模式EditText edCardNumber;
私人蒙蒂耳机myp;
私有字符串mClientToken=null;
私人信用卡信用卡=空;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u add\u payment);
uiThreadHandler=新的uiThreadHandler();
初始化();
下载braintreetoken();
}
私有void下载BraintreeToken()
{
getAdapters.get().getBraintreeToken(新回调()函数){
@凌驾
公共无效成功(响应,响应2){
解析结果(响应);
}
@凌驾
公共无效失败(错误){
uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicCode.HIDEDIALOG);
Message Message=uiThreadHandler.GetainMessage(Constants.ActivityBasicCode.SHOWTOAST);
message.obj=error.getLocalizedMessage();
uiThreadHandler.sendMessage(消息);
}
});
}
私有void initialize()
{
GeneralFunctions.setToolbarMsgIconHide(this,Constants.ToolbarConstants.PAYMENTS,true);
Button buttonAdd=一般功能。FindViewByAndCast(此为R.id.payment\u bt\u addCard);
ButtonAd.setOnClickListener(此);
GeneralFunctions.setColorSelector(ContextCompat.getColor(this,R.color.color175),ContextCompat.getColor(this,R.color.color1A9),按钮添加);
TextView tv_defult=GeneralFunctions.findViewByAndCast(此为R.id.payment_ct_默认值);
tv_defult.setOnClickListener(此);
initFormAssets(这是Enums_String.FontsNameLato.SEMIBOLD.toString());
FontsManager.changeFonts(tv_-defult);
edCardNumber=GeneralFunctions.findViewByAndCast(此为R.id.payment\u ed\u cardNumber);
tvExpiryDate=GeneralFunctions.findViewByAndCast(这个,R.id.payment\u tv\u expiryDate);
tvExpiryDate.setOnTouchListener(此);
myp=新蒙蒂耳机(本);
build(新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
tvExpiryDate.setText(myp.getSelectedMonth()+1+“/”+myp.getSelectedYear());
}
},空);
}
@凌驾
受保护的void onResume(){
super.onResume();
IntentFilter=newintentfilter(Enums_String.LocalReceiver.INTERENT.toString());
LocalBroadcastManager.getInstance(this.registerReceiver(mMessageReceiver,filter);
}
@凌驾
受保护的void onPause(){
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
}
@凌驾
公共void onClick(视图v){
开关(v.getId())
{
案例R.id.payment_bt_addCard:
uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicCode.VALIDATION);
打破
}
}
@凌驾
公共布尔onTouch(视图v,运动事件){
if(event.getAction()==MotionEvent.ACTION\u UP)
{
如果(v.getId()==R.id.payment\u tv\u expiryDate)
{
if(myp.pickerDialog!=null&!myp.pickerDialog.isShowing())
myp.pickerDialog.discover();
myp.show();
}
返回true;
}
返回false;
}
@凌驾
公共无效处理结果(IResponse IResponse,IMethod IMethod,IExtra IExtra){
}
@凌驾
公共无效处理结果(i响应i响应,i方法i方法){
开关(iMethod.toString())
{
case Constants.CallbackConstants.VIEW\u错误:{
Message Message=uiThreadHandler.GetainMessage(Constants.ActivityBasicCode.SETERROR);
message.obj=i响应;
uiThreadHandler.sendMessage(消息);
}
打破
case Constants.CallbackConstants.BACK:
完成();
打破
}
}
@凌驾
付款方式未加密时的公共无效(最终付款方式未加密付款方式未加密){
}
私有void setError(字符串