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

时间:2016-08-21 00:48:14

标签: android google-signin

我正在尝试获取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());

}

如果电子邮件帐户没有Google+个人资料,是否有其他方式可以获取Google用户的出生日期?我怀疑我收到此错误,因为此电子邮件帐户可能没有Google+个人资料。

1 个答案:

答案 0 :(得分:0)

如果你这样写了代码怎么办?你是否会惊讶于你得到一个空值?您声明一个具有一个空值的数组,然后将其存储在某些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内的引用。

发生的事情是{/ 1>}在启动下一个片段之后可能被称为,因此还没有数据,但是你继续尝试访问它。

我不知道onResult是什么,但Singleton实例似乎是一种糟糕的方式,但是这是您应该更改代码的方法。

DataContainer