2015-04-05 26 views
8

Szukałem dużo przez stackoverflow, ale nie mogłem znaleźć odpowiedzi, która rozwiązuje mój problem. Dlatego zamieszczam to.facebook login null wskaźnik wyjątek android

Mam przykładową aplikację na Androida, w której staram się korzystać z Facebooka. Oto kroki, że następuje:

Środowisko: Android studio Android SDK wersja: 22 Facebook SDK: 4,0

Obserwowani kroki, aby zainstalować FB APK na emulatorze, wygenerowany klucz hash Twórca i aktualizowane go w aplikacji-> ustawienia. Mój android manifestu ma te kod

<uses-permission android:name="android.permission.INTERNET"/> 

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

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> 

W moim pliku układu activity_main.xml, mam ten fragment kodu

<com.facebook.login.widget.LoginButton 
    android:id="@+id/fblogin_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:layout_marginTop="30dp" 
    android:layout_marginBottom="30dp" /> 

i wreszcie w moim głównym Aktywny mam ten

public class MainActivity extends Activity { 
LoginButton loginButton; 
CallbackManager callbackManager; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    FacebookSdk.sdkInitialize(getApplicationContext()); 
    callbackManager = CallbackManager.Factory.create(); 
    loginButton = (LoginButton) findViewById(R.id.fblogin_button); 
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Toast.makeText(getApplicationContext(),"Fb Login Success",Toast.LENGTH_LONG); 
     } 

     @Override 
     public void onCancel() { 
      Toast.makeText(getApplicationContext(),"Fb on cancel",Toast.LENGTH_LONG); 
     } 

     @Override 
     public void onError(FacebookException e) { 
      Toast.makeText(getApplicationContext(),"Fb Login Error",Toast.LENGTH_LONG); 
     } 
    }); 
    setContentView(R.layout.activity_main); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.d("Inside Fb login","on Activiry result"); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 
}} 

Otrzymuję wyjątek wskaźnika pustego, jak pokazano poniżej:

java.lang.RuntimeException: Unable to start activity componentInfo{PROJECT.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.login.widget.LoginButton.registerCallback(com.facebook.CallbackManager, com.facebook.FacebookCallback)' on a null object reference 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
     at android.app.ActivityThread.access$800(ActivityThread.java:144) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Czego mi tu brakuje?

Odpowiedz

13

Wygląda dostajesz NullPointerException ponieważ dzwonisz findViewById() przed wywołaniem setContentView(), więc loginButton jest null gdy dzwonisz loginButton.registerCallback().

Wystarczy przesunąć wywołanie setContentView() na górę:

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

    FacebookSdk.sdkInitialize(getApplicationContext()); 

    setContentView(R.layout.activity_main); //Moved up here to resolve NPE 

    callbackManager = CallbackManager.Factory.create(); 
    loginButton = (LoginButton) findViewById(R.id.fblogin_button); 
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Toast.makeText(getApplicationContext(),"Fb Login Success",Toast.LENGTH_LONG); 
     } 

     @Override 
     public void onCancel() { 
      Toast.makeText(getApplicationContext(),"Fb on cancel",Toast.LENGTH_LONG); 
     } 

     @Override 
     public void onError(FacebookException e) { 
      Toast.makeText(getApplicationContext(),"Fb Login Error",Toast.LENGTH_LONG); 
     } 
    }); 

} 
+0

umieszczanie FacebookSdk.sdkInitialize (getApplicationContext()); przed setContentView (R.layout.activity_main); załatwił sprawę. Dziękujemy za pomoc @Daniel – user2752910

8

Katastrofa wydaje się być związane z applicationId jesteśmy ustawienie w pliku AndoridMenifest.xml. Jak już zorientowali się, że kiedy facebook SDK jest wiązana, aby stworzyć LoginFramment następnie ApplicationId nadchodzi jako null .Tutaj jest onCreate metoda com.facebook.login.LoginFragment klasy

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState != null) { 
      this.loginClient = (LoginClient)savedInstanceState.getParcelable("loginClient"); 
      this.loginClient.setFragment(this); 
     } else { 
      this.loginClient = new LoginClient(this); 
     } 

     this.loginClient.setOnCompletedListener(new OnCompletedListener() { 
      public void onCompleted(Result outcome) { 
       LoginFragment.this.onLoginClientCompleted(outcome); 
      } 
     }); 
     FragmentActivity activity = this.getActivity(); 
     if(activity != null) { 
      this.initializeCallingPackage(activity); 
      if(activity.getIntent() != null) { 
       //the applicationId in this.request object is null 
       this.request = (Request)activity.getIntent().getParcelableExtra("request"); 

      } 

     } 
    } 

jak wskazano przez varoius opublikować applicationId nadchodzi zerowa ponieważ struny zasób app_id nie jest poprawnie przetwarzany przez system Android. https://github.com/jamesward/AndroidStringBug

Rozwiązałem ten problem, ustawiając identyfikator aplikacji ręcznie po zainicjowaniu metody facebook sdk, jak podano poniżej w metodzie onCreate.

FacebookSdk.sdkInitialize(getApplicationContext()); 
FacebookSdk.setApplicationId(getResources().getString(R.string.app_id)); 
mFacebookCallbackManager = CallbackManager.Factory.create(); 
+0

dlaczego ciąg metadanych nie działa?Mam ten sam problem ... zrobiłeś to, co zasugerowałeś. – behinddwalls

+0

Mam ten sam problem, a teraz nie wiem, jak rozwiązać go z najnowszym SDK, ponieważ wycofuje metodę sdkInitiliaze iz tego powodu nie pozwala mi ustawić ApplicationId witihin onCreate? jakieś sugestie? – batmaci

+0

Po prostu przedrost wartość metadanych za pomocą fb, patrz kod źródłowy: https://github.com/facebook/facebook-android-sdk/blob/sdk-version-4.8.0/facebook/src/main/java/com /facebook/FacebookSdk.java#L598 – ballzak

0

asj wskazany problem występuje zwykle przy braku odczytu ApplicationId. w moim przypadku Problem dotyczył przestrzeni nazw. upewnij się, że twoja przestrzeń nazw klasy jest główną przestrzenią nazw. Więc moja aplikacja to aplikacja Android Xamarin i używałem przestrzeni nazw jak poniżej, ale moja przestrzeń nazw mojej aplikacji na Androida to myApp.Droid, w ten sposób ApplicaitonId nie jest czytany z pliku strings.xml zmieniającego się na myApp.Droid naprawił mój problem. Mam nadzieję, że pomaga to każdemu, kto ma podobny problem:

[assembly: MetaData("com.facebook.sdk.ApplicationId", Value = "@string/app_id")] 
namespace myApp.Droid.Renderer 
Powiązane problemy