Android谷歌登录卡在循环中
我正在从Android谷歌登录卡在循环中,android,android-fragments,google-plus,google-play-services,Android,Android Fragments,Google Plus,Google Play Services,我正在从片段实现Google plus登录。 在我的对话中,我得到了一个无限循环的谷歌签名 代码: 活动: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.e("TEST", "requestCode: " + requestCode + ", resultCode: " + resultCode); if (FragmentLogIn.R
片段
实现Google plus登录。
在我的对话中,我得到了一个无限循环的谷歌签名
代码:
活动:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.e("TEST", "requestCode: " + requestCode + ", resultCode: " + resultCode);
if (FragmentLogIn.RC_SIGN_IN == requestCode){
FragmentLogIn fragment = (FragmentLogIn) getSupportFragmentManager().findFragmentById(mainContent.getId());
fragment.onActivityResult(requestCode, resultCode, data);
} else{
super.onActivityResult(requestCode, resultCode, data);
}
}
片段:
@Override
public void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
public void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
/**
* Method to resolve any signin errors
* */
private void resolveSignInError() {
if (mConnectionResult.hasResolution()) {
try {
mIntentInProgress = true;
mConnectionResult.startResolutionForResult(getActivity(), RC_SIGN_IN);
} catch (SendIntentException e) {
mIntentInProgress = false;
mGoogleApiClient.connect();
}
}
}
@Override
public void onActivityResult(int requestCode, int responseCode, Intent intent)
{
Log.e("GOOGLE+", "requestCode: " + requestCode + "responseCode = " + responseCode);
if (requestCode == RC_SIGN_IN) {
if (responseCode != Activity.RESULT_OK) {
mSignInClicked = false;
}
mIntentInProgress = false;
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
}
}
@Override
public void onConnected(Bundle bundle)
{
Log.e("GOOGLE TEST", "onConnected");
//get user info
try{
if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
Person currentPerson = Plus.PeopleApi
.getCurrentPerson(mGoogleApiClient);
String personName = currentPerson.getDisplayName();
String personPhotoUrl = currentPerson.getImage().getUrl();
String personGooglePlusProfile = currentPerson.getUrl();
String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
new RetrieveTokenTask().execute(email);
} else {
Log.e("GOOGLE+", "info = null");
}
} catch (Exception e) {
e.printStackTrace();
}
mSignInClicked = false;
}
@Override
public void onConnectionSuspended(int i)
{
Log.e("GOOGLE TEST", "onConnectionSuspended");
mGoogleApiClient.connect();
}
@Override
public void onConnectionFailed(ConnectionResult result) {
if (!result.hasResolution()) {
GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), getActivity(),
0).show();
return;
}
if (!mIntentInProgress) {
// Store the ConnectionResult for later usage
mConnectionResult = result;
if (mSignInClicked) {
// The user has already clicked 'sign-in' so we attempt to
// resolve all
// errors until the user is signed in, or they cancel.
resolveSignInError();
}
}
}
@Override
public void onClick(View view)
{
if (view.getId() == R.id.google_sign_in_button) {
if (!mGoogleApiClient.isConnecting()) {
mSignInClicked = true;
resolveSignInError();
}
} else if (view.getId() == R.id.google_sign_out_button) {
revokeGplusAccess();
}
}
private class RetrieveTokenTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String accountName = params[0];
Log.e("accountName", accountName);
String scopes = "oauth2:profile "+Scopes.PLUS_LOGIN;;
String token = null;
try {
if (getActivity() != null)
token = GoogleAuthUtil.getToken(getActivity().getApplicationContext(), accountName, scopes);
} catch (IOException e) {
Log.e("GOOGLE+", e.getMessage());
} catch (UserRecoverableAuthException e) {
startActivityForResult(e.getIntent(), 1);
} catch (GoogleAuthException e) {
Log.e("GOOGLE+", e.getMessage());
}
return token;
}
@Override
protected void onPostExecute(String s) {
Log.d("TOKEN", "token: " + s);
}
}
private void revokeGplusAccess() {
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status arg0) {
Log.e("GOOGLE+", "User access revoked!");
mGoogleApiClient.connect();
}
});
}
}
@覆盖
public void onStart(){
super.onStart();
mGoogleApiClient.connect();
}
@凌驾
公共void onStop(){
super.onStop();
if(mgoogleapClient.isConnected()){
mGoogleApiClient.disconnect();
}
}
/**
*方法来解决任何登录错误
* */
私有无效解析错误(){
if(mcConnectionResult.hasResolution()){
试一试{
mIntentInProgress=true;
mcConnectionResult.startResolutionForResult(getActivity(),RC\u SIGN\u IN);
}捕获(发送){
mIntentInProgress=false;
mGoogleApiClient.connect();
}
}
}
@凌驾
ActivityResult上的公共无效(int请求代码、int响应代码、意图)
{
Log.e(“GOOGLE+”,“requestCode:“+requestCode+”responseCode=“+responseCode”);
if(requestCode==RC\u登录){
if(responseCode!=活动结果\u确定){
mSignInClicked=false;
}
mIntentInProgress=false;
如果(!mgoogleapClient.isConnecting()){
mGoogleApiClient.connect();
}
}
}
@凌驾
未连接的公共空间(捆绑包)
{
Log.e(“谷歌测试”、“未连接”);
//获取用户信息
试一试{
if(Plus.PeopleApi.getCurrentPerson(mGoogleApiClient)!=null){
Person currentPerson=Plus.PeopleApi
.getCurrentPerson(MGoogleapClient);
字符串personName=currentPerson.getDisplayName();
字符串personPhotoUrl=currentPerson.getImage().getUrl();
字符串personGooglePlusProfile=currentPerson.getUrl();
字符串email=Plus.AccountApi.getAccountName(mGoogleApiClient);
新建RetrieveTokenTask().execute(电子邮件);
}否则{
Log.e(“GOOGLE+”,“info=null”);
}
}捕获(例外e){
e、 printStackTrace();
}
mSignInClicked=false;
}
@凌驾
公共空间连接暂停(int i)
{
Log.e(“谷歌测试”、“onConnectionSuspended”);
mGoogleApiClient.connect();
}
@凌驾
连接失败的公共void(连接结果){
如果(!result.hasResolution()){
GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(),getActivity(),
0)show();
返回;
}
如果(!mIntentInProgress){
//存储ConnectionResult供以后使用
mConnectionResult=结果;
如果(mSignInClicked){
//用户已单击“登录”,因此我们尝试
//解决所有问题
//错误,直到用户登录或取消。
ResolveSignError();
}
}
}
@凌驾
公共void onClick(视图)
{
if(view.getId()==R.id.google\u登录\u按钮){
如果(!mgoogleapClient.isConnecting()){
mSignInClicked=true;
ResolveSignError();
}
}else if(view.getId()==R.id.google\u注销\u按钮){
revokeGplusAccess();
}
}
私有类RetrieveTokenTask扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串accountName=params[0];
Log.e(“accountName”,accountName);
String scopes=“oauth2:profile”+scopes.PLUS_LOGIN;;
字符串标记=null;
试一试{
如果(getActivity()!=null)
token=GoogleAuthUtil.getToken(getActivity().getApplicationContext(),accountName,scopes);
}捕获(IOE异常){
Log.e(“GOOGLE+”,e.getMessage());
}捕获(UserRecoverableAuthe异常){
startActivityForResult(e.getIntent(),1);
}捕获(googleauthe异常){
Log.e(“GOOGLE+”,e.getMessage());
}
返回令牌;
}
@凌驾
受保护的void onPostExecute(字符串s){
日志d(“令牌”,“令牌:+s”);
}
}
私有void revokeGplusAccess(){
if(mgoogleapClient.isConnected()){
Plus.AccountApi.clearDefaultAccount(mgoogleapClient);
Plus.AccountApi.revokeAccessAndDisconnect(mgoogleAppClient)
.setResultCallback(新的ResultCallback(){
@凌驾
公共void onResult(状态arg0){
Log.e(“谷歌+”,“用户访问权被撤销!”);
mGoogleApiClient.connect();
}
});
}
}
这个代码在活动
中编写时有效,但当我将它切换到片段
时,我得到一个无限循环。
我做错了什么?是否有人使用访问令牌使用Google plus登录的不同示例
谢谢,
Ilan当您在
onStop()
中断开GoogleAppClient
时,无限循环问题就会出现。只能在onDestroy()中执行此操作
希望有帮助。删除该行
if (mSignInClicked) {
// The user has already clicked 'sign-in' so we attempt to
// resolve all
// errors until the user is signed in, or they cancel.
resolveSignInError();
}
从onConnectionFailed(ConnectionResult)
方法,无限循环将不再发生。我应该添加任何日志调用吗?这是我得到的:08-20 16:02:43.923:E/GOOGLE TEST(28215):onConnected 08-20 16:02:43.931:E/accountName(28215):***@gmail.com 08-20 16:02:44.861:D/TOKEN(28215):token:null 08-20 16:02:46.220:E/GOOGLE测试(28215):onConnected 08-20 16:02:46.220:E/accountName(28215):***@gmail.com 08-20 16:02:47.150:D/token(28215):token:null 08-20 16:02:48.978:E/GOOGLE测试(28215):onConnected 08-20 16:02:48.986:E/accountName(28215):***@gmail.com 08-20 16:02:02:49.970:D/token:28215:这是有效的。非常感谢你。我花了很长时间试图解决这个问题。@gellyke我也被困在登录中,你也能帮我吗?