Android 空对象引用上的BraintreeHttpClient.setBaseUrl(java.lang.String)
我正在使用braintree api在应用程序中获取用于付款的添加卡。它可以罚款,有时还会随机崩溃 这是我的stacktraceAndroid 空对象引用上的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
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(字符串