2012-07-02 2 views
0

내 안드로이드 응용 프로그램에 Facebook 로그인 옵션이 있습니다.android-facebook api를 사용할 때 장치에 설치된 Facebook android 응용 프로그램을 무시하는 방법?

내 장치에 Facebook 응용 프로그램이 설치되어 있지 않으면이 로그인이 정상적으로 작동합니다. 그러나 페이스 북 응용 프로그램이 설치되면 몇 가지 경우에 문제가 발생합니다.

그렇다면 Facebook 응용 프로그램이 설치되어있는 경우 내 응용 프로그램의 Facebook 로그인 정보가 무시되고 이전 방법으로 계속 진행될 수 있습니다 (Facebook 응용 프로그램이 설치되어 있지 않은 경우).

public class SessionEvents { 

    private static LinkedList<AuthListener> mAuthListeners = new LinkedList<AuthListener>(); 
    private static LinkedList<LogoutListener> mLogoutListeners = new LinkedList<LogoutListener>(); 

    public static void addAuthListener(AuthListener listener) { 

     mAuthListeners.add(listener); 
    } 

    public static void removeAuthListener(AuthListener listener) { 

     mAuthListeners.remove(listener); 
    } 

    public static void addLogoutListener(LogoutListener listener) { 

     mLogoutListeners.add(listener); 
    } 

    public static void removeLogoutListener(LogoutListener listener) { 

     mLogoutListeners.remove(listener); 
    } 

    public static void onLoginSuccess() { 

     LoginButton.getUser(); 
     for (AuthListener listener : mAuthListeners) { 
      listener.onAuthSucceed(); 
     } 
    } 

    public static void onLoginError(String error) { 

     for (AuthListener listener : mAuthListeners) { 
      listener.onAuthFail(error); 
     } 
    } 

    public static void onLogoutBegin() { 

     for (LogoutListener l : mLogoutListeners) { 
      l.onLogoutBegin(); 
     } 
    } 

    public static void onLogoutFinish() { 

     for (LogoutListener l : mLogoutListeners) { 
      l.onLogoutFinish(); 
     } 
    } 

    public static interface AuthListener { 

     public void onAuthSucceed(); 

     public void onAuthFail(String error); 
    } 

    public static interface LogoutListener { 

     public void onLogoutBegin(); 

     public void onLogoutFinish(); 
    } 

} 

는 SessionStore 클래스입니다 :
public class LoginButton extends ImageButton { 

    public static Facebook mFb; 
    public static String facebookID; 
    public static String firstName; 
    public static String lastName; 
    public static String email = ""; 
    public static String sex; 
    private Handler mHandler; 
    private SessionListener mSessionListener = new SessionListener(); 
    private String[] mPermissions = new String[] { "read_stream", "email" }; 
    private Activity mActivity; 

    public LoginButton(Context context) { 
     super(context); 
    } 

    public LoginButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public LoginButton(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void init(final Activity activity, final Facebook fb) { 
     init(activity, fb, new String[] {}); 
    } 

    public void init(final Activity activity, final Facebook fb, 
      final String[] permissions) { 
     mActivity = activity; 
     mFb = fb; 
     mPermissions = new String[] { "read_stream", "email" }; 
     ; 
     mHandler = new Handler(); 

     setBackgroundColor(Color.TRANSPARENT); 
     setAdjustViewBounds(true); 

     if(mFb.isSessionValid()){ 
      getUser(); 
      SessionEvents.onLogoutBegin(); 
      AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(mFb); 
      asyncRunner.logout(getContext(), new LogoutRequestListener()); 
     }else{ 

      setImageResource(R.drawable.login_button); 
      drawableStateChanged(); 
     } 

     SessionEvents.addAuthListener(mSessionListener); 
     SessionEvents.addLogoutListener(mSessionListener); 
     setOnClickListener(new ButtonOnClickListener()); 
    } 

    private final class ButtonOnClickListener implements OnClickListener { 

     public void onClick(View arg0) { 
      if (mFb.isSessionValid()) { 
       getUser(); 
       SessionEvents.onLogoutBegin(); 
       AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(mFb); 
       asyncRunner.logout(getContext(), new LogoutRequestListener()); 
      } else { 
       mFb.authorize(mActivity, mPermissions, 
         new LoginDialogListener()); 
      } 
     } 
    } 

    private final class LoginDialogListener implements DialogListener { 
     public void onComplete(Bundle values) { 

      SessionEvents.onLoginSuccess(); 
     } 

     public void onFacebookError(FacebookError error) { 

      SessionEvents.onLoginError(error.getMessage()); 
     } 

     public void onError(DialogError error) { 

      SessionEvents.onLoginError(error.getMessage()); 
     } 

     public void onCancel() { 

      SessionEvents.onLoginError("Action Canceled"); 
     } 

    } 

    private class LogoutRequestListener extends BaseRequestListener { 
     public void onComplete(String response, final Object state) { 

      mHandler.post(new Runnable() { 
       public void run() { 

       SessionEvents.onLogoutFinish(); 
       } 
      }); 
     } 
    } 

    private class SessionListener implements AuthListener, LogoutListener { 

     public void onAuthSucceed() { 

      setImageResource(R.drawable.logout_button); 
      SessionStore.save(mFb, getContext()); 
     } 

     public void onAuthFail(String error) { 
     } 

     public void onLogoutBegin() { 
     } 

     public void onLogoutFinish() { 

      SessionStore.clear(getContext()); 
      setImageResource(R.drawable.login_button); 
     } 
    } 

    public static void getUser() { 

     try { 
      JSONObject json = Util.parseJson(mFb.request("me")); 
      facebookID = json.getString("id"); 
      firstName = json.getString("first_name"); 
      lastName = json.getString("last_name"); 
      email = json.getString("email"); 
      sex = json.getString("gender"); 
      String mFirstName = firstName; 
      String mLastName = lastName; 
      String mEmail = email; 
      String mSex = sex; 
      Log.d("User Details", "You are logged in : " + facebookID 
        + mFirstName + "." + mLastName + " Email is: " + mEmail 
        + "-" + mSex); 

      SharedPreferences.Editor editor = SignUpActivity.settings.edit(); 

      // Set "hasLoggedIn" to true 
      editor.putBoolean("hasLoggedIn", true); 
      editor.putString("fbEmail", email); 
      editor.putString("fbId", facebookID); 
      editor.putString("fbSex", sex); 
      editor.putString("fbFirstname", firstName); 
      editor.putString("fbLastname", lastName); 

      // Commit the edits! 
      editor.commit(); 
     } catch (Exception e) { 
      // TODO: handle exception 
      Log.d("Exception in getUser", "+++++" + e.toString()); 
     } 
    } 
} 

이 SessionEvents 클래스입니다 : 이것은 LoginButton 클래스입니다

public class Example extends Activity { 

    public static final String APP_ID = myAppIdHere; 


    private LoginButton mLoginButton; 
    private TextView mText; 
    private Button mRequestButton; 
    private Button mPostButton; 
    private Button mDeleteButton; 
    private Button mUploadButton; 
    public static Activity ExampleActivity; 

    private Facebook mFacebook; 
    private AsyncFacebookRunner mAsyncRunner; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ExampleActivity = this; 
     if (APP_ID == null) { 
      Util.showAlert(this, "Warning", "Facebook Applicaton ID must be " + 
        "specified before running this example: see Example.java"); 
     } 

     setContentView(R.layout.facebook); 
     mLoginButton = (LoginButton) findViewById(R.id.login); 
     mFacebook = new Facebook(APP_ID); 
     mAsyncRunner = new AsyncFacebookRunner(mFacebook); 

     SessionStore.restore(mFacebook, this); 
     SessionEvents.addAuthListener(new SampleAuthListener()); 
     SessionEvents.addLogoutListener(new SampleLogoutListener()); 
     mLoginButton.init(this, mFacebook); 

    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 

     mFacebook.authorizeCallback(requestCode, resultCode, data); 
    } 

    public class SampleAuthListener implements AuthListener { 

     public void onAuthSucceed() { 

     } 

     public void onAuthFail(String error) { 

     } 
    } 

    public class SampleLogoutListener implements LogoutListener { 
     public void onLogoutBegin() { 

     } 

     public void onLogoutFinish() { 

    } 
} 

을 :

내가 fbLoginButton를 클릭 할 때 호출 활동 :

public abstract class BaseRequestListener implements RequestListener { 

    public void onFacebookError(FacebookError e, final Object state) { 
     Log.e("Facebook", e.getMessage()); 
     e.printStackTrace(); 
    } 

    public void onFileNotFoundException(FileNotFoundException e, 
      final Object state) { 
     Log.e("Facebook", e.getMessage()); 
     e.printStackTrace(); 
    } 

    public void onIOException(IOException e, final Object state) { 
     Log.e("Facebook", e.getMessage()); 
     e.printStackTrace(); 
    } 

    public void onMalformedURLException(MalformedURLException e, 
      final Object state) { 
     Log.e("Facebook", e.getMessage()); 
     e.printStackTrace(); 
    } 
} 
+1

그것을 피하기보다는 문제를 해결하기 위해 더 좋을 거라 위해 아래 링크를 참조? Facebook 응용 프로그램이 설치되면 어떻게됩니까? – Rawkode

+0

내 앱에서 Facebook 로그인 버튼을 클릭하면 fbLoginButton으로 이동합니다 ...이 버튼을 클릭하면 Facebook 애플리케이션 로그인 화면으로 이동합니다 (fb 앱이 설치되어 있으면 대화 상자로 이동합니다). ... 내 fb 자격 증명을 입력하고 갈 때 ... 응용 프로그램이 내 정보를 사용하도록 허용 할 수있는 권한이 있는지 묻습니다. 확인을 클릭하면 fbLoginButton으로 돌아갑니다 .... 다시 클릭합니다. 같은 과정을 몇 번이고 반복하십시오 ... 3, 4 번 시도한 후 내 응용 프로그램에 로그인하십시오 .... 그때까지 무엇이 잘못 되었습니까? –

+0

만약 내가 코드와 이미지를 붙여 넣을 수 있습니다. –

답변

2

당신의 로그인 버튼을 클릭 리스너의 코드를 아래에 업데이트하십시오 :
public class SessionStore extends Activity{ 

    private static final String TOKEN = "access_token"; 
    private static final String EXPIRES = "expires_in"; 
    private static final String KEY = "facebook-session"; 

    public static boolean save(Facebook session, Context context) { 

     Context contextObj = Example.ExampleActivity; 
     Intent i=new Intent(contextObj , SignUpActivity.class); 
     contextObj.startActivity(i); 

     Editor editor = 
      context.getSharedPreferences(KEY, Context.MODE_PRIVATE).edit(); 
     editor.putString(TOKEN, session.getAccessToken()); 
     editor.putLong(EXPIRES, session.getAccessExpires()); 
     return editor.commit(); 
    } 

    public static boolean restore(Facebook session, Context context) { 

     SharedPreferences savedSession = 
      context.getSharedPreferences(KEY, Context.MODE_PRIVATE); 
     session.setAccessToken(savedSession.getString(TOKEN, null)); 
     session.setAccessExpires(savedSession.getLong(EXPIRES, 0)); 
     return session.isSessionValid(); 
    } 

    public static void clear(Context context) { 

     Editor editor = 
      context.getSharedPreferences(KEY, Context.MODE_PRIVATE).edit(); 
     editor.clear(); 
     editor.commit(); 
    } 

} 

이것은 BaseRequestListener 클래스입니다.

mFb.authorize(mActivity, mPermissions, Facebook.FORCE_DIALOG_AUTH, 
      new LoginDialogListener()); 
대신

mFb.authorize(mActivity, mPermissions, new LoginDialogListener()); 

그리고 자세한 내용은 분명히

Facebook Login Issue

+0

실제로 내가 벽과 모든 물건에 게시 할 해달라고 .... 내가 그/그녀가 입력 한 자격 증명에서 사용자 세부 정보를 얻고 싶습니다 –

+0

내 수정 된 답변보기. –

+0

이것은 무엇입니까 ?? ..... fb 앱 로그인 화면 대신 대화 상자가 표시됩니까 ?? –

관련 문제