2015-04-05 53 views
8

我通过stackoverflow搜索了很多,但我找不到解决我的问题的答案。因此我张贴这个。facebook登录空指针异常android

我有一个示例Android应用程序,我试图使用Facebook登录。下面是我遵循的步骤:

环境:Android的工作室 的Android SDK版本:22 Facebook的SDK:4.0

遵循的步骤,以在模拟器上安装FB APK,所产生的开发哈希键和更新它在应用程序 - >设置中。 我的Android清单包含这些代码

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

在我activity_main.xml中布局文件,我有这样的一段代码

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

最后,在我的主要活动我有这个

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

我收到一个空指针异常,如下所示

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) 

我在这里错过了什么?

回答

13

看起来像你得到一个NullPointerException因为你打电话findViewById()你打电话之前setContentView(),所以loginButton为空当你调用loginButton.registerCallback()

通话刚刚转会setContentView()顶端:

@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

放置FacebookSdk.sdkInitialize(getApplicationContext());在 之前setContentView(R.layout.activity_main);诀窍。感谢您的帮助@Daniel – user2752910 2015-04-10 06:02:43

8

崩溃,似乎与我们在AndoridMenifest.xml文件中设置的applicationID。正如我想通了,当Facebook SDK是绑创建LoginFramment随后的applicationID是作为正在添加。这里nullcom.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"); 

      } 

     } 
    } 

正如varoius指出的onCreate方法张贴的applicationID来了空,因为该字符串资源app_id未被android正确解析。 https://github.com/jamesward/AndroidStringBug

我通过在初始化facebook sdk后手动设置applicationId来解决这个问题,如下面onCreate方法中给出的。

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

为什么元数据字符串不工作?我得到了同样的问题...做了你的建议。 – behinddwalls 2017-01-10 04:05:57

+0

我有同样的问题,现在我不知道如何解决它与最新的SDK,因为它弃用sdkInitiliaze方法,因为它不允许我设置ApplicationId witihin onCreate?任何建议? – batmaci 2017-11-12 02:56:51

+0

只需使用fb前缀元数据值,请参阅源代码:https://github.com/facebook/facebook-android-sdk/blob/sdk-version-4.8.0/facebook/src/main/java/com /facebook/FacebookSdk.java#L598 – ballzak 2018-03-09 12:44:25

0

作为anj指示的问题通常是与ApplicationId没有读取。在我的情况下,问题在于命名空间。确保你的类的名字空间是根名字空间。所以我的应用程序是一个Xamarin的Android应用程序,我使用的命名空间如下,但我的Android应用程序的名称空间是myApp.Droid,这种方式ApplicaitonId不是从strings.xml读取更改为myApp.Droid解决了我的问题。我希望它可以帮助任何有类似问题的人

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