use*_*910 10 java android facebook android-studio
我通过stackoverflow搜索了很多,但我找不到解决我的问题的答案.因此我发布这个.
我有一个示例Android应用程序,我正在尝试使用Facebook登录.以下是我遵循的步骤:
环境:Android工作室Android SDK版本:22 Facebook SDK:4.0
按照以下步骤在模拟器上安装FB APK,生成Developer哈希密钥并在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"/>
Run Code Online (Sandbox Code Playgroud)
在我的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" />
Run Code Online (Sandbox Code Playgroud)
最后在我的主要活动中我有这个
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);
}}
Run Code Online (Sandbox Code Playgroud)
我得到一个空指针异常,如下所示
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)
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
Dan*_*ent 16
看起来你得到的是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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
崩溃似乎与我们在AndoridMenifest.xml文件中设置的applicationId有关.正如我想通知,当facebook sdk正在打造创建时,LoginFramment然后ApplicationId正在进行中.这null是onCreate 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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如varoius帖子所指出的,applicationId是null,因为app_idandroid没有正确解析字符串资源.
https://github.com/jamesward/AndroidStringBug
我通过在初始化facebook sdk之后手动设置applicationId解决了这个问题,onCreate方法如下所示.
FacebookSdk.sdkInitialize(getApplicationContext());
FacebookSdk.setApplicationId(getResources().getString(R.string.app_id));
mFacebookCallbackManager = CallbackManager.Factory.create();
Run Code Online (Sandbox Code Playgroud)