Facebook通过android登录

时间:2011-09-25 18:05:51

标签: android facebook login facebook-android-sdk

我编写了一个集成了facebook的Android应用程序,但登录facebook步骤失败了。我所做的基本上是执行授权,然后询问会话是否有效。答案总是消极的。如果我正在尝试一个简单的请求:

 String response = facebookClient.request("me"); 

我收到了这个回复:

  

{“error”:{“message”:“必须使用活动访问令牌进行查询   有关当前用户的信息。“,”键入“:”OAuthException“}}

也许我有错误的哈希键(通过我阅读相当不错的线程如何正确)。我想知道这是否是一种确保密钥匹配的方法。

我的代码基于此Android/Java -- Post simple text to Facebook wall?,并添加了一些小的更改。这是代码:

public class FacebookActivity extends Activity implements DialogListener
{

    private Facebook facebookClient;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.main);//my layout xml  

    }



    public void login(View view)
    {
            facebookClient = new Facebook("my APP ID");
            facebookClient.authorize(this, this);
            if (facebookClient.isSessionValid() == true)
                Log.d("Valid:", "yes");
            else
                Log.d("Valid:", "no");
    }
}

2 个答案:

答案 0 :(得分:0)

请注意,authorize方法是异步的。

您应该实现DialogListener的onComplete方法,并在那里完成您需要的所有工作(例如我请求的图形API)。

答案 1 :(得分:0)

在您的应用中使用以下代码:

public class FacebookLogin {
    private AsyncFacebookRunner mAsyncRunner;
    private Facebook facebook;
    private Context mContext;
    private String mFName;

     public static final String[] PERMISSIONS = new String[] {"email", "publish_checkins", "publish_stream","offline_access"};

    public FacebookLogin(Context mContext) {
        this.mContext=mContext;
        facebook=new Facebook(YOUR_APP_ID);
        mAsyncRunner = new AsyncFacebookRunner(facebook);
    }

    public void Login() {
        facebook.authorize((Activity) mContext,PERMISSIONS,Facebook.FORCE_DIALOG_AUTH,new LoginDialogListener());
    }

    public void Logout() throws MalformedURLException, IOException {
        facebook.logout(mContext);
    }
    public boolean isValidUser() {
        return facebook.isSessionValid();
    }

    class LoginDialogListener implements DialogListener {
        public void onComplete(Bundle values) {
            //Save the access token and access expire for future use in shared preferece
               String profile=facebook.request("me")
               String uid = profile.getString("id");
                mFName= profile.optString("first_name");
               new Session(facebook, uid, mFName).save(mContext);
        }

        public void onFacebookError(FacebookError error) {
            displayMessage("Opps..! Check for Internet Connection, Authentication with Facebook failed.");  
        }

        public void onError(DialogError error) {
            displayMessage("Opps..! Check for Internet Connection, Authentication with Facebook failed.");  
        }

        public void onCancel() {
            displayMessage("Authentication with Facebook failed due to Login cancel."); 
        }
    }
}

在登录时完成保存facebook访问令牌并在您的共享首选项中访问过期,并在再次使用facebook对象时设置访问令牌和访问权限到达Facebook对象,它不会给出代码中出现的错误。

您可以使用以下课程:

public class Session {

    private static Session singleton;
    private static Facebook fbLoggingIn;

    // The Facebook object
    private Facebook fb;

    // The user id of the logged in user
    private String uid;

    // The user name of the logged in user
    private String name;

    /**
     * Constructor
     * 
     * @param fb
     * @param uid
     * @param name
     */
    public Session(Facebook fb, String uid, String name) {
        this.fb = fb;
        this.uid = uid;
        this.name = name;
    }

    /**
     * Returns the Facebook object
     */
    public Facebook getFb() {
        return fb;
    }

    /**
     * Returns the session user's id
     */
    public String getUid() {
        return uid;
    }

    /**
     * Returns the session user's name 
     */
    public String getName() {
        return name;
    }

    /**
     * Stores the session data on disk.
     * 
     * @param context
     * @return
     */
    public boolean save(Context context) {

            Editor editor =
           context.getSharedPreferences(ConstantsFacebook.KEY, Context.MODE_PRIVATE).edit();
            editor.putString(ConstantsFacebook.TOKEN, fb.getAccessToken());
            editor.putLong(ConstantsFacebook.EXPIRES, fb.getAccessExpires());
            editor.putString(ConstantsFacebook.UID, uid);
            editor.putString(ConstantsFacebook.NAME, name);
            editor.putString(ConstantsFacebook.APP_ID, fb.getAppId());
            editor.putBoolean(ConstantsFacebook.LOGIN_FLAG,true);
        if (editor.commit()) {
            singleton = this;
            return true;
            }
        return false;
    }

    /**
     * Loads the session data from disk.
     * 
     * @param context
     * @return
     */
    public static Session restore(Context context) {
        if (singleton != null) {
            if (singleton.getFb().isSessionValid()) {
                return singleton;
            } else {
                return null;
            }
        }

        SharedPreferences prefs =
            context.getSharedPreferences(ConstantsFacebook.KEY, Context.MODE_PRIVATE);

            String appId = prefs.getString(ConstantsFacebook.APP_ID, null);

        if (appId == null) {
            return null;
        }

        Facebook fb = new Facebook(appId);
        fb.setAccessToken(prefs.getString(ConstantsFacebook.TOKEN, null));
        fb.setAccessExpires(prefs.getLong(ConstantsFacebook.EXPIRES, 0));
        String uid = prefs.getString(ConstantsFacebook.UID, null);
        String name = prefs.getString(ConstantsFacebook.NAME, null);

        if (!fb.isSessionValid() || uid == null || name == null) {
            return null;
        }

        Session session = new Session(fb, uid, name);
        singleton = session;
        return session;
    }

    /**
     * Clears the saved session data.
     * 
     * @param context
     */
    public static void clearSavedSession(Context context) {
        Editor editor = 
            context.getSharedPreferences(ConstantsFacebook.KEY, Context.MODE_PRIVATE).edit();
        editor.clear();
        editor.commit();
        singleton = null;
    }

    /**
     * Freezes a Facebook object while it's waiting for an auth callback.
     */
    public static void waitForAuthCallback(Facebook fb) {
        fbLoggingIn = fb;
    }

    /**
     * Returns a Facebook object that's been waiting for an auth callback.
     */
    public static Facebook wakeupForAuthCallback() {
        Facebook fb = fbLoggingIn;
        fbLoggingIn = null;
        return fb;
    }

    public static String getUserFristName(Context context) {
         SharedPreferences prefs =
                    context.getSharedPreferences(ConstantsFacebook.KEY, Context.MODE_PRIVATE);
         String frist_name = prefs.getString(ConstantsFacebook.NAME, null);
         return frist_name;

    }

    public static boolean checkValidSession(Context context) {
        SharedPreferences prefs =
                context.getSharedPreferences(ConstantsFacebook.KEY, Context.MODE_PRIVATE);
        Boolean login=prefs.getBoolean(ConstantsFacebook.LOGIN_FLAG,false);
        return login;
    }


}