Issues creating login button using Facebook SDK 4.

2019-03-01 12:05发布

I am trying to create an application, which will allow users to sign in via their Facebook accounts. I wanted to use the new Facebook SDK 4.1.2 via eclipse. To use the new SDK in eclipse, I followed this tutorial. I am now able to remove all the errors from the facebook SDK without in eclipse. Then, I started following these steps in order to integrate FB in a sample application using the new SDK.

I have proceeded like:

The MainActivity:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.facebook.CallbackManager;
import com.facebook.FacebookSdk;

public class MainActivity extends FragmentActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FacebookSdk.sdkInitialize(getApplicationContext());
        if (savedInstanceState == null) {
            getFragmentManager()
                    .beginTransaction()
                    .add(R.id.fragmentParentViewGroup, new FacebookFragment())
                    .commit();
        }
    }




}

activity_main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:id="@+id/fragmentParentViewGroup"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:context=".MyActivity"
             tools:ignore="MergeRootFrame" />

The FacebookFragment:

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

public class FacebookFragment extends Fragment{
    CallbackManager callbackManager;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.facebook_fragment, parentViewGroup, false);
        FacebookSdk.sdkInitialize(getActivity());
        callbackManager = CallbackManager.Factory.create();
        LoginButton loginButton = (LoginButton) rootView.findViewById(R.id.login_button);
        loginButton.setReadPermissions("user_friends");
        // If using in a fragment
       // loginButton.setFragment(this);    
     // Callback registration
        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
            }

            @Override
            public void onCancel() {
                // App code
            }

            @Override
            public void onError(FacebookException exception) {
                // App code
            }
        });    
        return rootView;
    }
}

The facebook_fragment.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:background="#FFFFFF">

       <com.facebook.login.widget.LoginButton
    android:id="@+id/login_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="30dp"
    android:layout_marginBottom="30dp" />   

    </RelativeLayout>

The manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.facbooksdk4test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.facbooksdk4test.MainActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id" />

        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    </application>

</manifest>

After doing all the above I am still getting initialization errors. The logcat report:

06-01 15:23:41.670: E/AndroidRuntime(23571): FATAL EXCEPTION: main
06-01 15:23:41.670: E/AndroidRuntime(23571): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.facbooksdk4test/com.facbooksdk4test.MainActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class com.facebook.login.widget.LoginButton
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2252)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2306)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.ActivityThread.access$700(ActivityThread.java:153)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1286)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.os.Looper.loop(Looper.java:176)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.ActivityThread.main(ActivityThread.java:5302)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at java.lang.reflect.Method.invokeNative(Native Method)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at java.lang.reflect.Method.invoke(Method.java:511)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at dalvik.system.NativeStart.main(Native Method)
06-01 15:23:41.670: E/AndroidRuntime(23571): Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class com.facebook.login.widget.LoginButton
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.view.LayoutInflater.createView(LayoutInflater.java:619)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:693)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at com.facbooksdk4test.FacebookFragment.onCreateView(FacebookFragment.java:22)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.Fragment.performCreateView(Fragment.java:1699)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1075)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.BackStackRecord.run(BackStackRecord.java:682)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1455)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.Activity.performStart(Activity.java:5335)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2224)
06-01 15:23:41.670: E/AndroidRuntime(23571):    ... 11 more
06-01 15:23:41.670: E/AndroidRuntime(23571): Caused by: java.lang.reflect.InvocationTargetException
06-01 15:23:41.670: E/AndroidRuntime(23571):    at java.lang.reflect.Constructor.constructNative(Native Method)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at android.view.LayoutInflater.createView(LayoutInflater.java:593)
06-01 15:23:41.670: E/AndroidRuntime(23571):    ... 24 more
06-01 15:23:41.670: E/AndroidRuntime(23571): Caused by: java.lang.NoClassDefFoundError: com.facebook.R$styleable
06-01 15:23:41.670: E/AndroidRuntime(23571):    at com.facebook.login.widget.LoginButton.parseLoginButtonAttributes(LoginButton.java:607)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at com.facebook.login.widget.LoginButton.configureButton(LoginButton.java:571)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at com.facebook.FacebookButtonBase.<init>(FacebookButtonBase.java:66)
06-01 15:23:41.670: E/AndroidRuntime(23571):    at com.facebook.login.widget.LoginButton.<init>(LoginButton.java:209)
06-01 15:23:41.670: E/AndroidRuntime(23571):    ... 27 more

I am not sure where I am going wrong, or what should be done to fix the issues. Please suggest me what is to be done to fix the same.

4条回答
太酷不给撩
2楼-- · 2019-03-01 12:26

Make sure you initialized facebook SDK before inflater.

FacebookSdk.sdkInitialize(getActivity());
View rootView = inflater.inflate(R.layout.facebook_fragment, parentViewGroup, false);
查看更多
Luminary・发光体
3楼-- · 2019-03-01 12:34

The issue may arise due to non-initialization of FacebookSdk before its usage. Try initializing facebook sdk before :

1.setContentView(R.layout.activity_main); (In Activity)

2.View rootView = inflater.inflate(R.layout.facebook_fragment, parentViewGroup, false); (In fragment)

Hope this helps!

查看更多
Rolldiameter
4楼-- · 2019-03-01 12:37

I don't see in your code onActivityResult method. It is required for properly SDK workflow.

You need to add it to the MainActivity:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}

Cause:

Every activity and fragment that you integrate with the FacebookSDK Login or Share should forward onActivityResult to the callbackManager.

You can find it in documentation here.

查看更多
Rolldiameter
5楼-- · 2019-03-01 12:39

You initialized facebook sdk in both MainActivity and FacebookFragment, that is not needed, only once is enough and you better initialize it in the superclass, here probably in your MainActivity.

Remove this line FacebookSdk.sdkInitialize(getActivity()); from FacebookFragemet,

and swap lines as follows in MainActivity

FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_main);
查看更多
登录 后发表回答