Facebook login nulo apuntador excepción android

Busqué mucho a través de stackoverflow pero no pude encontrar una respuesta que resuelva mi problema. Por lo tanto estoy publicando esto.

Tengo una aplicación de Android de ejemplo en la que estoy intentando utilizar el inicio de sesión de Facebook. Estos son los pasos que seguí:

Entorno: Android studio Android SDK versión: 22 Facebook SDK: 4.0

Siguió los pasos para instalar FB APK en el emulador, generó la clave hash del desarrollador y la actualizó en app-> settings. Mi manifiesto de Android tiene este código

<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"/> 

En mi archivo de presentación activity_main.xml, tengo este fragmento de código

 <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" /> 

Y finalmente en mi actividad principal tengo esto

 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); }} 

Estoy recibiendo una excepción de puntero nulo como se muestra a continuación

  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) 

Que me estoy perdiendo aqui ?

Parece que obtiene una NullPointerException porque llama a findViewById() antes de llamar a setContentView() , por lo que loginButton es nulo cuando llama a loginButton.registerCallback() .

Simplemente mueva la llamada a setContentView() a la parte superior:

 @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); } }); } 

El bloqueo parece estar relacionado con el applicationId que estamos configurando en el archivo AndoridMenifest.xml . Como me di cuenta de que cuando facebook sdk está atando para crear el LoginFramment entonces ApplicationId es comming como null Aquí está el método com.facebook.login.LoginFragment clase com.facebook.login.LoginFragment

 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"); } } } 

Como se ha señalado por el post varoius el ID de aplicación viene nulo porque el recurso de cadena app_id no está siendo analizado correctamente por android. https://github.com/jamesward/AndroidStringBug

He resuelto este problema mediante el ajuste de la applicationId manualmente después de la inicialización de la facebook sdk como se indica a continuación en el método onCreate .

 FacebookSdk.sdkInitialize(getApplicationContext()); FacebookSdk.setApplicationId(getResources().getString(R.string.app_id)); mFacebookCallbackManager = CallbackManager.Factory.create(); 
  • Dibujo personalizado en la lona del mapa de Mapbox
  • Lea desde InputStream usando lectura contra IOUtils.copy
  • Depurando ExpandableListView de la base de datos - no funciona
  • Parcelable y herencia en Android
  • ¿JFreeChart funciona / comple en Android 2.x
  • Cómo cambiar el nombre de un proyecto en Android Studio
  • División de una cadena en Java lanza PatternSyntaxException
  • Diferentes diseños de hijos para diferentes grupos ExpandableListView
  • ¿Cuáles son las unidades de temperatura y voltaje de la batería cuando Intent.BATTERY_ACTION_CHANGED en el dispositivo android?
  • ¿Cuál es la diferencia entre setVideoPath de VideoView y setVideoURI
  • ¿Pueden las aplicaciones de Android usar jarras compuestas java 8?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.