2015-04-29 17 views
7

Sto tentando di migrare il codice di accesso di una vecchia applicazione da SDK 3.0 a SDK 4.0. Ho implementato l'accesso utilizzando lo LoginManager, in quanto ho pulsanti di login personalizzati.Login Facebook SDK 4.0 Android con LoginManager

Il problema è che non ottengo risposta dall'API di Facebook. Nessun successo, nessun errore, nessuna eccezione generata. Il codice è il seguente:

//global refs 
    //callbacks 
    private CallbackManager mCallbackManager; 
    private FacebookCallback<LoginResult> mFacebookCallback; 

    private List<String> mPermissions = Arrays.asList("email"); 
    private LoginManager mLoginMgr; 
    private Activity mActivity; 

    //........ 

    //code is inside method 
    FacebookSdk.sdkInitialize(getApplicationContext()); 

    //perhaps a bit excessive 
    FacebookSdk.addLoggingBehavior(LoggingBehavior.GRAPH_API_DEBUG_INFO); 
    FacebookSdk.addLoggingBehavior(LoggingBehavior.DEVELOPER_ERRORS); 
    FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 
    FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_RAW_RESPONSES); 
    FacebookSdk.setApplicationId(mActivity.getString(R.string.sample_fb_id)); 

    //init callbacks 
    mFacebookCallback = new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Log.v("LoginActivity login", loginResult.toString()); 
      GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { 
       @Override 
       public void onCompleted(JSONObject object, GraphResponse response) { 
        // Application code 
        Log.v("LoginActivity", response.toString()); 
        try { 
         String email = object.getString("email"); 
         Log.v("LoginActivity", "obtained email: ", email); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
      request.executeAsync(); 
     } 
     @Override 
     public void onCancel() { 
      Log.e("LoginActivity", "facebook login canceled"); 
     } 

     @Override 
     public void onError(FacebookException e) { 
      Log.e("LoginActivity", "facebook login failed error"); 
     } 
    }; 
    mCallbackManager = CallbackManager.Factory.create(); 
    mLoginMgr = LoginManager.getInstance(); 
    mLoginMgr.registerCallback(mCallbackManager, mFacebookCallback); 
    mLoginMgr.logInWithReadPermissions(mActivity, mPermissions); 

Utilizzando la Debugger, sono in grado di vedere che questa linea: mLoginMgr.logInWithReadPermissions(mActivity, mPermissions); Viene eseguito, ma nessuno dei callbacks sono mai attivati. Non ho errori nella console e lo schermo del dispositivo diventa nero e non succede nulla.

Non credo che importi, ma il codice viene eseguito in una classe wrapper (all'esterno di Activity). Ho provato all'interno dello Activity, ma non ha fatto alcuna differenza.

Qualche suggerimento? Molto apprezzato.

Edit:

Questo è dichiarata all'interno AndroidManifest.xml:

<activity android:name="com.facebook.FacebookActivity" 
      android:theme="@android:style/Theme.Translucent.NoTitleBar" 
      android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" 
      android:label="@string/app_name" /> 
+0

Hai configurato AndroidManifest.xml per la [guida alla migrazione] (https://developers.facebook.com/docs/android/upgrading-4.x)? – Kai

+0

Sì, come da documentazione. 'App_id' viene fornito in modo programmatico, perché l'app è localizzata. – nightfixed

+0

È davvero strano, magari prova la loro app di esempio e assicurati che la tua app di Facebook sul sito Web di dev sia impostata correttamente. Ho riscontrato alcuni problemi durante la migrazione, ma non qualcosa del genere. – Kai

risposta

10

Se il codice è in un frammento, non utilizzare mActivity variabile come contesto di attività.

di fare:

  1. Aggiungi una linea:

    callbackManager.onActivityResult(requestCode, resultCode, data); in onActivityResult(, , ,) in fragment. 
    
  2. chiamata:

    LoginManager.getInstance().logInWithReadPermissions(**this**, Arrays.asList("public_profile", "user_friends")); 
    

Usa questo, Non usare this.getActivity()

  1. Certo, fatto.
+0

In effetti, il problema era che ho dimenticato di aggiungere la chiamata a 'callbackManager.onActivityResult()'; sfortunatamente, non posso accettare entrambe le risposte. – nightfixed

+1

2. Chiama: LoginManager.getInstance(). LogInWithReadPermissions (** this **, Arrays.asList ("public_profile", "user_friends")); , Android Studio lamentava "nessun metodo per risolvere" –

4

Ho avuto anche questo problema. È venuto fuori che ho dimenticato di aggiungere la chiamata a callbackManager.onActivityResult() in Activity.onActivityResult() come nella parte inferiore dello Register a Callback section della guida di accesso.

Così, alla attività in cui si sta facendo Facebook login, si dovrebbe avere qualcosa di simile:

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

'questo quello che ti mancava?

+0

Questa risposta mi ha permesso di risparmiare tempo lavorando con Xamarin.Facebook SDK per Android. Grazie. –

Problemi correlati