2016-01-08 12 views
5

Próbuję zaimplementować prosty login na Facebooku na mojej aplikacji na Androida. Kiedy klikam przycisk logowania, aplikacja jest przekierowywana na stronę na Facebooku, po wprowadzeniu danych jest ponownie zwracana do mojej aplikacji. Ale funkcje wywołania zwrotnego LoginButton nie są wywoływane. Chociaż było kilka pytań podobnych do tego, ale mieli oddzielną klasę fragmentów. Jednak robię wszystko od głównej działalności. Oto mój kod:Facebook LoginButton callback nie nazywa się

package com.example.ankur.facebookdemo; 

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Toast; 

import com.facebook.CallbackManager; 
import com.facebook.FacebookCallback; 
import com.facebook.FacebookException; 
import com.facebook.FacebookSdk; 
import com.facebook.login.LoginResult; 
import com.facebook.login.widget.LoginButton; 

public class MainActivity extends AppCompatActivity { 
    private LoginButton loginButton; 
    CallbackManager callbackManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); 
     callbackManager = CallbackManager.Factory.create(); 
     setContentView(R.layout.activity_main); 

     loginButton = (LoginButton) findViewById(R.id.login_button); 
     if (loginButton == null) { 
      Log.v("CheckLogin", "null"); 
     } 
     else { 
      Log.v("CheckLogin", "not null"); 
     } 


     loginButton.setReadPermissions("user_friends"); 

     loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 
       // App code 
       Toast.makeText(getApplicationContext(),"Fb Login Success", Toast.LENGTH_LONG); 
       Log.v("CheckLogin", "successfully connected to facebook"); 
      } 

      @Override 
      public void onCancel() { 
       // App code 
       Toast.makeText(getApplicationContext(),"Fb on cancel",Toast.LENGTH_LONG); 
       Log.v("CheckLogin", " connection to facebook cancelled"); 

      } 

      @Override 
      public void onError(FacebookException exception) { 
       // App code 
       Toast.makeText(getApplicationContext(),"Fb Login Error",Toast.LENGTH_LONG); 
       Log.v("CheckLogin", "Error on connection to facebook"); 
      } 
     }); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 
+0

z jaką zależnością budowania SDK FB? exmpl: facebookSDK = 'com.facebook.android:facebook-android-sdk:4.6.0' –

Odpowiedz

10

Użytkownik zapomniał zastąpić metodę onActivityResult(). onActivityResult() powoduje wywołanie metod wywołania zwrotnego.

zrobić coś takiego:

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

Nadzieja to pomaga! Wszystkie najlepsze :)

+0

Wielkie dzięki! Naprawiono problem. –

+0

Witaj Narayan, mam teraz inny problem z wywołania zwrotnego. Kod wywołuje oddzwanianie onSuktywne w Sukcesie, ale kiedy klikam przycisk wylogowania, funkcja onCancel nie jest wywoływana. Powiedziałem to w innym pytaniu: http://stackoverflow.com/questions/34978263/facebook-sdk-android-onsuccess-called-but-oncancel-not-called –

2

Brakuje onActivityResult Hak:

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

The documentation wyraźnie stwierdza, że:

Każda działalność i fragment, który można zintegrować z FacebookSDK Zaloguj lub akcji powinien forward onActivityResult do callbackManager.

+0

Wielkie dzięki! Naprawiono problem. –

+0

dane powracają z dodatkami celowymi jako Paczki, co jest w paczce? – JPM