通过多种活动处理facebook对象

时间:2012-03-13 14:27:45

标签: android facebook android-activity

目前我正在编写一个适配器类,以便提供与facebook API通信的便捷方式 我考虑使用它的方法是在应用程序启动时运行身份验证,下载用户的私有图片,然后在应用程序中使用AsyncFacebookRunner在用户Facebook墙上发布更新。

然而,在每个authorize()实现中,documentation翻转似乎第一个参数必须是一个活动。

  

void authorize(活动活动,最终的DialogListener监听器):

在这里,我开始怀疑。

考虑活动和生命周期,当我投入的活动将被摧毁时会发生什么?此对象Facebook.mAuthActivity的引用也不会变为无效 我看到logout()方法“仅”请求上下文。

  

String logout(Context context)抛出......:
  context - 应该调用注销的Android上下文:它应该是登录发生的相同上下文,以便清除任何存储的cookie

从我看到的情况来看,我不能保证“登录活动”仍然存在,因为应用程序的正常运行时间会增加 - 实际上相反的可能性更大。

我是否应该考虑采取任何特殊情况来防止应用程序在以后的状态下崩溃?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用我的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是保存一些特定于应用程序的数据的对象。基本上你应该在这里决定是否要登录或退出。

答案 1 :(得分:0)

使用facebook API为Android很容易,在你的情况下你不需要保存Facebook实例你唯一需要的是在第一次登录时保存facebook的authKey然后你可以在任何地方使用它。 这意味着您可以基于authKey在多个活动中创建多个facebook对象的实例。

否则,您需要将此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;
     }
}

但这种方式不是实现使用authKy为每个活动创建Facebook实例所需的代码的最佳方式。