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í:
- Android AudioRecord leer siempre devuelve -3 (ERROR_INVALID_OPERATION)
- Otros recursos $ NotFoundException en setContentView
- Android NDK tutorial / guía para principiantes.
- Android Dx advertencia: Ignorar el atributo InnerClasses para un problema de archivo interno anónimo jar
- ¿El Apache DefaultHttpClient (Android) y NSURLConnection (iOS) vuelven a intentar las conexiones fallidas con versiones de protocolo anteriores?
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 ?
- Cómo convertir una aplicación de swing java para trabajar en android
- ¿Debo importar android.graphics.camera o android.hardware.camera?
- Cómo jugar notas individuales de archivo midi en LibGDX?
- ListView con disposición de filas personalizada - Android
- Implementación de HeartBeat en Atmosphere Framework (Android)
- Problemas con MediaRecorder al iniciar la captura de vídeo en android
- Cómo agregar HashMap a ArrayList
- No se puede ejecutar un AlertDialog en un método doInbackground ()
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();
- La etiqueta <uses-permission> aparece después de la etiqueta <application>
- ¿Cuál es el nombre del paquete del Android Market o de Google Apps