Обработка объекта facebook с помощью нескольких действий - PullRequest
1 голос
/ 13 марта 2012

В настоящее время я пишу класс адаптера, чтобы обеспечить удобный способ связи с API Facebook.
Я подумал об его использовании, чтобы запустить аутентификацию при запуске приложения, загрузить пользователячастное изображение , а позже в приложении публикуются обновления на стене пользователя Facebook с использованием AsyncFacebookRunner.

Однако при просмотре документации кажется, что для каждой реализации authorize() первоепараметр должен быть активностью.

void authorize (Activity Activity, конечный слушатель DialogListener):

И тут я начинаю удивляться.

Мышлениео деятельности и жизненных циклах, что произойдет, когда деятельность, которую я бросил, будет разрушена?Не станет ли ссылка на этот объект Facebook.mAuthActivity также недействительной.
Я вижу, что метод logout() "only" запрашивает контекст.

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

от того, что явидите, я не могу гарантировать, что "активность входа в систему" все еще будет присутствовать при увеличении времени безотказной работы приложения - на самом деле, скорее наоборот)позднее состояние?

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Вы можете попробовать использовать мой класс FBHelper.

public class FBHelper {

    private SharedPreferences mPrefs;
    private Context context;
    private final String ACCES_TOKEN = "access_token";
    private final String ACCES_EXPIRES = "access_expires";
    private Facebook facebook;
    private FBHelperCallbacks callback;
    public FBHelper(Context context, Facebook facebook)
    {
        this.context = context;
        this.facebook = facebook;
    }
    public void setSignInFinishListener(FBHelperCallbacks callback)
    {
        this.callback = callback;
    }

    public void FacebookSingleSignIn() {
        mPrefs = ((Activity)context).getPreferences(Context.MODE_PRIVATE);
        String access_token = mPrefs.getString(ACCES_TOKEN, null);
        long expires = mPrefs.getLong(ACCES_EXPIRES, 0);
        if(access_token != null) {
            facebook.setAccessToken(access_token);
        }
        if(expires != 0) {
            facebook.setAccessExpires(expires);
        }
        /*
         * Only call authorize if the access_token has expired.
         */
        if(!facebook.isSessionValid()) {
            Log.i("Facebook","Facebook session is not valid based on acces token... authorizing again");
            facebook.authorize((Activity)context, new String[] {"user_about_me"},new DialogListener() {
                @Override
                public void onFacebookError(FacebookError e) {
                    e.printStackTrace();
                    callback.onError(e.toString());
                }
                @Override
                public void onError(DialogError e) {
                    Log.i("Facebook","onError inner");
                    callback.onError(e.toString());
                }
                @Override
                public void onComplete(Bundle values) {
                    SharedPreferences.Editor editor = mPrefs.edit();
                    editor.putString(ACCES_TOKEN, facebook.getAccessToken());
                    Log.i("Facebook","Saving acces token:"+facebook.getAccessToken());
                    editor.putLong(ACCES_EXPIRES, facebook.getAccessExpires());
                    editor.commit();
                    callback.onSignedInFinished(facebook.getAccessToken());
                }
                @Override
                public void onCancel() {
                    callback.onError("onCancel");
                }
            });
        }
        else
        {
            Log.i("Facebook","Accces token read form preferencesno no need to authorize");
            callback.onSignedInFinished(facebook.getAccessToken());
        }

    }
    public String LogOut()
    {
        try {
            //set ACCES_TOKEN to null 
            mPrefs = ((Activity)context).getPreferences(Context.MODE_PRIVATE);

            SharedPreferences.Editor editor = mPrefs.edit();
            editor.putString(ACCES_TOKEN, null);
            editor.putLong(ACCES_EXPIRES, 0);
            editor.commit();
            return facebook.logout(context);

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "Error";
    }

    public static abstract class FBHelperCallbacks{
        public abstract void onSignedInFinished(String accesToken);
        public abstract void onError(String message);

    }

}

Вот как вы используете этот класс.

public class LogInActivity extends Activity {
    private static final String TAG = "LogInActivity";
    public static final int REQUEST_CODE = 1;
    private Context context;
    private Facebook facebook;
    private FBHelper fbhelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_log_in);
        this.context = this;

        Handler pauser = new Handler();
        pauser.postDelayed (new Runnable() {
        public void run() {
            facebook = new Facebook(context.getString(R.string.FACEBOOK_APP_ID));
            fbhelper = new FBHelper(context, facebook);
            if (aHelper.isLogedIn())
            {
                //log out
                fbhelper.LogOut();
            }
            else
            {
                //facebook login
                fbhelper.setSignInFinishListener(fbcallback);
                            fbhelper.FacebookSingleSignIn();

            }
            }
        }, 100);
    }

    FBHelperCallbacks fbcallback = new FBHelperCallbacks() {

        @Override
        public void onSignedInFinished(String accesToken) {
            Log.d(TAG,"log in finish");
        }

        @Override
        public void onError(String message) {
            setResult(RESULT_CANCELED);
            finish();

        }
    };

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        facebook.authorizeCallback(requestCode, resultCode, data);
    }


}

aHelper - это объект, который содержит некоторые специфичные для приложения данные.По сути, вы должны решить, хотите ли вы войти или выйти.

0 голосов
/ 13 марта 2012

Использование Facebook API для Android очень просто, и в вашем случае вам не нужно сохранять экземпляр Facebook, единственное, что вам нужно, это сохранить ключ авторизации facebook при первом входе в систему, чтобы вы могли использовать его где угодно.это означает, что вы можете создать более одного экземпляра объекта facebook в нескольких действиях на основе authKey.

В противном случае вам нужно поместить этот объект facebook в одноэлементный обработчик, чтобы сохранить его в приложении:

class x { 
     private Facebook obj;
     private static x instance;
     private x (){
     }
     public static x getX(){
          if(instance == null){
                instance = new x();
          }
          return instance;
     }

     public void setIt(Facebook obj){
          this.obj = obj;
     }
     public Facebook getIt(){
           return obj;
     }
}

, но это не лучший способ реализовать код, который вам нужно создатьэкземпляр Facebook для каждого действия, использующего authKy.

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