[英]How can I get Access Token and other info correctly after logging in Facebook App and authorizing my app? [Android]
I'm using this . 我正在使用它 。 In my
Facebook.java
in my authorized()
method I call startSingleSignOn
and startDialogAuth
, I'm using the DEFAULT_AUTH_ACTIVITY_CODE
instead of FORCE_DIALOG_AUTH
在我的
authorized()
方法的Facebook.java
中,我调用了startSingleSignOn
和startDialogAuth
,我正在使用DEFAULT_AUTH_ACTIVITY_CODE
而不是FORCE_DIALOG_AUTH
public void authorize(Activity activity, String[] permissions, int activityCode, final DialogListener listener) { 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);
}
}
I noticed that in my startDialogAuth
it sets the AccessToken
and AccessExpires
我注意到在我的
startDialogAuth
它设置了AccessToken
和AccessExpires
private void startDialogAuth(Activity activity, String[] permissions) {
Bundle params = new Bundle();
if (permissions.length > 0) {
params.putString("scope", TextUtils.join(",", permissions));
}
CookieSyncManager.createInstance(activity);
dialog(activity, LOGIN, params, new DialogListener() {
public void onComplete(Bundle values) {
// ensure any cookies set by the dialog are saved
CookieSyncManager.getInstance().sync();
setAccessToken(values.getString(TOKEN));
setAccessExpiresIn(values.getString(EXPIRES));
if (isSessionValid()) {
Util.logd("Facebook-authorize", "Login Success! access_token="
+ getAccessToken() + " expires="
+ getAccessExpires());
mAuthDialogListener.onComplete(values);
} else {
mAuthDialogListener.onFacebookError(new FacebookError(
"Failed to receive access token."));
}
}
public void onError(DialogError error) {
Util.logd("Facebook-authorize", "Login failed: " + error);
mAuthDialogListener.onError(error);
}
public void onFacebookError(FacebookError error) {
Util.logd("Facebook-authorize", "Login failed: " + error);
mAuthDialogListener.onFacebookError(error);
}
public void onCancel() {
Util.logd("Facebook-authorize", "Login canceled");
mAuthDialogListener.onCancel();
}
});
}
And in the startSingleSignOn
it looks like this 并且在
startSingleSignOn
它看起来像这样
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;
}
I'm wondering where it sets the Access Token
that is needed when logs-in, I'm facing the problem where the user has a Facebook app
installed and already authorized my app, it will only show a dialog (Loading) and display a white screen then dismiss but nothing happen next. 我想知道它在哪里设置登录时需要的
Access Token
,我面临的问题是用户安装了Facebook app
程序并且已经授权我的应用程序,它只会显示一个对话框(正在加载)并显示一个白屏然后解雇但接下来没有任何事情发生。 It doesn't get the user's information from the logged Facebook app
. 它不会从记录的
Facebook app
获取用户的信息。 But when the user doesn't have a Facebook app
it displays the WebView and just working fine, it logs in correctly. 但是当用户没有
Facebook app
它会显示WebView并且工作正常,它会正确登录。 While debugging it I also notice that it doesn't go inside my function LoginDialogListener
here it implements Facebook.DialogListener
(when there is facebook app installed) maybe because in startSingleSignOn
it doesn't call CookieSyncManager.createInstance(activity); dialog(activity, LOGIN, params, new DialogListener() {
在调试它时我还注意到它没有进入我的函数
LoginDialogListener
这里它实现了Facebook.DialogListener
(当安装了facebook app时)可能因为在startSingleSignOn
它没有调用CookieSyncManager.createInstance(activity); dialog(activity, LOGIN, params, new DialogListener() {
CookieSyncManager.createInstance(activity); dialog(activity, LOGIN, params, new DialogListener() {
here's my activity
code where it calls the facebook.authorize
这是我的
activity
代码,它调用facebook.authorize
public void setFacebookConnection() {
facebook = new Facebook(Constants.FACEBOOK_APP_ID);
facebookAsyncRunner = new AsyncFacebookRunner(facebook);
facebook.authorize(this, Constants.FACEBOOK_PERMISSIONS, new LoginDialogListener());
}
private class LoginDialogListener implements Facebook.DialogListener {
public void onComplete(Bundle values) {
Log.d(TAG, "LoginONComplete");
String token = facebook.getAccessToken();
long token_expires = facebook.getAccessExpires();
Log.d(TAG, "AccessToken: " + token);
Log.d(TAG, "AccessExpires: " + token_expires);
if (isPublishStreamAuthorized()) {
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());
} else {
logoutFacebook();
}
}
public void onFacebookError(FacebookError e) {
Log.d(TAG, "FacebookError: " + e.getMessage());
}
public void onError(DialogError e) {
Log.d(TAG, "Error: " + e.getMessage());
Toast.makeText(getApplicationContext(), Constants.NO_INTERNET_CONNECTION,
Toast.LENGTH_LONG).show();
}
public void onCancel() {
Log.d(TAG, "OnCancel");
logoutFacebook();
}
}
It seems that my facebook.getAccessToken();
看来我的
facebook.getAccessToken();
in my activity returns null, as tried calling in my setFacebookConnection()
after calling facebook.authorize()
在我的活动中返回null,在调用
facebook.authorize()
后尝试在我的setFacebookConnection()
调用
Can you please help me? 你能帮我么? I needed to solve this soon.
我需要尽快解决这个问题。 Thank you so much.
非常感谢。
Update 更新
I found this and tried doing step 3 but it ends up opening the WebView
again. 我找到了这个并尝试了第3步,但它最终再次打开了
WebView
。
***Update ***更新
I finally get the access token
, by calling onActivityResult()
but the get data will only show after I close the app and open it again here is my code where FACEBOOK_AUTH_RESULT_CODE
value I changed it to 32665. 我终于通过调用
onActivityResult()
获取access token
,但是只有在我关闭应用程序并再次打开它之后才会显示获取数据这里是我的代码,其中FACEBOOK_AUTH_RESULT_CODE
值我将其更改为32665。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.FACEBOOK_AUTH_RESULT_CODE) {
facebook.authorizeCallback(requestCode, resultCode, data);
} else {
Log.e(TAG, "onActivityResult Error : Authentication Error");
}
}
gradle: gradle这个:
compile 'com.facebook.android:facebook-android-sdk:[4,5)'
strings.xml strings.xml中
<string name="facebook_app_id">YOUR_APP_ID</string>
AndroidManifest.xml Add inside of 'application' tag: AndroidManifest.xml在'application'标签内添加:
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
Create this to init FacebookSDK: 创建此以初始化FacebookSDK:
public class MainApp extends Application {
@Override
public void onCreate() {
super.onCreate();
FacebookSdk.sdkInitialize(getApplicationContext());
}
}
Add it to AndroidManifest.xml to 'application' tag as the name: 将其添加到AndroidManifest.xml,将“application”标记作为名称:
<application
android:name=".MainApp"
In your activity layout add Facebook Login Button: 在您的活动布局中添加Facebook登录按钮:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.app.FacebookLoginActivity">
<com.facebook.login.widget.LoginButton
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp" />
</RelativeLayout>
Your FacebookLoginActivity: And Here you can get now your Facebook Token. 你的FacebookLoginActivity:在这里你可以获得你的Facebook令牌。
public class FacebookLoginActivity extends AppCompatActivity{
private CallbackManager callbackManager;
private LoginButton loginButton;
private String FB_TOKEN;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signin);
callbackManager = CallbackManager.Factory.create();
loginButton = (LoginButton) findViewById(R.id.login_button);
loginButton.setReadPermissions("public_profile", "user_friends", "email", "user_birthday");
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
/**
* HERE YOU CAN GET YOUR FACEBOOK TOKEN!!!!
**/
FB_TOKEN=loginResult.getAccessToken().getToken();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
If you need to use Custom Facebook Button: 如果您需要使用自定义Facebook按钮:
public class FacebookLoginActivity extends AppCompatActivity{
private CallbackManager callbackManager;
private Button loginButton;
private String FB_TOKEN;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signin);
callbackManager = CallbackManager.Factory.create();
loginButton = (Button) findViewById(R.id.login_button);
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
/**
* HERE YOU CAN GET YOUR FACEBOOK TOKEN!!!!
**/
FB_TOKEN=loginResult.getAccessToken().getToken();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
Log.e("onError", exception.getMessage());
}
});
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LoginManager.getInstance().logInWithReadPermissions(FacebookLoginActivity.this, Arrays.asList("public_profile", "user_friends", "email"));
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
1)You don't need to use 'provider' tag. 1)您不需要使用'provider'标签。
2) com.facebook.FacebookActivity is Facebook's own activity, FacebookLoginActivity - yours. 2)com.facebook.FacebookActivity是Facebook自己的活动,FacebookLoginActivity - 你的。
3)Just use this code to get gender, locale, verified, email: 3)只需使用此代码获取性别,区域设置,验证,电子邮件:
GraphRequest request = GraphRequest.newMeRequest(
AccessToken.getCurrentAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(
JSONObject object,
GraphResponse response) {
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,gender,verified,locale,email");
request.setParameters(parameters);
request.executeAsync();
4) Could you please share your class. 你能分享一下你的课吗? I need more information about "Unexpected call to LoginManager.onActivityResult"
我需要有关“对LoginManager.onActivityResult的意外调用”的更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.