2016-04-11 6 views
1

Я внедрил логин Google в своем приложении. Я пытаюсь сохранить данные для входа в систему с использованием общих предпочтений, но я получаю следующие ошибки:Хранение данных для входа в Google с использованием общих предпочтений в андроид-студии

1) java.lang.RuntimeException: Ошибка доставки результата ResultInfo {who = null, request = 0, result = -1, data = Intent {(имеет дополнительные функции)}} к действию

2) java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String java.lang.String.toString()' для ссылки на нулевой объект

SocialLogin.java

package com.studypal.khadija.studypal; 

import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 
import com.facebook.CallbackManager; 
import com.facebook.FacebookCallback; 
import com.facebook.FacebookException; 
import com.facebook.login.LoginManager; 
import com.facebook.login.LoginResult; 
import com.facebook.login.widget.LoginButton; 
import com.google.android.gms.auth.api.Auth; 
import com.google.android.gms.auth.api.signin.GoogleSignInAccount; 
import com.google.android.gms.auth.api.signin.GoogleSignInOptions; 
import com.google.android.gms.auth.api.signin.GoogleSignInResult; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.SignInButton; 
import com.google.android.gms.common.api.GoogleApiClient; 
import java.util.Arrays; 

public class SocialLogin extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener { 
private static final String TAG = SocialLogin.class.getSimpleName(); 
private GoogleApiClient mGoogleApiClient; 
private SignInButton mSignInButton; 
private static final int RC_SIGN_IN = 0; 
private CallbackManager mCallbackManager; 
private LoginButton mFbLoginButton; 
private LoginManager mLoginManager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_social_login); 

    // [START configure_signin] 
    // Configure sign-in to request the user's ID, email address, and basic profile. ID and basic profile are included in DEFAULT_SIGN_IN. 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestEmail() 
      .build(); 
    // [END configure_signin] 

    //[START build_client] 
    // Build a GoogleApiClient with access to the Google Sign-In API and the options specified by gso. 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this, this) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 
    // [END build_client] 

    // [START customize_button] 
    // Customize sign-in button. The sign-in button can be displayed in 
    // multiple sizes and color schemes. It can also be contextually 
    // rendered based on the requested scopes. For example. a red button may 
    // be displayed when Google+ scopes are requested, but a white button 
    // may be displayed when only basic profile is requested. 
    mSignInButton = (SignInButton) findViewById(R.id.sign_in_button); 
    mSignInButton.setSize(SignInButton.SIZE_STANDARD); 
    mSignInButton.setScopes(gso.getScopeArray()); 
    mSignInButton.setOnClickListener(this); //Register button's OnClickListener to sign in the user when clicked 
    // [END customize_button] 

    //Facebook Login 
    mFbLoginButton = (LoginButton) findViewById(R.id.login_button); 
    mLoginManager = LoginManager.getInstance(); 
    mCallbackManager = CallbackManager.Factory.create(); 
    mFbLoginButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      mLoginManager.logInWithReadPermissions(SocialLogin.this, Arrays.asList("public_profile", "email")); 
      mLoginManager.registerCallback(mCallbackManager, 
        new FacebookCallback<LoginResult>() { 
         @Override 
         public void onSuccess(LoginResult loginResult) { 
          Toast.makeText(SocialLogin.this, "Fb Login Success", Toast.LENGTH_SHORT).show(); 
          redirectToHome(); 
         } 

         @Override 
         public void onCancel() { 
          Toast.makeText(SocialLogin.this, "Fb Login Cancel", Toast.LENGTH_SHORT).show(); 
         } 

         @Override 
         public void onError(FacebookException exception) { 
          Toast.makeText(SocialLogin.this, "Fb Login Error", Toast.LENGTH_SHORT).show(); 

         } 
        }); 
     } 
    }); 
} 

// [START onActivityResult] 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
    if (requestCode == RC_SIGN_IN) { 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     handleSignInResult(result); 
    } 

    mCallbackManager.onActivityResult(requestCode, resultCode, data); 
} 
// [END onActivityResult] 

/** 
* Handle Sign In Result 
* @param result 
*/ 

// [START handleSignInResult] 
private void handleSignInResult(GoogleSignInResult result) { 
    Log.d(TAG, "handleSignInResult:" + result.isSuccess()); 
    if (result.isSuccess()) { 
     // Signed in successfully, show authenticated UI. 
     GoogleSignInAccount acct = result.getSignInAccount(); 

     String personName = acct.getDisplayName(); 
     String personEmail = acct.getEmail(); 
     String personId = acct.getId(); 
/*  Uri personPhoto = acct.getPhotoUrl(); 
     String idToken = acct.getIdToken(); 
     mIdTokenTextView.setText("ID Token: " + idToken); 
     */ 
     SharedPreferences sharedPref = getSharedPreferences("userInfo", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor =sharedPref.edit(); 
     editor.putString("username",personName.toString()); 
     editor.putString("email", personEmail.toString()); 
     editor.putString("id",personId.toString()); 
     editor.apply(); 


     Toast.makeText(this, personName+""+personEmail, Toast.LENGTH_SHORT).show(); 
     Toast.makeText(this, "Sign In", Toast.LENGTH_SHORT).show(); 
     redirectToHome(); 
    } else { 
     // Signed out, show unauthenticated UI. 
     Toast.makeText(this, "Sign Out", Toast.LENGTH_SHORT).show(); 
     //mIdTokenTextView.setText("ID Token: null"); 
    } 
} 
// [END handleSignInResult] 

//[START signIn] 
private void signIn() { 
    //Starting the intent prompts the user to select a Google account to sign in with. 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 
//[END signIn] 

@Override 
protected void onResume() { 
    super.onResume(); 
} 
@Override 
protected void onPause() { 
    super.onPause(); 
} 

//Handle sign-in button taps by creating a sign-in intent with the getSignInIntent method, 
//and starting the intent with startActivityForResult. 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.sign_in_button: 
      signIn(); 
      break; 
    } 
} 


@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 

} 

/** 
* 
*/ 
private void redirectToHome() { 
    startActivity(new Intent(SocialLogin.this, NavBaseActivity.class)); 
    finish(); 
} 
} 

Пожалуйста, можно с omeone помогите мне с моим кодом

+0

Проблема не в SharedPreferences, она находится здесь: 'String personName = acct.getDisplayName();' –

+0

@RohitArya В чем проблема с этим? – PersianBlue

+0

проверьте значение null перед сохранением данных или любым преобразованием. например if (acc! = null), тогда if (acct.getDisplayName()! = null) вы можете решить свою проблему .. –

ответ

2

Сначала проверьте, что имя personName, personEmail и personId не равно null, потому что иногда google api не дает никакого значения (означает, что он возвращает нулевое значение).

Затем примените метод personName.toString для изменения в String. (BTW Google уже возвращает все значения в String, то почему вы меняете все значения на String).

Вот код за один раз для входа в аккаунт (пока пользователь не не выход из системы) ---

Сначала сделайте класс SharedPref как ...

public class SharedPrefApp { 

SharedPreferences sharepreferences; 

public static SharedPrefApp instance = null; 

public static SharedPrefApp getInstance() 
{ 

if (instance == null) { 
     synchronized (SharedPrefApp.class) { 
      instance = new SharedPrefApp(); 
     } 
    } 
    return instance; 
    } 
public void saveISLogged_IN(Context context, Boolean isLoggedin) { 
    sharepreferences = PreferenceManager 
      .getDefaultSharedPreferences(context); 
    SharedPreferences.Editor editor = sharepreferences.edit(); 
    editor.putBoolean("IS_LOGIN", isLoggedin); 
    editor.commit(); 
} 

public boolean getISLogged_IN(Context context) { 
    sharepreferences = PreferenceManager 
      .getDefaultSharedPreferences(context); 
    return sharepreferences.getBoolean("IS_LOGIN", false); 
} 

} 

При успешном входе в систему добавить это логин класс ---

SharedPrefApp sharedPref; 
sharedPref = SharedPrefApp.getInstance(); 

    sharedPref.saveISLogged_IN(this, true);//add this on user sucessful login 

Теперь проверьте, что пользователь уже логин или не на странице выплеска приложения или первую страницу, как -----

SharedPrefApp sharedPref; 
sharedPref = SharedPrefApp.getInstance(); 

////

if (sharedPref.getISLogged_IN(SplashActivity.this)) { 
       Intent NextScreen = new Intent(getApplicationContext(), 
         LandingActivity.class); 
       startActivity(NextScreen); 
       finish(); 
      } 
      else{ 
       intent = new Intent(SplashActivity.this, LoginActivity.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(intent); 
       finish(); 

      } 

Еще одна вещи, не забудьте изменить значение для этого, когда выхода пользователя ----

sharedPref.saveISLogged_IN(LandingActivity.this, false); 

Надеется, что это поможет ...

+0

ok done thanks! У меня было еще одно сомнение. Если i SignIn один раз идеально, он не должен просить снова подписать. Но здесь каждый раз, когда я использую приложение, меня просят войти в систему. Как это исправить? – PersianBlue

+0

ok .. Я дам вам код для этой проблемы, и если мой ответ действительно поможет вам, тогда примите мой ответ. Спасибо. –

+0

ok cool .. Thnaks – PersianBlue