代码之家  ›  专栏  ›  技术社区  ›  Coova

Facebook登录/谷歌登录-相同的活动?

  •  5
  • Coova  · 技术社区  · 12 年前

    我正试图让我的用户可以选择登录谷歌或脸书。到目前为止,我找到了一个实现谷歌登录流的例子,但我很困惑是否可以在同一个活动中实现类似的Facebook登录流。

    有人知道如何处理登录吗?我正在考虑潜在地定义一个类来处理Google/Facebook的登录流,也许只是检查一下应用程序启动时使用的是哪个。有什么想法吗?

    public class MainActivity extends Activity implements ConnectionCallbacks,
        OnConnectionFailedListener, OnClickListener, OnAccessRevokedListener {
    
    private static final String TAG = "MainActivity";
    
    // 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;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        // 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.sign_in_button).setOnClickListener(this);
        findViewById(R.id.sign_out_button).setOnClickListener(this);
        findViewById(R.id.sign_out_button).setVisibility(View.GONE);
        findViewById(R.id.authButton).setOnClickListener(this);
    
        // 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) {
        // Yay! We can get the oAuth 2.0 access token we are using.
        Log.v(TAG, "Connected. Yay!");
    
        // 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.sign_in_button).setVisibility(View.GONE);
        findViewById(R.id.sign_out_button).setVisibility(View.VISIBLE);
    
        // 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);
    
        // THIS IS TO CONNECT TO NAVI ACTIVITY AFTER YOU CONNECT Also makes it
        // so you cannot go back to main activity
        /*
         * if (mPlusClient.isConnected()) { Intent intent = new Intent(this,
         * NaviActivity.class); startActivity(intent); } finish();
         */
    }
    
    @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.sign_in_button:
            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.sign_out_button:
            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.sign_in_button).setVisibility(View.VISIBLE);
                findViewById(R.id.sign_out_button).setVisibility(View.GONE);
    
            }
            break;
    
        // THIS SHOULD NOT BE NEEDED, MUST SWITCH ACTIVITIES UPON AUTHORIZATION
        case R.id.authButton:
            Log.v(TAG, "Switch Activities");
    
            if (mPlusClient.isConnected()) {
                Intent intent = new Intent(view.getContext(),
                        NaviActivity.class);
                view.getContext().startActivity(intent);
    
            }
            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.sign_in_button).setVisibility(View.VISIBLE);
        findViewById(R.id.sign_out_button).setVisibility(View.GONE);
    }
    
    /**
     * 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();
        }
    }
     }
    
    1 回复  |  直到 12 年前
        1
  •  4
  •   UrielUVD    12 年前

    在用作登录的布局中设置两个片段(facebook和google),并在另一个布局中设置这两个片段以接收经过验证的会话

    <com.facebook.widget.LoginButton
        android:id="@+id/authButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp" />
    
    <com.google.android.gms.common.SignInButton
    android:id="@+id/sign_in_button"
    android:layout_below="@id/authButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
    

    然后使用每个函数所需的所有函数

    public class MainActivity extends Activity implements ConnectionCallbacks,OnConnectionFailedListener {
    //google
    private PlusClient plusClient;
    private SignInButton btnSignIn;
    private ProgressDialog connectionProgressDialog;
    private ConnectionResult connectionResult;
    private static final int REQUEST_CODE_RESOLVE_ERR = 9000;
    //face
    private LoginButton buttonLoginLogout;
    private UiLifecycleHelper uiHelper;
    static Usuario appusuario;
    static String urldelogin="algo";
    private Session.StatusCallback callback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            onSessionStateChange(session, state, exception);
            if (session.isOpened()) {
                Log.e("usuario", "si hay sesion");
                // make request to the /me API
                Request.newMeRequest(session, new Request.GraphUserCallback() {
    
                    // callback after Graph API response with user object
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                            Log.e("usuario", "si hay usuario");
                            buildUserInfoDisplay(user);
                            //start another activity
                            }
                    }
                }).executeAsync();
            }
        }
    
        private void onSessionStateChange(Session session, SessionState state,
                Exception exception) {
            // TODO Auto-generated method stub
        }
    };
    
    
    @Override
    public void onResume() {
        super.onResume();
        uiHelper.onResume();
    }   
    
    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }   
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_RESOLVE_ERR &&
                resultCode == RESULT_OK)
            {
                connectionResult = null;
                plusClient.connect();
            }
    }   
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }   
    
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }
    public static void buildUserInfoDisplay(GraphUser user) {
    
        appusuario=new Usuario(user.getName(),user.getUsername());
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        uiHelper = new UiLifecycleHelper(this, callback);
        uiHelper.onCreate(savedInstanceState);
        buttonLoginLogout = (LoginButton)findViewById(R.id.authButton);
        buttonLoginLogout.setReadPermissions(Arrays.asList("user_status"));
    
        btnSignIn = (SignInButton)findViewById(R.id.sign_in_button);
        buttonLoginLogout.setVisibility(View.VISIBLE);
        btnSignIn.setVisibility(View.VISIBLE);
        plusClient = new PlusClient.Builder(this, this, this).setActions("http://schemas.google.com/AddActivity", "http://schemas.google.com/BuyActivity")
                .build();
    
        connectionProgressDialog = new ProgressDialog(this);
        connectionProgressDialog.setMessage("Conectando...");
    
        btnSignIn.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View view)
            {
                if (!plusClient.isConnected())
                {
                    if (connectionResult == null)
                    {
                        connectionProgressDialog.show();
                    }
                    else
                    {
                        try
                        {
                            connectionResult.startResolutionForResult(
                                MainActivity.this,
                                REQUEST_CODE_RESOLVE_ERR);
                        }
                        catch (SendIntentException e)
                        {
                            connectionResult = null;
                            plusClient.connect();
                        }
                    }
                }
            }
        });
    
    
    }
    
    @Override
    protected void onStart()
    {
        super.onStart();
        plusClient.connect();
    }
    
    @Override
    protected void onStop()
    {
        super.onStop();
        plusClient.disconnect();
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    
    }
    
     @Override
        public void onConnected(Bundle connectionHint)
        {
            connectionProgressDialog.dismiss();
            //nombre
            String accountName = plusClient.getAccountName();
           //cuenta con mail
            Person accountperson=plusClient.getCurrentPerson();
            String personName = accountperson.getDisplayName();
            Log.e("Google +", "Conectado");
            //start another activity
    
        }
    
        @Override
        public void onDisconnected()
        {
            Log.e("Google +", "Desconectado");
        }
    
        @Override
        public void onConnectionFailed(ConnectionResult result) {
            // TODO Auto-generated method stub
            if (connectionProgressDialog.isShowing())
            {
                if (result.hasResolution())
                {
                    try
                    {
                        result.startResolutionForResult(this,
                            REQUEST_CODE_RESOLVE_ERR);
                    }
                    catch (SendIntentException e)
                    {
                        plusClient.connect();
                    }
                }
            }
            connectionResult = result;
    
        }
          }
    

    在新的活动中放置相同的函数来验证sesion并使用

    if (session.isOpened()) { }
    

    隐藏谷歌登录按钮或

     public void onConnected(Bundle connectionHint)
        {
    
        }
    

    隐藏facebook登录按钮