Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可选Pendingreult<;谷歌搜索结果>;总是有原因地抛出非法国家例外”;“结果已被消耗”;_Java_Android_Google Signin_Googlesigninapi - Fatal编程技术网

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);