我是Android的新手。我试图将FB登录与我的Android应用程序集成。我已经按照 developers.facebook.com 的所有说明进行了此集成。但是,当我尝试运行我的应用程序时,它在启动时崩溃。
请注意,我的AndroidManifest.xml中已经有Facebook应用程序ID,元数据标签,Android活动标签。
以下是布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:background="@drawable/background">
<RelativeLayout android:id="@+id/container" android:layout_width="match_parent"
android:paddingBottom="20dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="20dp"
android:layout_height="match_parent"
android:background="#85000000">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/topSocialLoginLayout"
android:paddingLeft="40dp"
android:paddingRight="40dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp">
<com.facebook.login.widget.LoginButton
android:id="@+id/btnFacebook"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_weight="5"/>
<com.google.android.gms.common.SignInButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:id="@+id/btnGoogle"
android:layout_weight="5" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:id="@+id/relLayoutMainLogin"
android:layout_below="@id/topSocialLoginLayout">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:inputType="textEmailAddress"
android:layout_alignParentTop="true"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:hint="@string/email"
android:textColor="#fd9a22"
android:textCursorDrawable="@drawable/cursor_color"
android:textColorHint="#ffffff"
android:id="@+id/txtUser"
android:background="@drawable/edit_text"
android:drawableLeft="@drawable/dr_email"
android:drawablePadding="10dp"
android:paddingLeft="-3dp"
android:singleLine="true" />
<EditText
android:layout_width="match_parent"
android:inputType="textPassword"
android:layout_height="wrap_content"
android:layout_below="@id/txtUser"
android:id="@+id/txtPwd"
android:hint="@string/pwd"
android:textColor="#fd9a22"
android:textCursorDrawable="@drawable/cursor_color"
android:textColorHint="#ffffff"
android:layout_marginTop="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/edit_text"
android:drawableLeft="@drawable/dr_pwd"
android:drawablePadding="10dp"/>
<Button
android:layout_width="match_parent"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp"
android:layout_below="@id/txtPwd"
android:layout_height="wrap_content"
android:text="@string/sign_in"
android:id="@+id/btnSignIn"
android:background="@drawable/ainovatheme_btn_default_holo_light"
android:onClick="login"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btnSignIn"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#fd9a22"
android:background="#85000000"
android:id="@+id/txtLoginErr"
android:layout_marginBottom="5dp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/txtLoginErr"
android:text="@string/forgot_pwd"
android:textColor="#ffffff"
android:id="@+id/btnForgotPwd"
android:onClick="forgotPassword"
style="?android:attr/borderlessButtonStyle"/>
<ImageView
android:layout_width="fill_parent"
android:id="@+id/hrLine"
android:layout_height="2dp"
android:layout_below="@id/btnForgotPwd"
android:background="#d4dce9" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/hrLine"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_centerHorizontal="true"
android:text="@string/create_account"
android:textColor="#fd9a22"
android:id="@+id/btnCreateAccountActivity"
android:onClick="createAccount"
style="?android:attr/borderlessButtonStyle" />
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
以下是我的登录活动的代码片段:
private CallbackManager mCallbackManager;
private FacebookCallback<LoginResult> mCallback = new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
try {
String email = object.getString("email");
Log.d("Output" + "User email ", email);
String password = object.toString();
Log.d("Output" + "User psw", password);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
request.executeAsync();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException e) {
}
};
// ####### Facebook Sign In Coding - End #######
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
//check for internet connection
if (!isConnectedToInternet())
{
//dialog if internet is not connetd
createNetErrorDialog();
}
FacebookSdk.sdkInitialize(this); // ####### Facebook Sign In Coding
mCallbackManager = CallbackManager.Factory.create(); // ####### Facebook Sign In Coding
LoginButton FBloginButton = (LoginButton) findViewById(R.id.btnFacebook); // ####### Facebook Sign In Coding
FBloginButton.setReadPermissions(Arrays.asList("public_profile, email, user_birthday")); // ####### Facebook Sign In Coding
FBloginButton.registerCallback(mCallbackManager, mCallback); // ####### Facebook Sign In Coding
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
以下是我得到的异常:
java.lang.ExceptionInInitializerError
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:593)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:693)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:360)
at android.app.Activity.setContentView(Activity.java:1932)
at ainova.jaesa.android.main.LoginActivity.onCreate(LoginActivity.java:97)
at android.app.Activity.performCreate(Activity.java:5326)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
at android.app.ActivityThread.access$700(ActivityThread.java:158)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5365)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: null
at com.facebook.internal.Validate.sdkInitialized(Validate.java:99)
at com.facebook.FacebookSdk.getCallbackRequestCodeOffset(FacebookSdk.java:735)
at com.facebook.internal.CallbackManagerImpl$RequestCodeOffset.toRequestCode(CallbackManagerImpl.java:109)
at com.facebook.login.widget.LoginButton.<clinit>(LoginButton.java:58)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:593)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:693)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:360)
at android.app.Activity.setContentView(Activity.java:1932)
at ainova.jaesa.android.main.LoginActivity.onCreate(LoginActivity.java:97)
at android.app.Activity.performCreate(Activity.java:5326)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
at android.app.ActivityThread.access$700(ActivityThread.java:158)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5365)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
1. 您的第一个错误:
Caused by: null
at com.facebook.internal.Validate.sdkInitialized(Validate.java:99)
它抛出了一个FacebookSdkNotInitializedException
您需要在setContentView()
之前致电FacebookSdk.sdkInitialize(Context)
在活动的 onCreate 方法中,将其更改为:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// here
FacebookSdk.sdkInitialize(this); // ####### Facebook Sign In Coding
setContentView(R.layout.login);
//check for internet connection
if (!isConnectedToInternet())
{
//dialog if internet is not connetd
createNetErrorDialog();
}
更新
2. 第二个错误: NullPointerException
:
你得到一个 NullPointerException,因为你在调用setContentView()
之前调用findViewById()
,所以当你调用loginButton.registerCallback()时,loginButton 是空的。
只需将调用移动到顶部setContentView() t
:(您的完整oncreate方法应该是这样的):
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this); // ####### Facebook Sign In Coding
setContentView(R.layout.login);
//check for internet connection
if (!isConnectedToInternet())
{
//dialog if internet is not connetd
createNetErrorDialog();
}
mCallbackManager = CallbackManager.Factory.create(); // ####### Facebook Sign In Coding
LoginButton FBloginButton = (LoginButton) findViewById(R.id.btnFacebook); // ####### Facebook Sign In Coding
FBloginButton.setReadPermissions(Arrays.asList("public_profile, email, user_birthday")); // ####### Facebook Sign In Coding
FBloginButton.registerCallback(mCallbackManager, mCallback); // ####### Facebook Sign In Coding
}
在调用setContentView
之前运行FacebookSdk.sdkInitiaize
。