如何在Android上实现自己的按钮上的Google Plus登录功能

10

你好,我正在尝试学习如何在安卓中实现Google登录功能。我已经完成了这个任务,并且按照预期的方式正常工作。

这里显示了Google+默认按钮进行登录,以下是布局和屏幕截图。

<com.google.android.gms.common.SignInButton
    android:id="@+id/loginGoogleButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    />

图片描述

问题

我不想要这种样式的按钮。我想要像安卓一样简单的按钮。

<Button
    android:id="@+id/loginFaceboookButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:background="@drawable/button_background"
    android:text="@string/login_with_facebook"
    android:textColor="@android:color/white" />

如何使该按钮实现Google登录功能或将com.google.android.gms.common.SignInButton转换为在Android中的普通按钮。

提前致谢。


从 https://developer.android.com/reference/com/google/android/gms/common/SignInButton.html 可以看出,这个按钮仅仅是视觉上的呈现。 - Eugen Martynov
请查看此示例 https://github.com/bharv410/Deploy/blob/master/src/com/kidgeniusdesigns/deployapp/MainActivity.java - Eugen Martynov
4个回答

8
除了法律问题之外,SignInButton实际上没有执行任何特殊功能,它只是一个可视化的小部件。从docs中可以看到:
Google登录按钮用于验证用户身份。请注意,此类仅处理按钮的视觉方面。为了触发操作,请使用setOnClickListener(OnClickListener)注册侦听器。
也就是说,如果您正在运行Google+示例(即使用GoogleApiClient,相关回调,com.google.android.gms.plus中的任何API等),则可以将SignInButton替换为任何其他常规按钮,并且它将正常工作。
关于示例代码:抱歉,从您的问题措辞中我认为您已经成功运行了这一部分。
您可以在此处找到有关G+集成的教程 here,特别是关于登录的部分 this。此外,样例项目作为SDK的一部分被分发(<android-sdk>\extras\google\google_play_services\samples\plus),其中所有内容都已准备就绪(但您需要像链接中描述的那样,在Google开发者控制台中启用API,以使其正常工作)。
然后,您只需用一个普通的按钮来替换 SignInButton

我在哪里可以找到“Google+示例运行”的样本代码(即使用GoogleApiClient、相关回调、来自com.google.android.gms.plus的任何API等)? - N Sharma
@Williams 编辑了答案,希望有帮助。 - matiash
那我不应该创建自己的自定义按钮并在上面实现Google登录功能吗? - N Sharma
@Williams 看起来没有任何理由这样做。而且似乎你实际上是不被允许的。 :-) - matiash
@matiash 我们怎样为我们自己的按钮设置作用域??像这样.. signInButton.setSize(SignInButton.SIZE_STANDARD); signInButton.setScopes(new Scope[]{Plus.SCOPE_PLUS_LOGIN, Plus.SCOPE_PLUS_PROFILE}); signInButton.setOnClickListener(this); - Amit Tumkur

4
https://developers.google.com/+/web/signin/customize上写着:

自定义登录按钮

您可以自定义登录按钮,以便更好地适应您网站的设计。您必须遵循品牌准则并在自定义按钮中使用适当的颜色和图标。您还必须确保您的按钮与其他第三方登录选项具有相同的突出显示。品牌准则还提供了图标资源,您可以使用这些资源来设计自定义按钮。

它链接到品牌准则,其中规定:

这些准则为您提供了各种Google+按钮和徽章的设计规范。您可以在应用程序(网站或移动应用)上使用这些资产,无需预先获得批准,只要您遵循这些基本准则即可。未经Google事先书面同意,不得以本文件未明示涵盖的方式使用Google品牌(有关更多信息,请参见第三方使用Google品牌功能的准则)。按钮使用还必须符合我们的按钮政策。

这基本上意味着您甚至不能使用Google+代码和自己的按钮,除非您获得“书面同意”,这可能很难获得。

(如果您的按钮符合准则,则可以使用“自定义”按钮,但它并不符合准则)。

我不想在我的按钮上采用这种样式。

您基本上必须这样做。
您可以尝试绕过它,但是您的应用程序将无法在Play Store中长期存活,并且您的开发人员帐户可能会面临后果(虽然这是我自己的假设)。


1

实现ConnectionCallbacks、OnConnectionFailedListener,然后设置普通按钮。

btnGoogle.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    if (internetChecker.isConnectingToInternet() == false) {
                        Toast.makeText(getApplicationContext(),getString(R.string.interet_connectivity),Toast.LENGTH_SHORT).show();
                    } else {
                        signInWithGplus();
                    }
} }); /** * 登录谷歌账号 * */ private void signInWithGplus() { if (!mGoogleApiClient.isConnecting()) { mSignInClicked = true; resolveSignInError(); } } protected void onStart() { super.onStart(); mGoogleApiClient.connect(); } protected void onStop() { super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } /** * 解决登录错误的方法 * */ private void resolveSignInError() { try { if (mConnectionResult.hasResolution()) { try { mIntentInProgress = true; mConnectionResult.startResolutionForResult(this, RC_SIGN_IN); } catch (SendIntentException e) { mIntentInProgress = false; mGoogleApiClient.connect(); } } } catch (Exception e) { // TODO: 处理异常 Log.d("error",e.toString()); return; } }

@Override public void onConnectionFailed(ConnectionResult result) { if (!result.hasResolution()) { Log.d("result.toString()", result.toString()); GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this,0).show(); return; } if (!mIntentInProgress) { // 存储 ConnectionResult 以备后用 mConnectionResult = result; if (mSignInClicked) { // 用户已经点击了“登录”,所以我们尝试解决所有错误,直到用户登录或取消。 resolveSignInError(); } } }

@Override public void onConnected(Bundle arg0) { Log.d("onConnected", "onConnected::"+session.getIsRequestLogout()); if (!session.getIsRequestLogout()) { mSignInClicked = false; // 获取用户信息 getGoogleProfileInformation(); // 登录后更新UI

}
else
{
    signOutFromGplus();
}

/** * 获取用户信息:姓名、电子邮件、个人资料图片 * */ private void getGoogleProfileInformation() { try { if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) { Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); GoogleId=currentPerson.getId(); UserName = currentPerson.getDisplayName(); UserEmail = Plus.AccountApi.getAccountName(mGoogleApiClient); /String personName = currentPerson.getDisplayName(); String personPhotoUrl = currentPerson.getImage().getUrl(); String personGooglePlusProfile = currentPerson.getUrl(); String email = Plus.AccountApi.getAccountName(mGoogleApiClient); Log.e("login", "Name: " + personName + ", plusProfile: " + personGooglePlusProfile + ", email: " + email + ", Image: " + personPhotoUrl);/

} else {
Toast.makeText(getApplicationContext(),getString(R.string.google_profile_error), Toast.LENGTH_LONG).show();
            }
} catch (Exception e) {
e.printStackTrace();
        }

}

@Override public void onConnectionSuspended(int arg0) { mGoogleApiClient.connect(); Toast.makeText(getApplicationContext(), getString(R.string.google_suspended_account), Toast.LENGTH_LONG).show(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RC_SIGN_IN) { if (requestCode != RESULT_OK) { mSignInClicked = false; } mIntentInProgress = false; if (!mGoogleApiClient.isConnecting()) { mGoogleApiClient.connect(); } }

在连接中断时,重新连接Google Api客户端,并显示悬浮账户的信息。当请求代码为RC_SIGN_IN时,如果结果不是RESULT_OK,则将mSignInClicked设置为false。如果Google Api客户端未连接,则重新连接。

}

我还有一个问题,请参考此答案Android Google+登录 "发生了内部错误"


-1

使用Play服务进行登录

https://developers.google.com/+/mobile/android/getting-started

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;

public class ExampleActivity extends Activity implements
  ConnectionCallbacks, OnConnectionFailedListener {

 /* Request code used to invoke sign in user interactions. */
 private static final int RC_SIGN_IN = 0;

 /* Client used to interact with Google APIs. */
 private GoogleApiClient mGoogleApiClient;

 /* A flag indicating that a PendingIntent is in progress and prevents
  * us from starting further intents.
   */
  private boolean mIntentInProgress;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .addApi(Plus.API)
    .addScope(Plus.SCOPE_PLUS_LOGIN)
    .build();
  }

 protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
  }

  protected void onStop() {
   super.onStop();

   if (mGoogleApiClient.isConnected()) {
     mGoogleApiClient.disconnect();
  }
  }


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接