/** * Full authorize method. * * <p>Starts either an Activity or a dialog which prompts the user to log in to Facebook and grant * the requested permissions to the given application. * * <p>This method will, when possible, use Facebook's single sign-on for Android to obtain an * access token. This involves proxying a call through the Facebook for Android stand-alone * application, which will handle the authentication flow, and return an OAuth access token for * making API calls. * * <p>Because this process will not be available for all users, if single sign-on is not possible, * this method will automatically fall back to the OAuth 2.0 User-Agent flow. In this flow, the * user credentials are handled by Facebook in an embedded WebView, not by the client application. * As such, the dialog makes a network request and renders HTML content rather than a native UI. * The access token is retrieved from a redirect to a special URL that the WebView handles. * * <p>Note that User credentials could be handled natively using the OAuth 2.0 Username and * Password Flow, but this is not supported by this SDK. * * <p>See http://developers.facebook.com/docs/authentication/ and http://wiki.oauth.net/OAuth-2 * for more details. * * <p>Note that this method is asynchronous and the callback will be invoked in the original * calling thread (not in a background thread). * * <p>Also note that requests may be made to the API without calling authorize first, in which * case only public information is returned. * * <p>IMPORTANT: Note that single sign-on authentication will not function correctly if you do not * include a call to the authorizeCallback() method in your onActivityResult() function! Please * see below for more information. single sign-on may be disabled by passing FORCE_DIALOG_AUTH as * the activityCode parameter in your call to authorize(). * * @param activity The Android activity in which we want to display the authorization dialog. * @param applicationId The Facebook application identifier e.g. "350685531728" * @param permissions A list of permissions required for this application: e.g. "read_stream", * "publish_stream", "offline_access", etc. see * http://developers.facebook.com/docs/authentication/permissions This parameter should not be * null -- if you do not require any permissions, then pass in an empty String array. * @param activityCode Single sign-on requires an activity result to be called back to the client * application -- if you are waiting on other activities to return data, pass a custom * activity code here to avoid collisions. If you would like to force the use of legacy * dialog-based authorization, pass FORCE_DIALOG_AUTH for this parameter. Otherwise just omit * this parameter and Facebook will use a suitable default. See * http://developer.android.com/reference/android/ app/Activity.html for more information. * @param listener Callback interface for notifying the calling application when the * authentication dialog has completed, failed, or been canceled. */ public void authorize( Activity activity, String[] permissions, int activityCode, final DialogListener listener) { boolean singleSignOnStarted = false; mAuthDialogListener = listener; // Prefer single sign-on, where available. if (activityCode >= 0) { singleSignOnStarted = startSingleSignOn(activity, mAppId, permissions, activityCode); } // Otherwise fall back to traditional dialog. if (!singleSignOnStarted) { startDialogAuth(activity, permissions); } }
/** * Full authorize method. * * <p>Starts either an Activity or a dialog which prompts the user to log in to Facebook and grant * the requested permissions to the given application. * * <p>This method will, when possible, use Facebook's single sign-on for Android to obtain an * access token. This involves proxying a call through the Facebook for Android stand-alone * application, which will handle the authentication flow, and return an OAuth access token for * making API calls. * * <p>Because this process will not be available for all users, if single sign-on is not possible, * this method will automatically fall back to the OAuth 2.0 User-Agent flow. In this flow, the * user credentials are handled by Facebook in an embedded WebView, not by the client application. * As such, the dialog makes a network request and renders HTML content rather than a native UI. * The access token is retrieved from a redirect to a special URL that the WebView handles. * * <p>Note that User credentials could be handled natively using the OAuth 2.0 Username and * Password Flow, but this is not supported by this SDK. * * <p>See http://developers.facebook.com/docs/authentication/ and http://wiki.oauth.net/OAuth-2 * for more details. * * <p>Note that this method is asynchronous and the callback will be invoked in the original * calling thread (not in a background thread). * * <p>Also note that requests may be made to the API without calling authorize first, in which * case only public information is returned. * * <p>IMPORTANT: Note that single sign-on authentication will not function correctly if you do not * include a call to the authorizeCallback() method in your onActivityResult() function! Please * see below for more information. single sign-on may be disabled by passing FORCE_DIALOG_AUTH as * the activityCode parameter in your call to authorize(). * * @param activity The Android activity in which we want to display the authorization dialog. * @param applicationId The Facebook application identifier e.g. "350685531728" * @param permissions A list of permissions required for this application: e.g. "read_stream", * "publish_stream", "offline_access", etc. see * http://developers.facebook.com/docs/authentication/permissions This parameter should not be * null -- if you do not require any permissions, then pass in an empty String array. * @param activityCode Single sign-on requires an activity result to be called back to the client * application -- if you are waiting on other activities to return data, pass a custom * activity code here to avoid collisions. If you would like to force the use of legacy * dialog-based authorization, pass FORCE_DIALOG_AUTH for this parameter. Otherwise just omit * this parameter and Facebook will use a suitable default. See * http://developer.android.com/reference/android/ app/Activity.html for more information. * @param listener Callback interface for notifying the calling application when the * authentication dialog has completed, failed, or been canceled. */ public void authorize( Activity activity, String[] permissions, int activityCode, final DialogListener listener) { boolean singleSignOnStarted = false; mAuthDialogListener = listener; // fire off an auto-attribution publish if appropriate. autoPublishAsync(activity.getApplicationContext()); // Prefer single sign-on, where available. if (activityCode >= 0) { singleSignOnStarted = startSingleSignOn(activity, mAppId, permissions, activityCode); } // Otherwise fall back to traditional dialog. if (!singleSignOnStarted) { startDialogAuth(activity, permissions); } }
/** * IMPORTANT: This method must be invoked at the top of the calling activity's onActivityResult() * function or Facebook authentication will not function properly! * * <p>If your calling activity does not currently implement onActivityResult(), you must implement * it and include a call to this method if you intend to use the authorize() method in this SDK. * * <p>For more information, see http://developer.android.com/reference/android/app/ * Activity.html#onActivityResult(int, int, android.content.Intent) */ public void authorizeCallback(int requestCode, int resultCode, Intent data) { if (requestCode == mAuthActivityCode) { // Successfully redirected. if (resultCode == Activity.RESULT_OK) { // Check OAuth 2.0/2.10 error code. String error = data.getStringExtra("error"); if (error == null) { error = data.getStringExtra("error_type"); } // A Facebook error occurred. if (error != null) { if (error.equals(SINGLE_SIGN_ON_DISABLED) || error.equals("AndroidAuthKillSwitchException")) { Log.d( "Facebook-authorize", "Hosted auth currently " + "disabled. Retrying dialog auth..."); startDialogAuth(mAuthActivity, mAuthPermissions); } else if (error.equals("access_denied") || error.equals("OAuthAccessDeniedException")) { Log.d("Facebook-authorize", "Login canceled by user."); mAuthDialogListener.onCancel(); } else { String description = data.getStringExtra("error_description"); if (description != null) { error = error + ":" + description; } Log.d("Facebook-authorize", "Login failed: " + error); mAuthDialogListener.onFacebookError(new FacebookError(error)); } // No errors. } else { setAccessToken(data.getStringExtra(TOKEN)); setAccessExpiresIn(data.getStringExtra(EXPIRES)); if (isSessionValid()) { Log.d( "Facebook-authorize", "Login Success! access_token=" + getAccessToken() + " expires=" + getAccessExpires()); mAuthDialogListener.onComplete(data.getExtras()); } else { mAuthDialogListener.onFacebookError( new FacebookError("Failed to receive access token.")); } } // An error occurred before we could be redirected. } else if (resultCode == Activity.RESULT_CANCELED) { // An Android error occured. if (data != null) { Log.d("Facebook-authorize", "Login failed: " + data.getStringExtra("error")); mAuthDialogListener.onError( new DialogError( data.getStringExtra("error"), data.getIntExtra("error_code", -1), data.getStringExtra("failing_url"))); // User pressed the 'back' button. } else { Log.d("Facebook-authorize", "Login canceled by user."); mAuthDialogListener.onCancel(); } } } }