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