2016-04-27 4 views
1

Ich habe Facebook sdk v-4 mit meiner Android App integriert. Hier habe ich Facebook Login in 2 Aktivitäten gearbeitet.Facebook-Login-Dialog beenden Android

1) In einer Aktivität fb Anmeldung erfolgt über LoginButton. Wo nach erfolgreichem Login der fb Login Dialog von Facebook sdk automatisch geschlossen wird.

Code:

fbLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
     ProfileTracker profileTracker; 

     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Logger.d("FBLOGIN", "login successful. User ID: " 
        + loginResult.getAccessToken().getUserId() 
        + "\n" + 
        "Auth Token: " 
        + loginResult.getAccessToken().getToken()); 

      com.facebook.Profile fbProfile = com.facebook.Profile.getCurrentProfile(); 

      if (fbProfile == null) { 
       profileTracker = new ProfileTracker() { 
        @Override 
        protected void onCurrentProfileChanged(com.facebook.Profile oldProfile, com.facebook.Profile currentProfile) { 
         profileTracker.stopTracking(); 
         doTaskWithFbProfile(currentProfile); 
        } 
       }; 
       profileTracker.startTracking(); 
      } else { 
       doTaskWithFbProfile(fbProfile); 
      } 

     } 

     @Override 
     public void onCancel() { 
      Logger.d(TAG, "fb Login attempt canceled."); 
     } 

     @Override 
     public void onError(FacebookException e) { 
      Logger.e(TAG, "fb Login attempt failed." + e); 
      Toast.makeText(LoginActivity.this,R.string.str_please_check_your_internet_connection,Toast.LENGTH_LONG).show(); 
     } 
    }); 

private void doTaskWithFbProfile(com.facebook.Profile fbProfile) { 
    Logger.d("FBLOGIN", "id - " + fbProfile.getId()); 
    Logger.d("FBLOGIN", "name - " + fbProfile.getName()); 
    Logger.d("FBLOGIN", "pic - " + fbProfile.getProfilePictureUri(150, 150)); 

    com.android.circlecare.models.common.Profile profile = new com.android.circlecare.models.common.Profile(); 
    profile.setFBID(fbProfile.getId()); 
    profile.setName(fbProfile.getName()); 
    profile.setProfilePhoto(fbProfile.getProfilePictureUri(150, 150).toString()); 

    Intent intent = new Intent(this, LoginWithFacebookActivity.class); 
    intent.putExtra(LoginWithFacebookActivity.EXTRA_PROFILE, profile); 

    startActivity(intent); 
    finish(); 

} 

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

2) Auf der anderen Seite habe ich Loginmanager in fb anmelden. Wo nach erfolgreichem Login der Login-Dialog nicht verworfen wird, bleibt er vorne und nach dem Login geht der Dialog nicht mehr.

Code:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

FacebookSdk.sdkInitialize(this.getApplicationContext()); 

mFacebookCallback = new FacebookCallback<LoginResult>() { 
     ProfileTracker profileTracker; 

     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Profile fbProfile = Profile.getCurrentProfile(); 

      if (fbProfile == null) { 
       profileTracker = new ProfileTracker() { 
        @Override 
        protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) { 
         profileTracker.stopTracking(); 
         getAllFriends(); 
        } 
       }; 
       profileTracker.startTracking(); 
      } else { 
       getAllFriends(); 
      } 
     } 

     @Override 
     public void onCancel() { 
      Logger.d(TAG, "fb Login attempt canceled."); 
     } 

     @Override 
     public void onError(FacebookException error) { 
      Logger.d(TAG, "Error : " + error.getMessage()); 
      finish(); 
     } 
    }; 

    callbackManager = CallbackManager.Factory.create(); 

    if (hasAccess) 
     getAllFriends(); 
    else 
     loginWorks(); 
} 


    private void loginWorks() { 
    loginManager = LoginManager.getInstance(); 
    loginManager.registerCallback(callbackManager, mFacebookCallback); 

    ArrayList<String> publishPermission = new ArrayList<>(); 
    publishPermission.add("publish_pages"); 
    publishPermission.add("publish_actions"); 
    loginManager.logInWithPublishPermissions(this, publishPermission); 

    ArrayList<String> readPermission = new ArrayList<>(); 
    readPermission.add("user_friends"); 
    readPermission.add("public_profile"); 
    readPermission.add("user_about_me"); 
    loginManager.logInWithReadPermissions(this, readPermission); 
} 

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

Ich habe in beiden Fällen fast gleichen Codes verwendet, aber ich frage mich, warum Login-Dialog wird nicht entlassen werden, wenn mit Loginmanager arbeiten.

Kann jemand auf das Problem hinweisen oder gibt es eine API, um fb Login-Dialog (Web-Ansicht) zu entlassen.

+1

Wir müssen Ihren Code sehen, denke ich. –

Antwort

1

In Ihrer loginWorks() -Methode rufen Sie logischerweise zweimal an, was wahrscheinlich zwei verschiedene Anmeldebildschirme anzeigt, und warum es so aussieht, als ob der Dialog nicht abbricht, nachdem Sie eines von ihnen beendet haben. Versuchen Sie, den Aufruf von loginWithPublishPermissions zu entfernen, und fügen Sie ihn beim Aufruf der Leseberechtigungen in den Rückruf ein, wenn Sie ihn wirklich benötigen.

+0

Vielen Dank für das Problem. Ich wundere mich über Facebooks Ansatz zu anderen Login mit verschiedenen Berechtigungen. Es ist ein Chaos. –