Java facebook登录空指针异常android

Java facebook登录空指针异常android,java,android,facebook,android-studio,Java,Android,Facebook,Android Studio,我在stackoverflow中搜索了很多,但找不到解决我问题的答案。因此,我张贴这个 我有一个示例Android应用程序,我正在尝试使用facebook登录。以下是我遵循的步骤: 环境:安卓工作室 Android SDK版本:22 Facebook SDK:4.0 按照步骤在emulator上安装FB APK,生成开发者哈希键并在app->settings中更新它。 我的android清单包含以下代码 <uses-permission android:name="android.perm

我在stackoverflow中搜索了很多,但找不到解决我问题的答案。因此,我张贴这个

我有一个示例Android应用程序,我正在尝试使用facebook登录。以下是我遵循的步骤:

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

按照步骤在emulator上安装FB APK,生成开发者哈希键并在app->settings中更新它。 我的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"/>

我错过了什么

看起来您得到了一个
NullPointerException
,因为您在调用
setContentView()
之前调用了
findViewById()
,所以当调用
loginButton.registerCallback()
时,
loginButton
为空

只需将对
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);
        }
    });

}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sdkinInitialize(getApplicationContext());
setContentView(R.layout.activity_main);//移到这里来解析NPE
callbackManager=callbackManager.Factory.create();
loginButton=(loginButton)findViewById(R.id.fblogin_按钮);
registerCallback(callbackManager,newfacebookcallback()){
@凌驾
成功时公共无效(LoginResult LoginResult){
Toast.makeText(getApplicationContext(),“Fb登录成功”,Toast.LENGTH\u LONG);
}
@凌驾
公开作废{
Toast.makeText(getApplicationContext(),“取消时Fb”,Toast.LENGTH\u LONG);
}
@凌驾
公共无效onError(FaceBook例外e){
Toast.makeText(getApplicationContext(),“Fb登录错误”,Toast.LENGTH\u LONG);
}
});
}

崩溃似乎与我们在
和idmenifest.xml
文件中设置的应用程序ID有关。正如我发现的,当facebook sdk创建
loginframent
时,ApplicationId将作为
null
提交。下面是
com.facebook.login.loginframent
类的onCreate方法

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 post所指出的,applicationId为空,因为android没有正确解析字符串资源
app\u id

我解决了这个问题,在初始化facebook sdk后手动设置applicationId,如下
onCreate
方法所示

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

正如anj指出的,问题通常是应用程序ID未被读取。在我的例子中,问题在于名称空间。确保类的命名空间是根命名空间。因此,我的应用程序是xamarin android应用程序,我使用的名称空间如下,但我的android应用程序的名称空间是myApp.Droid,这样就不会从strings.xml中读取applicationId,改为myApp.Droid解决了我的问题。我希望它能帮助其他有类似问题的人

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

放置FacebookSdk.sdkinInitialize(getApplicationContext());在setContentView之前(R.layout.activity_main);成功了。感谢您的帮助@daniel为什么元数据字符串不起作用?我也遇到了同样的问题…按照你的建议做了。我也遇到了同样的问题,现在我不知道如何用最新的SDK解决它,因为它不支持sdkInitiliaze方法,也因为它不允许我将ApplicationId设置为onCreate?有什么建议吗?只需在元数据值前面加上fb,请参阅源代码:
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");

            }

        }
    }
FacebookSdk.sdkInitialize(getApplicationContext());
FacebookSdk.setApplicationId(getResources().getString(R.string.app_id));
mFacebookCallbackManager = CallbackManager.Factory.create();
[assembly: MetaData("com.facebook.sdk.ApplicationId", Value = "@string/app_id")]
namespace myApp.Droid.Renderer