2015-04-08 15 views
9

DÜZENLEME: Benim Soru e-posta, UserId, Facebook Kimlik Doğrulama Facebook SDK 4.X, Ming Yanıtla birlikte, E-posta, Kullanıcı Kimliği'ni nasıl alabileceğimi biliyorum, bu yüzden soruum Oturum Oturum ve GraphUser'ın yalnızca LoginManager ve AccessToken tarafından değiştirilmesinden bu yana Facebook Kimlik Doğrulaması'nın nasıl alınacağını ve bunun hakkında herhangi bir bilgi olmadığını nasıl anlatacağım?Android Facebook SDK 4.X, nasıl kullanılır E-posta adresi ve Facebook Erişim Simgesini Web Hizmetine iletmek için

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import com.facebook.AccessToken; 
import com.facebook.AccessTokenTracker; 
import com.facebook.CallbackManager; 
import com.facebook.FacebookCallback; 
import com.facebook.FacebookException; 
import com.facebook.Profile; 
import com.facebook.ProfileTracker; 
import com.facebook.login.LoginResult; 
import com.facebook.login.widget.LoginButton; 
import java.util.Arrays; 

public class RegisterActivity extends Activity { 
    private String fbUserID; 
    private String fbProfileName; 
    private String fbAuthToken; 
    private LoginButton fbLoginBtn; 
    private static final String TAG = "FacebookLogin"; 
    CallbackManager callbackManager; 
    private AccessTokenTracker accessTokenTracker; 
    private ProfileTracker profileTracker; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.register_activity); 
     fbLoginBtn = (LoginButton) findViewById(R.id.connect_with_facebook_button); 
     fbLoginBtn.setReadPermissions(Arrays.asList("email", "user_photos", "public_profile")); 
     fbLoginBtn.setBackgroundResource(R.drawable.connect_facebook_button); 


     accessTokenTracker = new AccessTokenTracker() { 
      @Override 
      protected void onCurrentAccessTokenChanged(
        AccessToken oldAccessToken, 
        AccessToken currentAccessToken) { 
       fbAuthToken = currentAccessToken.getToken(); 
       fbUserID = currentAccessToken.getUserId(); 


       Log.d(TAG, "User id: " + fbUserID); 
       Log.d(TAG, "Access token is: " + fbAuthToken); 


      } 
     }; 

     profileTracker = new ProfileTracker() { 
      @Override 
      protected void onCurrentProfileChanged(
        Profile oldProfile, 
        Profile currentProfile) { 
       fbProfileName = currentProfile.getName(); 

       Log.d(TAG, "User name: " + fbProfileName); 
      } 
     }; 


     fbLoginBtn.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 

      } 

      @Override 
      public void onCancel() { 
       // App code 
      } 

      @Override 
      public void onError(FacebookException exception) { 
       // App code 
      } 
     }); 

    } 


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



    } 

GraphRequest request = GraphRequest.newMeRequest(
     accessToken, 
     new GraphRequest.GraphJSONObjectCallback() { 
      @Override 
      public void onCompleted(
        JSONObject user, 
        GraphResponse response) { 
       String id = user.optString("id"); 
       String firstName = user.optString("first_name"); 
       String lastName = user.optString("last_name"); 
       String email = user.optString("email"); 

      } 

    @Override 
    public void onSaveInstanceState(Bundle savedState) { 
     super.onSaveInstanceState(savedState); 
    } 
+0

Sen onActivityResult geçersiz kılma callbackManager.onActivityResult diyoruz ve sonra bir hale getirmek için) (sizin onSuccess bir bölüm eklemek gerekir/me GraphRequest e-posta ve userId olsun . –

+0

@Ming, callbackManager'la ilgili sorun, ilk girişten sonra onActivityResult olarak ayarladığımda, oturum açma düğmesi kapatılıyor ve beklediğim şey bu değil, bu yüzden onActivityResult içinde callbackManager'ı kullanarak bunu nasıl düzeltebilirim? – John

+0

@Ming, Ayrıca onSuccess'da GraphRequest kodunu nasıl kullanabileceğimi gösteren kodu da gösterebilir misiniz, sonra bunun cevabı olarak cevabınızı seçeceğim, Teşekkürler! – John

cevap

19
fbLoginBtn.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
    @Override 
    public void onSuccess(LoginResult loginResult) { 
     GraphRequest.newMeRequest(
      loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { 
       @Override 
       public void onCompleted(JSONObject me, GraphResponse response) { 
        if (response.getError() != null) { 
         // handle error 
        } else { 
         String email = me.optString("email"); 
         String id = me.optString("id"); 
         // send email and id to your web server 
        } 
       } 
      }).executeAsync(); 
    } 

    @Override 
    public void onCancel() { 
     // App code 
    } 

    @Override 
    public void onError(FacebookException exception) { 
     // App code 
    } 
}); 
+0

mükemmel, bunu da mesajınızdan önce fark ettim, ama yanıtınızı bir çözüm olarak sunmadan önce, lütfen SDK 4.X ile Facebook Kimlik Doğrulamasına nasıl erişebilirim? ve sonra bu Thread'in bir çözümü olarak yanıtınızı seçerim. Teşekkürler – John

+0

Bu yorum tarafından ne demek istediğinden emin değilim. Zaten giriş yapıyorsunuz, başka hangi kimlik doğrulamasına ihtiyacınız var? –

+0

Sanırım OnSuccess'da kendimi buldum, loginResult AccessToken hakkına sahip mi? bu yüzden bu 'loginResult.getAccessToken(). toString()' eklemek gerekiyor? sağ? Çünkü çalışmakta olduğum web servisi, Facebook Access Token'i web hizmetine – John

1

Ben kullanıcı E-posta için ekstra alan eklemek gerekir.

//register facebook login callback 
    LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() 
    { 
     @Override 
     public void onSuccess (LoginResult loginResult) 
     { 
      Log.d(TAG, "FB: login success"); 
      showLoading(true); 

      final String token = loginResult.getAccessToken().getToken(); 

      //prepare fields with email 
      String[] requiredFields = new String[]{"email"}; 
      Bundle parameters = new Bundle(); 
      parameters.putString("fields", TextUtils.join(",", requiredFields)); 

      GraphRequest requestEmail = new GraphRequest(loginResult.getAccessToken(), "me", parameters, null, new GraphRequest.Callback() 
      { 
       @Override 
       public void onCompleted (GraphResponse response) 
       { 
        if (response != null) 
        { 
         GraphRequest.GraphJSONObjectCallback callbackEmail = new GraphRequest.GraphJSONObjectCallback() 
         { 
          @Override 
          public void onCompleted (JSONObject me, GraphResponse response) 
          { 
           if (response.getError() != null) 
           { 
            Log.d(TAG, "FB: cannot parse email"); 
            showDialog(getString(R.string.dialog_message_unknown_error)); 
            showLoading(false); 
           } 
           else 
           { 
            String email = me.optString("email"); 

            // send email and id to your web server 
            //... 
           } 
          } 
         }; 

         callbackEmail.onCompleted(response.getJSONObject(), response); 
        } 
       } 
      }); 

      requestEmail.executeAsync(); 
     } 

     @Override 
     public void onCancel() 
     { 
      Log.d(TAG, "FB: login cancel"); 
      showDialog(getString(R.string.dialog_message_unknown_error)); 
     } 

     @Override 
     public void onError (FacebookException e) 
     { 
      Log.d(TAG, "FB: login error " + e.getMessage()); 
      showDialog(getString(R.string.dialog_message_unknown_error)); 
     } 
    }); 
17
i aşağıdaki gibi yüksek cevap benim için işe yaramadı oy kullandı edilir aramalardan saat sonra bulundu ve e-posta

LoginManager.getInstance().registerCallback(mCallbackManager, 
      new FacebookCallback<LoginResult>() { 
       @Override 
       public void onSuccess(LoginResult loginResult) { 
        GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() { 
         @Override 
         public void onCompleted(JSONObject object,GraphResponse response) { 

          JSONObject json = response.getJSONObject(); 
          try { 
           if(json != null){ 
            String text = json.getString("email"); 
            Log.d("email",text); 

           } 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
        Bundle parameters = new Bundle(); 
        parameters.putString("fields", "id,name,link,email,picture"); 
        request.setParameters(parameters); 
        request.executeAsync(); 

       } 

       @Override 
       public void onCancel() { 
        // App code 
       } 

       @Override 
       public void onError(FacebookException exception) { 
        // App code 
       } 
      }); 

Ben gereksinimi duyulan alanlar olarak parametreleri ayarlayarak inanıyoruz alway boştu

En kolay cevap Grafik İsteği burada çok önemli bir şey. Bu kodu LoginButton ile de kullanabilirsiniz, sorun çıkarmadan çalışır.

****** Güncelleştirme ******** Bu kodu birçok hesapla kullandıktan sonra e-posta doğrulanmadıysa, döndürülemeyeceğini, bu durumda aşağıdaki kodun yardımcı olduğunu tespit etti.

facebookLoginButton.setReadPermissions("email"); 

Umut Abo bu miktar daha yardım ile

+4

Benim için çalışıyor, ilk cevap ne işe yaramıyor, emai her zaman boştu –

+0

@vishal .. plz refere bana örnek veya "[email protected]" örnek kod gönder ... –