1

Я пробовал документацию разработчика Google и пытался войти в систему для своего приложения. код копируется из мерзавца с добавлением кодов из documentation. и определены в LoginActivity вGoogle SIgn-In для android

Public class LoginActivity extends AppCompatActivity implements 
    GoogleApiClient.OnConnectionFailedListener, 
    View.OnClickListener { 

private static final String TAG = "* * SignIn * *"; 
private static final int RC_SIGN_IN = 9001; 

private GoogleApiClient mGoogleApiClient; 
private ProgressDialog mProgressDialog; 
Bundle userData = new Bundle(); 
Intent newIntent; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.login); 
    findViewById(R.id.sign_in_button).setOnClickListener(this); 


    // [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] 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 
    // [END build_client] 

    // [START customize_button] 
    SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button); 
    signInButton.setSize(SignInButton.SIZE_STANDARD); 
    signInButton.setScopes(gso.getScopeArray()); 
    // [END customize_button] 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); 
    if (opr.isDone()) { 
     Log.d(TAG, "Got cached sign-in"); 
     GoogleSignInResult result = opr.get(); 
     handleSignInResult(result); 
    } else { 

     showProgressDialog(); 
     opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
      @Override 
      public void onResult(GoogleSignInResult googleSignInResult) { 
       hideProgressDialog(); 
       handleSignInResult(googleSignInResult); 
      } 
     }); 
    } 
} 

// [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); 
    } 
} 
// [END onActivityResult] 

// [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(); 
     userData.putString("Username", acct.getDisplayName()); 
     userData.putString("Email",acct.getEmail()); 
     newIntent = new Intent(LoginActivity.this, MainActivity.class); 
     newIntent.putExtras(userData); 
     startActivity(newIntent); 
     finish(); 
    } else { 
     userData.putString("Username", "Anonymous"); 
     userData.putString("Email","www.example.com"); 
     newIntent = new Intent(LoginActivity.this, MainActivity.class); 
     newIntent.putExtras(userData); 
     startActivity(newIntent); 
     finish(); 
    } 
} 
// [END handleSignInResult] 

// [START signIn] 
private void signIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 
// [END signIn] 





@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
      Log.d(TAG, "onConnectionFailed:" + connectionResult); 
} 

private void showProgressDialog() { 
    if (mProgressDialog == null) { 
     mProgressDialog = new ProgressDialog(this); 
     mProgressDialog.setMessage("Please wait"); 
     mProgressDialog.setIndeterminate(true); 
    } 

    mProgressDialog.show(); 
} 

private void hideProgressDialog() { 
    if (mProgressDialog != null && mProgressDialog.isShowing()) { 
     mProgressDialog.hide(); 
    } 
} 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.sign_in_button: 
      signIn(); 
      break; 

    } 
} 

}

Но я получаю следующее сообщение об ошибке log. в

12-16 23:02:44.074 5545-5545/com.example.www.newapp E/AndroidRuntime: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=40962, result=-1, data=Intent { (has extras) }} 
                    to activity {com.example.www.newapp/com.google.android.gms.auth.api.signin.internal.SignInHubActivity}: 
                    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference 

Мои MainActivity код равен

public class MainActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener, View.OnClickListener { 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    View header = navigationView.getHeaderView(0); 
    userName = (TextView) header.findViewById(R.id.userName); 
    userName.setText(user);//Username recieved through intent 
}} 

При запуске его в эмуляторе он показывает обновление вашего игрового сервиса, это проблема?

+0

Просьба отправить трассировку стека для исключения. –

+0

@qbix log :: http://paste.ubuntu.com/14071857/ –

+0

Очень похожая трассировка стека размещена на этом [вопрос SO] (http://stackoverflow.com/questions/33689689/crash-inside-googlesigninaccount -в-последняя-playservices-8-3). Никакое решение там, кроме комментариев, может оказаться полезным. FWIW - я загрузил и создал [демонстрационное приложение] (https://github.com/googlesamples/google-services/tree/master/android/signin) и без проблем запускал его с помощью Play Service 8.3.0 на устройстве KitKat , –

ответ

2

Ошибка произошла только в эмуляторе в при компиляции с новой игровой службы 8,3 Хотя тестирование на имеющемся оборудовании не показывает каких-либо проблем. Это связано с несоответствием версий игрового сервиса в эмуляторе и API. Надеемся, что они обновят API Google API с помощью новейшей игровой службы и опубликуют некоторое уведомление об этом.

-1

Пока вы звоните signIn() метод, метод не может найти startActivityForResult. где вы получили ошибку.

Вам необходимо @override startActivityForResult для LoginActivity. Добавьте код ниже LoginActivity.

Код:

@Override 
public void startActivityForResult(Intent intent, int requestCode) { 
    super.startActivityForResult(intent, requestCode); 
} 
+0

Я добавил коды, как вы предложили, но все равно такую ​​же ошибку. После того, как я нажму кнопку «Вход в систему», остановится с тем же журналом ошибок –

+0

В документе также не указано ни о чем таком https://developers.google.com/identity/sign-in/android/ –

+2

Этот код ничего не делает, поэтому он не имеет никакого смысла. – rekire

Смежные вопросы