登录Facebook应用程序并授权您的应用程序后如何获取用户信息? [安卓]

问题描述 投票:0回答:2

我正在使用 this 进行

Facebook
登录和共享。我想知道是否有一种方法,当用户已经安装了
WebView
而不是打开
Facebook
时,它会打开
Facebook app
,而不是打开显示使用
WebView
登录的
Facebook app
?当用户已经在
Facebook App
中登录时,它将获取其凭据并自动在我的
app
中登录?我似乎找不到如何做到这一点。

编辑

我发现我的

activityCode
总是返回 -1 而不是 >= 0,这就是为什么它总是打开
WebView
而不是应用程序。并且还发现我需要启用
Single Sign-On
,我启用了单点登录但它仍然没有打开
facebook app
。也许是因为
FORCE_DIALOG_AUTH
总是返回
-1
。我想知道是否有默认值而不是使用
FORCE_DIALOG_AUTH

FORCE_DIALOG_AUTH
的解决方案中,我使用了下面的代码:

而不是使用

facebook.authorize(this, Constants.FACEBOOK_PERMISSIONS,
            Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener());

我用过

facebook.authorize(this, Constants.FACEBOOK_PERMISSIONS, new LoginDialogListener());

在我的

Facebook.java

哪里
 public void authorize(Activity activity, String[] permissions,
        final DialogListener listener) {
    authorize(activity, permissions, DEFAULT_AUTH_ACTIVITY_CODE, listener);
}

它现在还会检测是否安装了

Facebook app
,但是当安装了
Facebook app
时,它仍然不会在
Facebook app
中显示/打开,它只是加载并返回到我的活动,什么也没有发生。

更新

我尝试在

Facebook app
中没有用户登录的情况下登录,并且该用户仍然无权使用我的应用程序,它会打开
Facebook app
登录屏幕,但授权后,它没有得到我的登录信息。

这是我的代码

Facebook.java
它与它相同

private boolean startSingleSignOn(Activity activity, String applicationId,
        String[] permissions, int activityCode) {
    boolean didSucceed = true;
    Intent intent = new Intent();

    intent.setClassName("com.facebook.katana",
            "com.facebook.katana.ProxyAuth");
    intent.putExtra("client_id", applicationId);
    if (permissions.length > 0) {
        intent.putExtra("scope", TextUtils.join(",", permissions));
    }

    // Verify that the application whose package name is
    // com.facebook.katana.ProxyAuth
    // has the expected FB app signature.
    if (!validateActivityIntent(activity, intent)) {
        return false;
    }

    mAuthActivity = activity;
    mAuthPermissions = permissions;
    mAuthActivityCode = activityCode;
    try {
        activity.startActivityForResult(intent, activityCode);
    } catch (ActivityNotFoundException e) {
        didSucceed = false;
    }

    return didSucceed;
}

在我的活动中调用授权并处理授权后要执行的操作,这是我的代码

private void setFacebookConnection() {

// ProgressBar.setVisibility(View.VISIBLE);

    facebook = new Facebook(Constants.FACEBOOK_APP_ID);
    facebookAsyncRunner = new AsyncFacebookRunner(facebook);

// facebook.authorize(MerchantDetailsActivity.this, Constants.FACEBOOK_PERMISSIONS, // Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener());

    facebook.authorize(MerchantDetailsActivity.this, Constants.FACEBOOK_PERMISSIONS, new LoginDialogListener());

}

private class LoginDialogListener implements Facebook.DialogListener {
    public void onComplete(Bundle values) {

        String token = facebook.getAccessToken();
        long token_expires = facebook.getAccessExpires();
        Log.d(TAG, "AccessToken: " + token);
        Log.d(TAG, "AccessExpires: " + token_expires);

        facebookSharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(context);
        facebookSharedPreferences.edit()
                .putLong(Constants.FACEBOOK_ACCESS_EXPIRES, token_expires)
                .commit();
        facebookSharedPreferences.edit()
                .putString(Constants.FACEBOOK_ACCESS_TOKEN, token).commit();
        facebookAsyncRunner.request("me", new IDRequestListener());

        shareFBPost();
    }

似乎当用户已经获得授权时,它不会进入我的

LoginDialogListener

android facebook
2个回答
0
投票

如果您使用这个指南,您将能够打开Facebook应用程序进行登录

实现 Facebook 身份验证后,在您的应用程序类或使用 Facebook 登录的活动中初始化 Facebook SDK

// initialize facebook sdk and app events logger
FacebookSdk.sdkInitialize(getApplicationContext());

然后就可以使用下面的类来登录

public class FacebookAuth { 
    private static FacebookAuth instance; 
    private OnLoginDataReadyListener mResponseListener; 
    public static synchronized FacebookAuth getInstance() { 
        if (instance == null) { 
            instance = new FacebookAuth(); 
        } 
        return instance; 
    } 

    /** 
     * Call if you want the user to login with his facebook account 
     * @param activity needed to initialize the Facebook LoginManager 
     * @param listener used to set the login listener 
     */ 
     public void facebookLogin(Activity activity, OnLoginDataReadyListener listener, CallbackManager callbackManager) { 
         mResponseListener = listener;
         LoginManager.getInstance().logInWithReadPermissions(activity, Arrays.asList("public_profile", "user_friends", "email"));
         LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
            @Override 
            public void onSuccess(LoginResult loginResult) { 
                getUserData(); 
            } 

            @Override 
            public void onCancel() { 
                if (mResponseListener != null) { 
                    mResponseListener.onCanceled(); 
                } 
            } 

            @Override 
            public void onError(FacebookException error) {
                if (mResponseListener != null) { 
                    mResponseListener.onCanceled(); 
                } 
            } 
         }); 
     } 

    /** 
     * Creates an Facebook Graph request witch will grab the user data 
     * such as name id and picture for now 
     */ 
    public void getUserData() { 
        GraphRequest request = GraphRequest.newMeRequest( AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() { 
            @Override 
            public void onCompleted(JSONObject object, GraphResponse response) { 
                if (mResponseListener != null) {
                    mResponseListener.onLoginDataReady(object);
                }
            } 
        }); 
        Bundle parameters = new Bundle();
        parameters.putString("fields", "picture.height(200).width(200),cover,location,birthday,first_name,last_name,email,gender,name"); 
        request.setParameters(parameters);
        request.executeAsync();
    } 

    public interface OnLoginDataReadyListener { 
        void onLoginDataReady(JSONObject facebookData); 
        void onCanceled(); 
    }
}

实施上述解决方案后,在您的活动中创建一个 CallbackManager

CallbackManager mCallbackManager = CallbackManager.Factory.create();

然后在按钮单击侦听器中,您可以按如下方式登录您的用户

FacebookAuth.getInstance().facebookLogin(activity, dataReadyListener, mCallbackManager);

最后在 onActivityResult() 中

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

希望这对你有帮助))


0
投票

我改用最新的 Facebook SDK,并按照 这些 步骤操作。重要的是添加

onActivityResult
用于 Facebook 登录
callbackManager

© www.soinside.com 2019 - 2024. All rights reserved.