Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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 ?

2 Solutions collect form web for “Facebook login nulo apuntador excepción android”

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(); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.