2012-03-13 12 views
1

現在、私はfacebook APIとの通信に便利な方法を提供するためのアダプタクラスを作成しています。
アプリの起動時に認証を実行する方法は、ユーザーのプライベート画像をダウンロードし、後でAsyncFacebookRunnerを使用してユーザーのFacebookブックの更新情報を公開するアプリで実行することです。複数のアクティビティを通してfacebook-objectを処理する

documentationを反転すると、すべてのauthorize()の実装では、最初のパラメータがアクティビティである必要があります。

ボイドAUTHORIZE(アクティビティアクティビティ、最終DialogListenerリスナー):

そしてここで私は疑問に思い始めます。

私が投げ込んだ活動が破壊されたときに何が起こるかということについて、活動とライフサイクルを考えていますか?このオブジェクトの参照Facebook.mAuthActivityも無効にならないでしょうか?
私はlogout()メソッドを参照して、 "ただ"がコンテキストを尋ねます。 (コンテキストコンテキストは)スロー

文字列ログアウト...:
コンテキスト - ログアウトが呼び出されるべきではAndroidのコンテキストは:それはログインが任意の保存されたCookieをクリアするために発生した同じコンテキストでなければなりません

私の知るところでは、アプリの稼働時間の増加に伴って「ログインアクティビティ」が存在することは保証できません。実際は逆の可能性があります。

アプリフォームの合計が後の状態でクラッシュしないように特別な状況はありますか?

答えて

0

アンドロイド用Facebook APIを使用するのは簡単で、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; 
    } 
} 

しかし、この方法は、あなたがFacebookのインスタンスを作成するために必要なコードを実装するための最良の方法ではありません各アクティビティはauthKyを使用します。

+1

authKeyだけが必要であることを思い出して、私を助けてくれました。また、シングルトンの例を見てうれしいです。ありがとう! – yoshi

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は、いくつかのアプリケーション固有のデータを保持するオブジェクトです。基本的には、ログインまたはログアウトしたい場合は、ここで決定する必要があります。

+0

これを分かち合いました。それをより使いやすくする方法を考えてください。 – yoshi

関連する問題