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