我正在使用 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
如果您使用这个指南,您将能够打开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);
}
希望这对你有帮助))