Java 可选Pendingreult<;谷歌搜索结果>;总是有原因地抛出非法国家例外”;“结果已被消耗”;
我正在尝试实现谷歌登录,以便使用钱包或支付,并向用户销售产品。我遵循的步骤,我甚至克隆了该项目,它与我的问题相同。问题是,当我试图从Java 可选Pendingreult<;谷歌搜索结果>;总是有原因地抛出非法国家例外”;“结果已被消耗”;,java,android,google-signin,googlesigninapi,Java,Android,Google Signin,Googlesigninapi,我正在尝试实现谷歌登录,以便使用钱包或支付,并向用户销售产品。我遵循的步骤,我甚至克隆了该项目,它与我的问题相同。问题是,当我试图从OptionalPendingreult获取用户信息时,系统会抛出非法状态异常 首先,用户必须通过一个使用GoogleAppClient的活动进行初始化: @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceS
OptionalPendingreult
获取用户信息时,系统会抛出非法状态异常
首先,用户必须通过一个使用GoogleAppClient
的活动进行初始化:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_checkout);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wallet.API, new Wallet.WalletOptions.Builder().build())
.build();
showProgressDialog();
itemInfo = getIntent().getParcelableExtra(Constants.EXTRA_ITEM_INFO);
}
之后,我在一个片段中显示了一个com.google.android.gms.common.SignInButton
,该片段由一个没有GoogleAppClient
的活动托管,我正在该片段上实现:
public class LoginFragment extends Fragment implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
public static final int REQUEST_CODE_PICK_ACCOUNT = 1000;
public static final int REQUEST_CODE_RESOLVE_ERR = 1005;
public static final int REQUEST_CODE_SIGN_IN = 1006;
private static final String TAG = "LoginFragment";
private static final String WALLET_SCOPE = "https://www.googleapis.com/auth/payments.make_payments";
private static final String WALLET_SANDBOX_SCOPE = "https://www.googleapis.com/auth/paymentssandbox.make_payments";
@Bind(R.id.sign_in_button)com.google.android.gms.common.SignInButton button;
private ProgressDialog mProgressDialog;
private GoogleApiClient mGoogleApiClient;
private int mLoginAction;
private String userEmail;
public static LoginFragment newInstance(int intentCode) {
LoginFragment fragment = new LoginFragment();
Bundle args = new Bundle();
args.putInt(LoginActivity.EXTRA_ACTION, intentCode);
fragment.setArguments(args);
return fragment;
}
public LoginFragment() {}
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
mLoginAction = args.getInt(LoginActivity.EXTRA_ACTION);
}
if(savedInstanceState != null) {
userEmail = savedInstanceState.getString("email");
}
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestProfile()
.requestScopes(new Scope(WALLET_SCOPE))
// .requestIdToken(getString(R.string.client_id_test))
.build();
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
@Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.fragment_login, container, false);
ButterKnife.bind(this, v);
button.setSize(SignInButton.SIZE_WIDE);
if(savedInstanceState != null && userEmail.isEmpty())
userEmail = savedInstanceState.getString("email");
button.setClickable(true);
return v;
}
@Override public void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("email", userEmail);
}
@Override public void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
}
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_SIGN_IN:
logIn(data);
button.setClickable(true);
break;
case REQUEST_CODE_PICK_ACCOUNT:
if (resultCode == Activity.RESULT_OK) {
userEmail = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
getUsername();
} else if (resultCode == Activity.RESULT_CANCELED) {
showToast(getString(R.string.please_select_account));
}
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
@Override public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
mGoogleApiClient = null;
}
@OnClick(R.id.sign_in_button) public void onSignIn() {
if(button.isClickable()) {
button.setClickable(false);
Intent intent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(intent, REQUEST_CODE_SIGN_IN);
}
}
@Override public void onConnected(@Nullable Bundle bundle) {
if (mLoginAction == LoginActivity.Action.LOGOUT) {
logOut();
}
}
@Override public void onConnectionSuspended(int i) {}
@Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.e(TAG, "onConnectionFailed, error code:" + connectionResult.getErrorCode());
switch (connectionResult.getErrorCode()) {
case ConnectionResult.SERVICE_DISABLED:
showToast(getString(R.string.error_gps_service_disabled));
break;
case ConnectionResult.SERVICE_INVALID:
showToast(getString(R.string.error_gps_service_invalid));
break;
case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED:
showToast(getString(R.string.error_gps_service_update));
break;
}
}
private void showToast(String message) {
Toast.makeText(getActivity(), "Failed: " + message, Toast.LENGTH_SHORT).show();
}
private void logIn(Intent data) {
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
if (opr.isDone()) {
try {
GoogleSignInResult signInResult = opr.get();
GoogleSignInAccount gsa = signInResult.getSignInAccount();
Toast.makeText(getActivity(), getString(R.string.welcome_user, gsa.getDisplayName()),
Toast.LENGTH_LONG).show();
((MultaJustaApp) getActivity().getApplication()).login(gsa.getEmail(), gsa.getIdToken());
success = true;
} catch (IllegalStateException e) {
e.printStackTrace();
showToast(getString(R.string.error_sign_in));
}
} else {
showToast(getString(R.string.network_error));
}
if(success) {
getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();
}
}
}
公共类LoginFragment扩展片段实现GoogleAppClient.ConnectionCallbacks,
GoogleAppClient.OnConnectionFailedListener{
公共静态最终整数请求\代码\选择\帐户=1000;
公共静态最终整数请求\代码\解析\错误=1005;
公共静态最终整数请求\代码\符号\输入=1006;
私有静态最终字符串TAG=“LoginFragment”;
私有静态最终字符串\u范围=”https://www.googleapis.com/auth/payments.make_payments";
私有静态最终字符串钱包\u沙盒\u范围=”https://www.googleapis.com/auth/paymentssandbox.make_payments";
@绑定(R.id.sign_in_button)com.google.android.gms.common.SignInButton按钮;
private ProgressDialog mProgressDialog;
私人GoogleapClient MGoogleapClient;
私人国际物流;
私人字符串用户电子邮件;
公共静态登录片段newInstance(int intentCode){
LoginFragment片段=新的LoginFragment();
Bundle args=新Bundle();
args.putInt(LoginActivity.EXTRA_ACTION,intentCode);
fragment.setArguments(args);
返回片段;
}
公共登录片段(){}
@在创建时重写公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Bundle args=getArguments();
如果(args!=null){
mLoginAction=args.getInt(LoginActivity.EXTRA_ACTION);
}
如果(savedInstanceState!=null){
userEmail=savedInstanceState.getString(“电子邮件”);
}
GoogleSignenOptions gso=新建GoogleSignenOptions.Builder(GoogleSignenOptions.DEFAULT\u登录)
.requestEmail()
.requestProfile()
.requestScopes(新范围(钱包范围))
//.requestIdToken(getString(R.string.client\u id\u test))
.build();
mgoogleapclient=新的Googleapclient.Builder(getActivity())
.addApi(Auth.GOOGLE\u SIGN\u IN\u API,gso)
.build();
}
@覆盖CreateView上的公共视图(LayoutFlater充气机,@Nullable ViewGroup容器,
@可为空的捆绑包savedInstanceState){
super.onCreateView(充气机、容器、保存状态);
视图v=充气机。充气(R.layout.fragment\u登录,容器,false);
黄油刀。绑定(这个,v);
按钮。设置大小(符号按钮。大小\u宽);
if(savedInstanceState!=null&&userEmail.isEmpty())
userEmail=savedInstanceState.getString(“电子邮件”);
按钮。可点击设置(真);
返回v;
}
@重写公共void onStart(){
super.onStart();
mGoogleApiClient.connect();
}
@覆盖SaveInstanceState上的公共void(束超出状态){
super.onSaveInstanceState(超出状态);
outState.putString(“email”,userEmail);
}
@覆盖顶部的公共void(){
super.onStop();
mGoogleApiClient.disconnect();
}
@重写ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
开关(请求代码){
案例请求、代码、登录:
登录(数据);
按钮。可点击设置(真);
打破
案例请求\代码\提货\账户:
if(resultCode==Activity.RESULT\u确定){
userEmail=data.getStringExtra(AccountManager.KEY\u ACCOUNT\u NAME);
getUsername();
}else if(resultCode==Activity.RESULT\u已取消){
showtoos(getString(R.string.please_select_account));
}
违约:
super.onActivityResult(请求代码、结果代码、数据);
打破
}
}
@重写onDestroyView()中的公共void{
super.onDestroyView();
把(这个)解开;
mgoogleapclient=null;
}
@OnClick(R.id.sign_in_按钮)public void onsign(){
如果(button.isClickable()){
按钮。可点击设置(错误);
Intent Intent=Auth.GoogleSignInApi.getsigninent(mgoogleapclient);
startActivityForResult(意图、请求、代码、登录);
}
}
@覆盖已连接的公共无效(@Nullable Bundle){
if(mLoginAction==LoginActivity.Action.LOGOUT){
注销();
}
}
@覆盖连接挂起(int i){}
@重写OnConnection失败的公共void(@NonNull ConnectionResult ConnectionResult){
Log.e(标记“onConnectionFailed,错误代码:”+connectionResult.getErrorCode());
开关(connectionResult.getErrorCode()){
案例连接Result.SERVICE\u已禁用:
showtoos(getString(R.string.error\u gps\u service\u disabled));
打破
案例连接Result.SERVICE\u无效:
showtoos(getString(R.string.error\u gps\u service\u invalid));
打破
案例连接结果。需要服务版本更新:
showtoos(getString(R.string.error\u gps\u service\u update));
打破
}
}
私有void showtoos(字符串消息){
到
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);