尝试在空对象引用上调用接口方法'boolean com.google.android.gms.plus.model.people.Person.hasNickname()'



我正在尝试获取Google用户的详细信息,例如他们的生日、电子邮件地址、昵称等等。我已经在开发者控制台上启用了Google+ API。当我运行执行此操作的代码时,它崩溃并出现以下错误:

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean com.google.android.gms.plus.model.people.Person.hasNickname()' on a null object reference
                                                                     at Fragments.GoogleSignUpFragment.setupPage(GoogleSignUpFragment.java:93)
                                                                     at Fragments.GoogleSignUpFragment.onCreateView(GoogleSignUpFragment.java:56)
下面是连接到Google+ API的代码:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SIGN_IN_REQUEST) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        GoogleSignInAccount account = result.getSignInAccount(); //Information of account is loaded here
        account.getId();
        final Person[] googlePerson = new Person[1];
        Plus.PeopleApi.load(googleApiClient, account.getId()).setResultCallback(new ResultCallback<People.LoadPeopleResult>() {
            @Override
            public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) {
                googlePerson[0] = loadPeopleResult.getPersonBuffer().get(0);
            }
        });
        DataContainer.getDataContainerInstance().setGoogleSignInAccount(account);
        DataContainer.getDataContainerInstance().setGooglePerson(googlePerson[0]);
        if (account != null ) {
            FragmentManager mgr = getFragmentManager();
            FragmentTransaction transaction = mgr.beginTransaction();
            transaction.replace(R.id.LoginActivityContentArea, new GoogleSignUpFragment(), "GoogleSignUpFragment");
            transaction.addToBackStack("GoogleSignUpFragment");
            transaction.commit();
        }
    }
}

当我尝试将用户详细信息加载到文本视图中的下一个片段时,会发生崩溃:

 private void setupPage()
{
    GoogleSignInAccount account = DataContainer.getDataContainerInstance().getGoogleSignInAccount();
    Person googlePerson = DataContainer.getDataContainerInstance().getGooglePerson();
        if (googlePerson.hasNickname()) {
            username.setText(googlePerson.getNickname());
        }
        dob.setText(googlePerson.getBirthday());
        gender.setText(googlePerson.getGender());
        location.setText(googlePerson.getCurrentLocation());
    name.setText(account.getDisplayName());
    email.setText(account.getEmail());
}

是否有另一种方式获得谷歌用户的出生日期,如果电子邮件帐户没有谷歌+配置文件?我怀疑我得到这个错误,因为这个电子邮件帐户可能没有谷歌+配置文件。

如果像这样编写代码呢?如果你得到一个空值,你会感到惊讶吗?您声明一个具有一个空值的数组,然后将其存储在某个DataContainer中。

final Person[] googlePerson = new Person[1];
DataContainer.getDataContainerInstance().setGoogleSignInAccount(account);
DataContainer.getDataContainerInstance().setGooglePerson(googlePerson[0]);
Plus.PeopleApi.load(googleApiClient, account.getId()).setResultCallback(new ResultCallback<People.LoadPeopleResult>() {
    @Override
    public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) {
        googlePerson[0] = loadPeopleResult.getPersonBuffer().get(0);
    }
});

即使在onResult被调用之后,我不认为它更新了DataContainer内部的引用。

正在发生的事情是onResult可能在之后被称为,您正在开始下一个片段,因此还没有数据,但是您继续并尝试访问它。


我不知道DataContainer是什么,但单例实例似乎是一个糟糕的方式去,但这里是你应该改变你的代码做什么。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SIGN_IN_REQUEST) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        //Information of account is loaded here
        final GoogleSignInAccount account = result.getSignInAccount(); 
        int accountId = account.getId();
        Plus.PeopleApi.load(googleApiClient, accountId).setResultCallback(new ResultCallback<People.LoadPeopleResult>() {
            @Override
            public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) {
                Person p = loadPeopleResult.getPersonBuffer().get(0);
                displayPerson(account, p);
            }
        });
    }
}
public void displayPerson(GoogleSignInAccount account, Person p) {
    DataContainer.getDataContainerInstance().setGoogleSignInAccount(account);  
    DataContainer.getDataContainerInstance().setGooglePerson(p);
    if (account != null ) {
        getFragmentManager()
            .beginTransaction()
            .replace(R.id.LoginActivityContentArea, new GoogleSignUpFragment(), "GoogleSignUpFragment")
            .addToBackStack("GoogleSignUpFragment")
            .commit();
    }
}

最新更新