安卓 Google+ 登录 "An internal error has occurred"

标签 android google-api google-plus

我正在编写一个允许用户通过 Facebook 或 Google+ 登录的应用程序。我所做的是为登录编写一个接口(interface),以便可以使用任何一个。经过几个小时拼凑他们的文档后,Facebook 登录顺利。另一方面,Google+ 让我感到困惑,或者我只是盯着它看得太久了。我通常可以在 SO 上找到我的问题的解决方案,但我已经花了一天多的时间寻找答案。

我实现了 Getting Started with Google+ Platform逐行。我运行了我的应用程序,我得到了一个页面,要求我批准我的应用程序访问我的 Google+ 帐户。我单击批准,然后我的应用程序崩溃了。 :facepalm: 我没有在控制台中添加 Google+ API。我已经在使用 Google map ,所以我跳过了那部分。

现在发生了什么?我有一个连接尝试的无限循环,导致 Toasts 说“发生内部错误”。我不再看到 Google+ 批准屏幕。我尝试了来自 SO 15762904 的以下解决方案:

  • 生成了一个新的控制台 key (即使 Google map 工作正常)
  • 使用电子邮件和产品名称填写我的同意屏幕
  • 很多答案涉及从已弃用的 PlusClient API 中删除 .setScopes(),此处不适用
  • 仔细检查 Developer Console 中的 SHA 指纹是否与用于生成 API key 的相同
  • 在设备上退出 Google+

这是主要的 Activity 代码。 mSession 是我用于登录 session 的变量。我现在没有按钮设置,我通常在 GUI 之前寻求功能。

private Login mSession;

/**************************************************************************
 * Activity life cycle methods
 **************************************************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Populate the main content
    if (savedInstanceState == null) {
        mSession = new GooglePlusLogin(this);
        mSession.openSession();
    }
}

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

    // Call login session onStart() method
    mSession.onStart();
}

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

    // Call login session onStop() method
    mSession.onStop();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mSession.onActivityResult(requestCode, resultCode, data);

}

这是实现登录界面的 GoogleLogin 类。

public class GooglePlusLogin implements Login, ConnectionCallbacks, OnConnectionFailedListener{

private boolean mIntentInProgress;
private Activity mActivity;
private Context mContext;
private GoogleApiClient mGoogleApiClient;
private String mSessionToken;

public GooglePlusLogin(Activity activity) {
    mGoogleApiClient = null;
    mSessionToken = null;
    mIntentInProgress = false;
    mContext = activity.getApplicationContext();
    mActivity = activity;
}

@Override
public boolean openSession() {
    boolean ret = false;

    Log.d(Helper.TAG, "openSession()");
    try {
        if(null != mContext) {
            Log.d(Helper.TAG, "null != mContext");

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

            Log.d(Helper.TAG, "mPlusClient = " + mGoogleApiClient);

            ret = true;
        }
        else {
            throw new LoginException("GooglePlusLogin context NULL");
        }
    }
    catch(LoginException e) {
        Log.d(Helper.TAG, "" + e.toString());
    }

    Log.d(Helper.TAG, "Returning " + ret);

    return ret;
}

@Override
public void onActivityResult(int reqCode, int respCode, Intent intent) {
    Log.d(Helper.TAG, "onActivityResult()");

    if(Helper.GOOGLE_SIGN_IN == reqCode) {
        mIntentInProgress = false;

        if(!mGoogleApiClient.isConnected()) {
            Log.d(Helper.TAG, "Not connected to Google Services, try again");
            mGoogleApiClient.connect();
        }
        else {
            Log.d(Helper.TAG, "Already connected to Google Services");
        }
    }
}

@Override
public void onStart() {
    Log.d(Helper.TAG, "onStart()");

    mGoogleApiClient.connect();
}

@Override
public void onStop() {
    Log.d(Helper.TAG, "onStop()");
    if(mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

/*************************************************************************
 * Google+ Interface callbacks for GoogleApiClient
 *************************************************************************/
@Override
public void onConnectionFailed(ConnectionResult result) {
    Log.d(Helper.TAG, "onConnectionFailed()");

    if(!mIntentInProgress && result.hasResolution()) {
        try {
            Log.d(Helper.TAG, "Try a Resolution");

            mIntentInProgress = true;

            //mActivity.startIntentSenderForResult(
            //      result.getResolution().getIntentSender(), 
            //      Helper.GOOGLE_SIGN_IN, 
            //      null, 
            //      0, 
            //      0, 
            //      0, 
            //      null
            //      );

            result.startResolutionForResult(mActivity, Helper.GOOGLE_SIGN_IN);
        }
        catch(SendIntentException e) {
            // Intent got canceled during processing, lets try and connect
            // again.
            Log.d(Helper.TAG, "Connect again");

            mIntentInProgress = false;
            mGoogleApiClient.connect();
        }
    }
    else {
        // Something terrible has happened with our connection to 
        // GooglePlay Services
    }
}

@Override
public void onConnected(Bundle connHint) {
    // Do my stuff, but I never get to this point
}

@Override
public void onConnectionSuspended(int arg0) {
    Log.d(Helper.TAG, "onConnectionSuspended()");
    // The connection was suspended... lets try again
    mGoogleApiClient.reconnect();
}

这是我的 AndroidManifest.xml 的相关部分

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"
    />    

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    >

    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/app_id_facebook"
        />
    <meta-data 
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"
        />
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/app_id_google"
        />

这是 logcat 输出:

07-04 11:08:25.354: D/  App(15944): openSession()
07-04 11:08:25.354: D/  App(15944): null != mContext
07-04 11:08:25.364: D/  App(15944): mPlusClient = com.google.android.gms.common.api.b@42238088
07-04 11:08:25.364: D/  App(15944): Returning true
07-04 11:08:25.364: D/  App(15944):  Main AuthToken: null
07-04 11:08:25.364: D/  App(15944): onStart()
07-04 11:08:25.615: D/  App(15944): onConnectionFailed()
07-04 11:08:25.615: D/  App(15944): Try a Resolution
07-04 11:08:27.106: D/  App(15944): onActivityResult()
07-04 11:08:27.106: D/  App(15944): Not connected to Google Services, try again
07-04 11:08:27.176: D/  App(15944): onConnectionFailed()
07-04 11:08:27.176: D/  App(15944): Try a Resolution
07-04 11:08:28.538: D/  App(15944): onActivityResult()
07-04 11:08:28.538: D/  App(15944): Not connected to Google Services, try again
07-04 11:08:28.668: D/  App(15944): onConnectionFailed()
07-04 11:08:28.668: D/  App(15944): Try a Resolution
07-04 11:08:29.248: D/  App(15944): onActivityResult()
07-04 11:08:29.248: D/  App(15944): Not connected to Google Services, try again
07-04 11:08:29.479: D/  App(15944): onConnectionFailed()
07-04 11:08:29.479: D/  App(15944): Try a Resolution
07-04 11:08:30.970: D/  App(15944): onStop()

我希望这是我忽略的简单问题。入门指南中似乎包含一些过时的信息:

  • mGoogleApiClient.addScope(Plus.API, null) 使我的应用崩溃
  • result.getSenderIntent() 不存在,您可以看到我尝试创建 Activity 的两种方式。

非常感谢任何可以提供帮助的人。

最佳答案

我有同样的问题并通过这样做解决。

在 Google API 控制台页面上。

  1. 创建客户 ID
  2. 应用类型应该是安装应用。
  3. 选择 android(如果是 android)并输入你的 sha1 和包名。

现在是重要的部分。

单击下方的 consent screen 进入左侧面板菜单中的 api 并填写信息

你已经完成了。现在运行应用程序。

谢谢

关于安卓 Google+ 登录 "An internal error has occurred",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24577074/

相关文章:

javascript - 将 Google map 街景小人放在标记下方

grails - 需要在Grails中设置Google Plus API的帮助

google-api - 如何使用电子邮件在 Google Plus 中搜索人?

javascript - 尝试在我的网络应用程序上使用 google plus 登录时,不断收到 "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup"

java - Java中如何调用Smali

android - 如何使用联系号码获取whatsapp个人资料图片

android - 不同安卓版本的字体变化

java - 为多个 Activity 创建 GoogleApiClient

python - 谷歌自定义搜索返回不同的结果?

Android 列出私有(private)应用存储中的文件