Google +登录:活动无法启动

时间:2013-05-12 23:07:23

标签: android android-activity actionbarsherlock google-plus

我在项目中使用com.actionbarsherlock.app.SherlockActivity。当我尝试启动另一项活动,我需要在其中进行Google+登录时会发生此错误。我在实际设备上收到此错误,而不是模拟器。你觉得我做错了什么?

错误

05-12 15:58:12.487: E/AndroidRuntime(24310): FATAL EXCEPTION: main
05-12 15:58:12.487: E/AndroidRuntime(24310): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.google.android.gms/com.google.android.gms.plus.activity.AccountSignUpActivity}: java.lang.SecurityException: Must be started via startActivityForResult
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.os.Looper.loop(Looper.java:137)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.app.ActivityThread.main(ActivityThread.java:5041)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at java.lang.reflect.Method.invokeNative(Native Method)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at java.lang.reflect.Method.invoke(Method.java:511)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at dalvik.system.NativeStart.main(Native Method)
05-12 15:58:12.487: E/AndroidRuntime(24310): Caused by: java.lang.SecurityException: Must be started via startActivityForResult
05-12 15:58:12.487: E/AndroidRuntime(24310):    at com.google.android.gms.plus.activity.AccountSignUpActivity.onCreate(AccountSignUpActivity.java:119)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.app.Activity.performCreate(Activity.java:5104)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-12 15:58:12.487: E/AndroidRuntime(24310):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
05-12 15:58:12.487: E/AndroidRuntime(24310):    ... 11 more

LandingActivity.java

public class LandingActivity extends SherlockActivity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
   Intent i = new Intent(getApplicationContext(), SignInActivity.class);
   this.startActivityForResult(i, 1);
 }
}

SignInActivity.java

import com.actionbarsherlock.app.SherlockActivity;
import android.view.View;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
//import com.google.android.gms.common.*;
//import com.google.android.gms.common.GooglePlayServicesClient.*;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
import com.google.android.gms.plus.PlusClient;


/**
 * Example of signing in a user with Google+, and how to make a call to a Google+ API endpoint.
 */
public class SignInActivity extends SherlockActivity
implements View.OnClickListener, ConnectionCallbacks, OnConnectionFailedListener
{
    private static final String TAG = "ExampleActivity";
    private static final int REQUEST_CODE_RESOLVE_ERR = 9000;

    private ProgressDialog mConnectionProgressDialog;
    private PlusClient mPlusClient;
    private ConnectionResult mConnectionResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sign_in_activity);
        findViewById(R.id.sign_in_button_dude).setOnClickListener(this);

        mPlusClient = new PlusClient.Builder(this, this, this).build();
        //.setVisibleActivities("http://schemas.google.com/AddActivity", "http://schemas.google.com/BuyActivity")
        // Progress bar to be displayed if the connection failure is not resolved.
        mConnectionProgressDialog = new ProgressDialog(this);
        mConnectionProgressDialog.setMessage("Signing in...");
    }

    @Override
    protected void onStart() {
        super.onStart();
        mPlusClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mPlusClient.disconnect();
    }

    public void onConnectionFailed(ConnectionResult result) {
        if (result.hasResolution()) {
            try {
                result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
            } catch (SendIntentException e) {
                mPlusClient.connect();
            }
        }
        // Save the result and resolve the connection failure upon a user click.
        mConnectionResult = result;
    }

    @Override
    protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
        if (requestCode == REQUEST_CODE_RESOLVE_ERR && responseCode == RESULT_OK) {
            mConnectionResult = null;
            mPlusClient.connect();
        }
    }

    public void onConnected() {
        String accountName = mPlusClient.getAccountName();
        //mConnectionProgressDialog.dismiss(); //https://developers.google.com/+/mobile/android/sign-in
        Toast.makeText(this, accountName + " is connected.", Toast.LENGTH_LONG).show();
        //Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
    }

    public void onDisconnected() {
        Log.d(TAG, "disconnected");
    }

    public void onClick(View view) {
        if (view.getId() == R.id.sign_in_button_dude && !mPlusClient.isConnected()) {
            if (mConnectionResult == null) {
                mConnectionProgressDialog.show();
            } else {
                try {
                    mConnectionResult.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
                } catch (SendIntentException e) {
                    // Try connecting again.
                    mConnectionResult = null;
                    mPlusClient.connect();
                }
            }
        }
    }
}

我也尝试过使用“setScopes(Scopes.PLUS_LOGIN)”,但遇到了同样的问题。

import com.google.android.gms.common.Scopes;
// in onCreate()
mPlusClient = new PlusClient.Builder(this, this, this).setScopes(Scopes.PLUS_LOGIN).build();

我也试过启动keytool ....需要androiddebugkey吗? https://developers.google.com/+/mobile/android/getting-started

 C:\repos>c:\java\jdk1.6.0_34\bin\keytool.exe -exportcert -alias androiddebugkey -keystore agoyal-release-key.keystore -list -v
 Enter keystore password:
 keytool error: java.lang.Exception: Alias <androiddebugkey> does not exist
    java.lang.Exception: Alias <androiddebugkey> does not exist
    at sun.security.tools.KeyTool.doPrintEntry(KeyTool.java:1339)
    at sun.security.tools.KeyTool.doCommands(KeyTool.java:869)
    at sun.security.tools.KeyTool.run(KeyTool.java:172)
    at sun.security.tools.KeyTool.main(KeyTool.java:166)

2 个答案:

答案 0 :(得分:1)

对于keytool命令,如果你使用自己的释放键,别名应该是你的密钥使用的,而不是“androiddebugkey”。

答案 1 :(得分:0)

有些东西不对,你确定这是正确的logcat输出吗?

使用您的代码,您应该获得android.app.SuperNotCalledException: Activity {LandingActivity} did not call through to super.onCreate()例外,而不是您显示的错误。

此外,public onConnected()中的SignInActivity方法签名不正确。正确的应该是public onConnected(Bundle connectionHint)。您的应用可能无法正确编译。