2012-10-03 3 views
1

Android에서 페이스 북 로그인과 월 게시를 구현하려고하므로 모든 것을 처리하는 비 활동 클래스를 만들었습니다. onActivityResult 메소드를 사용하는 모든 예를 보았지만 사용해야하는지 또는 왜 그렇게 중요한지는 알지 못합니다. onActivityResult와 아무 관계가 없다면 폰북에 페이스 북 앱이 설치되어 있지 않아도 코드없이 작동합니다. 추신 : 나는 해시 키를 핵심으로 생성했다고 확신한다. 고맙습니다. :)비 활동 클래스의 onActivityResult?

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.Toast; 

import com.facebook.android.DialogError; 
import com.facebook.android.Facebook; 
import com.facebook.android.Facebook.DialogListener; 
import com.facebook.android.FacebookError; 
import com.infobest.praiser.R; 
import com.infobest.praiser.utils.Constants; 

/** 
* Functionality for facebook sharing 
* 
* @author oana_balaceanu 
* 
*/ 
public class ShareFacebook 
{ 
    private static final String[] PERMISSIONS = new String[] {"publish_stream"}; 

    private Facebook facebook; 
    private String messageToPost; 
    private Context ctx; 

    public ShareFacebook(String messageToPost, Context ctx) 
    { 
     this.messageToPost = messageToPost; 
     this.ctx = ctx; 

    } 

    public boolean saveCredentials(Facebook facebook) 
    { 
     Editor editor = ctx.getSharedPreferences(Constants.KEY, Context.MODE_PRIVATE).edit(); 
     editor.putString(Constants.TOKEN, facebook.getAccessToken()); 
     editor.putLong(Constants.EXPIRES, facebook.getAccessExpires()); 
     return editor.commit(); 
    } 

    public boolean restoreCredentials(Facebook facebook) 
    { 
     SharedPreferences sharedPreferences = ctx.getSharedPreferences(Constants.KEY, 
      Context.MODE_PRIVATE); 
     facebook.setAccessToken(sharedPreferences.getString(Constants.TOKEN, null)); 
     facebook.setAccessExpires(sharedPreferences.getLong(Constants.EXPIRES, 0)); 
     return facebook.isSessionValid(); 
    } 

    public void share() 
    { 
     facebook = new Facebook(Constants.APP_ID); 
     restoreCredentials(facebook); 

     if (!facebook.isSessionValid()) 
     { 
      loginAndPostToWall(); 
     } 
     else 
     { 
      postToWall(messageToPost); 
     } 
    } 


    public void loginAndPostToWall() 
    { 
     facebook.authorize((Activity) ctx, PERMISSIONS, 
      (DialogListener) new LoginDialogListener()); 
    } 

    public void postToWall(String message) 
    { 
     FacebookPoster fp = new FacebookPoster(); 
     fp.execute(message, null, null); 
    } 

    private class FacebookPoster extends AsyncTask<String, Object, Object> 
    { 

     @Override 
     protected Object doInBackground(String... message) 
     { 
      Bundle parameters = new Bundle(); 
      parameters.putString("message", message[0]); 
      parameters.putString("link", ctx.getResources().getString(R.string.rateLink)); 
      parameters.putString("picture", ctx.getResources().getString(R.string.linkIconPicture)); 
      try 
      { 
       facebook.request("me"); 
       String response = facebook.request("me/feed", parameters, "POST"); 
       Log.d("Tests", "got response: " + response); 
       if (response == null || response.equals("") || response.equals("false")) 
       { 
        return ctx.getResources().getString(R.string.facebookError); 
       } 
       else 
       { 
        return ctx.getResources().getString(R.string.facebookSuccess); 

       } 
      } 
      catch (Exception e) 
      { 
       Log.d("ShareOnFacebook", e.toString()); 
       return ctx.getResources().getString(R.string.facebookError); 
      } 
     } 

     @Override 
     protected void onPostExecute(Object result) 
     { 

      super.onPostExecute(result); 
      showToast(result); 
     } 


    } 


    class LoginDialogListener implements DialogListener 
    { 
     public void onComplete(Bundle values) 
     { 
      saveCredentials(facebook); 
      if (messageToPost != null) 
      { 
       postToWall(messageToPost); 
      } 

     } 

     public void onFacebookError(FacebookError error) 
     { 
      showToast(ctx.getResources().getString(R.string.facebookError)); 

     } 

     public void onError(DialogError error) 
     { 
      showToast(ctx.getResources().getString(R.string.facebookError)); 

     } 

     public void onCancel() 
     { 
      showToast(ctx.getResources().getString(R.string.facebookCancel)); 

     } 
    } 

    private void showToast(Object message) 
    { 
     Toast.makeText(ctx, message.toString(), Toast.LENGTH_SHORT).show(); 
    } 


} 
+1

이 방법은 다른 활동의 결과를 먼저 파괴하지 않고 Activity를 사용하려는 경우에만 사용해야합니다 – Gorets

답변

0

설치된 Facebook 앱으로 에뮬레이터 또는 스마트 폰에서 앱을 테스트하면 로그인이 실패합니다.

관련 문제