jjzjj

Android-Sign in via Google plus "An internal error has occured"

coder 2023-11-26 原文

我有这个链接谈论的一些问题: "An internal error occurred" with integration of Google Plus Login 这个链接: Google plus client "An internal error occured" 但最新的对我没用, 在第一个链接中有人建议这个解决方案: 如果您没有在 API 控制台项目中为客户端 ID 设置签名,或者如果您从 keytool 复制了错误的键值,就会发生这种情况

但我按照此链接中的说明设置了客户端 ID 的签名: https://developers.google.com/+/quickstart/android#install-sdk

我通过导出项目生成 SHA1,并从控制台获取 SHA1。

我创建了客户端 ID 并输入了包名和 SHA1

当我按下登录按钮时,我收到了这条 Toast 消息:“发生内部错误”

请问我需要什么办法来解决这个问题

最后这是我的代码

public class GoogleActivity extends Activity implements
ConnectionCallbacks, OnConnectionFailedListener, OnClickListener,
OnAccessRevokedListener, PlusClient.OnPersonLoadedListener {

private static final String TAG = "SignInTestActivity";

// A magic number we will use to know that our sign-in error
// resolution activity has completed.
private static final int OUR_REQUEST_CODE = 49404;

// The core Google+ client.
private PlusClient mPlusClient;

// A flag to stop multiple dialogues appearing for the user.
private boolean mResolveOnFail;

// We can store the connection result from a failed connect()
// attempt in order to make the application feel a bit more
// responsive for the user.
private ConnectionResult mConnectionResult;

// A progress dialog to display when the user is connecting in
// case there is a delay in any of the dialogs being ready.
private ProgressDialog mConnectionProgressDialog;

// Person information.
String firstName,lastName,Nationality,gender,email,birthDay;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_google);
// We pass through this for all three arguments, specifying the:
// 1. Context
// 2. Object to call onConnected and onDisconnected on
// 3. Object to call onConnectionFailed on
mPlusClient = new PlusClient.Builder(this, this, this)
        .setVisibleActivities("http://schemas.google.com/BuyActivity")
        .build();

// We use mResolveOnFail as a flag to say whether we should trigger
// the resolution of a connectionFailed ConnectionResult.
mResolveOnFail = false;

// Connect our sign in, sign out and disconnect buttons.
findViewById(R.id.button1).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
findViewById(R.id.button3).setOnClickListener(this);
findViewById(R.id.button2).setVisibility(View.INVISIBLE);
findViewById(R.id.button3).setVisibility(View.INVISIBLE);

// Configure the ProgressDialog that will be shown if there is a
// delay in presenting the user with the next sign in step.
mConnectionProgressDialog = new ProgressDialog(this);
mConnectionProgressDialog.setMessage("Signing in...");
}

@Override
protected void onStart() {
super.onStart();
Log.v(TAG, "Start");
// Every time we start we want to try to connect. If it
// succeeds we'll get an onConnected() callback. If it
// fails we'll get onConnectionFailed(), with a result!
mPlusClient.connect();
}

@Override
protected void onStop() {
super.onStop();
Log.v(TAG, "Stop");
// It can be a little costly to keep the connection open
// to Google Play Services, so each time our activity is
// stopped we should disconnect.
mPlusClient.disconnect();
}

@Override
public void onConnectionFailed(ConnectionResult result) {
Log.v(TAG, "ConnectionFailed");
// Most of the time, the connection will fail with a
// user resolvable result. We can store that in our
// mConnectionResult property ready for to be used
// when the user clicks the sign-in button.
if (result.hasResolution()) {
    mConnectionResult = result;
    if (mResolveOnFail) {
        // This is a local helper function that starts
        // the resolution of the problem, which may be
        // showing the user an account chooser or similar.
        startResolution();
    }
}
}

@Override
public void onConnected(Bundle bundle) {
//--- We can get the oAuth 2.0 access token we are using.
Log.v(TAG, "Connected.");

// Turn off the flag, so if the user signs out they'll have to
// tap to sign in again.
mResolveOnFail = false;

// Hide the progress dialog if its showing.
mConnectionProgressDialog.dismiss();

// Hide the sign in button, show the sign out buttons.
findViewById(R.id.button1).setVisibility(View.INVISIBLE);
findViewById(R.id.button2).setVisibility(View.VISIBLE);
findViewById(R.id.button3).setVisibility(View.VISIBLE);
String accountName = mPlusClient.getAccountName();

//-- fetch person info
mPlusClient.loadPerson(this, "me");

Toast.makeText(this, accountName + " is connected.", Toast.LENGTH_LONG).show();

// Retrieve the oAuth 2.0 access token.
final Context context = this.getApplicationContext();
AsyncTask task = new AsyncTask() {
    @Override
    protected Object doInBackground(Object... params) {
        String scope = "oauth2:" + Scopes.PLUS_LOGIN;

        try {
            // We can retrieve the token to check via
            // tokeninfo or to pass to a service-side
            // application.
            String token = GoogleAuthUtil.getToken(context,
                    mPlusClient.getAccountName(), scope);
        } catch (UserRecoverableAuthException e) {
            // This error is recoverable, so we could fix this
            // by displaying the intent to the user.
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (GoogleAuthException e) {
            e.printStackTrace();
        }
        return null;
    }
};

task.execute((Void) null);
}

@Override
public void onDisconnected() {
// Bye!
Log.v(TAG, "Disconnected. Bye!");
}

protected void onActivityResult(int requestCode, int responseCode,
    Intent intent) {
Log.v(TAG, "ActivityResult: " + requestCode);
if (requestCode == OUR_REQUEST_CODE && responseCode == RESULT_OK) {
    // If we have a successful result, we will want to be able to
    // resolve any further errors, so turn on resolution with our
    // flag.
    mResolveOnFail = true;
    // If we have a successful result, lets call connect() again. If
    // there are any more errors to resolve we'll get our
    // onConnectionFailed, but if not, we'll get onConnected.
    mPlusClient.connect();
} else if (requestCode == OUR_REQUEST_CODE && responseCode != RESULT_OK) {
    // If we've got an error we can't resolve, we're no
    // longer in the midst of signing in, so we can stop
    // the progress spinner.
    mConnectionProgressDialog.dismiss();
}
}

@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button1:
    Log.v(TAG, "Tapped sign in");
    if (!mPlusClient.isConnected()) {
        // Show the dialog as we are now signing in.
        mConnectionProgressDialog.show();
        // Make sure that we will start the resolution (e.g. fire the
        // intent and pop up a dialog for the user) for any errors
        // that come in.
        mResolveOnFail = true;
        // We should always have a connection result ready to resolve,
        // so we can start that process.
        if (mConnectionResult != null) {
            startResolution();
        } else {
            // If we don't have one though, we can start connect in
            // order to retrieve one.
            mPlusClient.connect();
        }
    }
    break;
case R.id.button2:
    Log.v(TAG, "Tapped sign out");
    // We only want to sign out if we're connected.
    if (mPlusClient.isConnected()) {
        // Clear the default account in order to allow the user
        // to potentially choose a different account from the
        // account chooser.
        mPlusClient.clearDefaultAccount();

        // Disconnect from Google Play Services, then reconnect in
        // order to restart the process from scratch.
        mPlusClient.disconnect();
        mPlusClient.connect();

        // Hide the sign out buttons, show the sign in button.
        findViewById(R.id.button1).setVisibility(View.VISIBLE);
        findViewById(R.id.button2)
                .setVisibility(View.INVISIBLE);
        findViewById(R.id.button3).setVisibility(
                View.INVISIBLE);
    }
    break;
case R.id.button3:
    Log.v(TAG, "Tapped disconnect");
    if (mPlusClient.isConnected()) {
        // Clear the default account as in the Sign Out.
        mPlusClient.clearDefaultAccount();

        // Go away and revoke access to this entire application.
        // This will call back to onAccessRevoked when it is
        // complete as it needs to go away to the Google
        // authentication servers to revoke all token.
        mPlusClient.revokeAccessAndDisconnect(this);
    }
    break;
default:
    // Unknown id.
}
}

@Override
public void onAccessRevoked(ConnectionResult status) {
// mPlusClient is now disconnected and access has been revoked.
// We should now delete any data we need to comply with the
// developer properties. To reset ourselves to the original state,
// we should now connect again. We don't have to disconnect as that
// happens as part of the call.
mPlusClient.connect();

// Hide the sign out buttons, show the sign in button.
findViewById(R.id.button1).setVisibility(View.VISIBLE);
findViewById(R.id.button2).setVisibility(View.INVISIBLE);
findViewById(R.id.button3).setVisibility(View.INVISIBLE);
}

/**
* A helper method to flip the mResolveOnFail flag and start the resolution
* of the ConnenctionResult from the failed connect() call.
*/

private void startResolution() {
try {
    // Don't start another resolution now until we have a
    // result from the activity we're about to start.
    mResolveOnFail = false;
    // If we can resolve the error, then call start resolution
    // and pass it an integer tag we can use to track. This means
    // that when we get the onActivityResult callback we'll know
    // its from being started here.
    mConnectionResult.startResolutionForResult(this, OUR_REQUEST_CODE);
} catch (SendIntentException e) {
    // Any problems, just try to connect() again so we get a new
    // ConnectionResult.
    mPlusClient.connect();
}
}

@Override
public void onPersonLoaded(ConnectionResult status, Person person) {
// TODO Auto-generated method stub

//fetch(status, person);    
try
{
if (status.getErrorCode() == ConnectionResult.SUCCESS) 
{
    Log.d(TAG, "Display Name: " + person.getDisplayName());

    firstName = person.getName().getGivenName();
    Toast.makeText(this, firstName, Toast.LENGTH_LONG).show();

    lastName = person.getName().getFamilyName();
    Toast.makeText(this, lastName, Toast.LENGTH_LONG).show();


    if(person.getGender() == 0)
        gender = "male";
    else if(person.getGender() == 1)
        gender = "female";
    else 
        gender = "other";
    Toast.makeText(this, gender, Toast.LENGTH_LONG).show();


    List<Person.PlacesLived> cites =person.getPlacesLived();
    if(cites!=null)
    {
        Nationality = cites.get(0).toString();
        Toast.makeText(this, Nationality, Toast.LENGTH_LONG).show();
    }
    else
        Toast.makeText(this, "Null Nationality", Toast.LENGTH_LONG).show();

    birthDay = person.getBirthday();
    Toast.makeText(this, birthDay, Toast.LENGTH_LONG).show();

    List<Emails> emails = person.getEmails();
    if(emails !=null)
    {
        email = emails.get(0).getValue();
        Toast.makeText(this, email, Toast.LENGTH_LONG).show();
    }
    else
        Toast.makeText(this, person.getDisplayName(), Toast.LENGTH_LONG).show();

    /*TextView name =(TextView) findViewById(R.id.textView1);
    TextView Gender =(TextView) findViewById(R.id.textView2);
    TextView mail =(TextView) findViewById(R.id.textView3);
    TextView BD =(TextView) findViewById(R.id.textView4);
    TextView Current =(TextView) findViewById(R.id.textView5);

    name.setText(person.getName().getFamilyName());
    Gender.setText(person.getGender());
    mail.setText(person.getEmails().get(0).toString());
    BD.setText(person.getBirthday());
    Current.setText(person.getCurrentLocation());*/

}
else
    Toast.makeText(this, "no result", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
    Toast.makeText(this, "error", Toast.LENGTH_LONG).show();
}
}

最佳答案

我通过从 cmd 而不是从导出文件获取 SHA 解决了这个问题,因为我通过移动设备运行项目而不是通过获取 APK 文件当我应该通过获取 apk 文件运行项目时我必须从导出文件获取 SHA

关于Android-Sign in via Google plus "An internal error has occured",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18503865/

有关Android-Sign in via Google plus "An internal error has occured"的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  5. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  6. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  7. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  8. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  9. ruby - 如何关闭 ruby​​ gem "Spreadsheet?"中的文件 - 2

    下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11

  10. ruby - Ruby 语法糖有 "rules"吗? - 2

    我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d

随机推荐