Google SIgn-In for android [英] Google SIgn-In for android

查看:334
本文介绍了Google SIgn-In for android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试了Google开发者文档,并尝试登录我的应用。
使用文档中添加的代码从git复制代码。
并在 LoginActivity 中定义为

 公共类LoginActivity扩展AppCompatActivity实现
GoogleApiClient.OnConnectionFailedListener,
View.OnClickListener {

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

私有GoogleApiClient mGoogleApiClient;
私人ProgressDialog mProgressDialog;
Bundle userData = new Bundle();
意图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]
//配置登录以请求用户的ID,电子邮件地址和基本
//配置文件。 ID和基本配置文件包含在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,已缓存登录);
GoogleSignInResult result = opr.get();
handleSignInResult(result);
} else {

showProgressDialog();
opr.setResultCallback(新的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);

//从GoogleSignInApi.getSignInIntent(...)启动Intent返回的结果;
if(requestCode == RC_SIGN_IN){
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);


// [END onActivityResult]

// [START句柄SignInResult]
private void handleSignInResult(GoogleSignInResult result){
Log.d(TAG,handleSignInResult:+ result.isSuccess());
if(result.isSuccess()){
//成功登录,显示经过身份验证的用户界面。
GoogleSignInAccount acct = result.getSignInAccount();
userData.putString(用户名,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(){
意图signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent,RC_SIGN_IN);
}
// [END signIn]





@覆盖
public void onConnectionFailed(ConnectionResult connectionResult){
Log.d(TAG,onConnectionFailed:+ connectionResult);

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

mProgressDialog.show();

$ b $ 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();
休息;


$ b $ / code $ / pre>

}



但是我收到以下错误日志

  12-16 23:02:44.074 5545-5545 / com.example.www.newapp E / AndroidRuntime:java.lang。 RuntimeException:提交结果失败ResultInfo {who = null,request = 40962,result = -1,data = Intent {(has extras)}} 
to activity {com.example.www.newapp.com/com.google.android .gms.auth.api.signin.internal.SignInHubActivity}:
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.Class java.lang.Object.getClass()'

My MainActivity 代码为

 公共类MainActivity扩展AppCompatActivity 
实现NavigationView.OnNavigation ItemSelectedListener,View.OnClickListener {
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NavigationView navigationView =(NavigationView)findViewById(R.id.nav_view);
查看标题= navigationView.getHeaderView(0);
userName =(TextView)header.findViewById(R.id.userName);
userName.setText(user); //用户通过意向接收的用户名
}}

在模拟器中运行它时,它显示更新您的播放服务,是否有问题?

解决方案

在使用新播放服务进行编译时8.3
在实际硬件中进行测试时不会出现任何问题。这是由于模拟器和API中播放服务版本的不匹配造成的。
希望他们使用最新的播放服务升级Google API SDK并发布相关通知。


I tried the google developer documentation and tried sign-in for my app. The code is copied from the git with added codes from the documentation. and defined in LoginActivity as

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;

    }
}

}

But I get following error log. as

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

My MainActivity code is as

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
}}

While running it in emulator it shows update your play service, is it a problem?

解决方案

The Error occurred only in emulator in when compiling with new play service 8.3 While testing in actual hardware doesn't show any problem. It is due to the mismatch in the play service versions in emulator and the API. Hope they upgrade the Google API SDK with latest play service and release some notice about it.

这篇关于Google SIgn-In for android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆