Фейсбук логин через андроид - PullRequest
1 голос
/ 25 сентября 2011

Я пишу приложение для Android, которое интегрирует Facebook, но не удается войти на Facebook. В основном я делаю авторизацию, а затем спрашиваю, действителен ли сеанс. Ответ всегда отрицательный. Если я пытаюсь простой запрос, как:

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

Я получаю этот ответ:

{"error": {"message": "Для запроса должен использоваться активный токен доступа информация о текущем пользователе. "," type ":" OAuthException "}}

Может быть, у меня неправильный ключ хеша (я читаю довольно хорошие темы, как это сделать правильно). Я хотел бы знать, если это способ убедиться, что ключ соответствует.

Я основал свой код на этом - Android / Java - Опубликовать простой текст на стене Facebook? и добавить некоторые незначительные изменения. Это код:

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 голосов
/ 24 ноября 2012

Используйте следующий код в своем приложении:

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;
    }


}
0 голосов
/ 25 сентября 2011

Обратите внимание, что метод авторизации является асинхронным.

Вы должны реализовать метод onComplete DialogListener и выполнить там всю необходимую работу (например, запрос API к графу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...