简体   繁体   English

在登录Facebook App并授权我的应用程序后,如何才能正确获取访问令牌和其他信息? [Android]产品

[英]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中,我调用了startSingleSignOnstartDialogAuth ,我正在使用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它设置了AccessTokenAccessExpires

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.

相关问题 如何在Spring应用程序中为Firebase获取Oauth 2.0访问令牌 - How can i get a Oauth 2.0 access token for firebase in my Spring app 如何使用我的Android应用加载朋友的Facebook信息 - How to load friend's facebook info with my Android app 如何在App Engine Authenticator中获取Facebook访问令牌 - How to get Facebook access token in App Engine Authenticator 如何登录Facebook并获取用户信息以从Android应用程序发送我的远程数据库 - How can I login with facebook and get user info to send my remote db from android application 如何在我的android应用中访问并显示离线英语词典? - How can I get access to and display an offline english dictionary in my android app? 如何恢复facebook桌面应用的访问令牌? - How to recover the access token of a facebook desktop app? Facebook本机应用程序无法正确加载我的应用程序请求-Android - Facebook native app not loading my app request correctly - Android 如何使用access_token获取我的应用程序的内容 - How to use the access_token to get contents of my App 如何在Android应用中获取经度和纬度? - How can I get the longitude and latitude in my android app? 获取 Spotify API for Android 应用的访问令牌 - Get access token for Spotify API for Android app
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM