Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Any Example showing how to login using Facebook SDK 4.0 in Android either by using own button or Facebook Button?

Is there any tutorial or example showing how to login using own Button using Facebook SDK 4.0 in Android? I am not getting anywhere and using facebook developers site it is difficult to understand.Like below when calling FBlogin button I want to check go for login if user has not logged in or if logged in I want the access token to get facebook profile information and user likes.

FBlogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             //Facebook login Code to get profile info and user likes  
        }
    });

I have tried also loginButton Facebook.

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

/>

But it is showing error in xml :-

java.lang.NoClassDefFoundError: Could not initialize class com.facebook.login.widget.LoginButton
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:413)
    at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:105)
    at com.android.tools.idea.rendering.LayoutlibCallback.loadView(LayoutlibCallback.java:176)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:206)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:131)
    at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:739)
    at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:64)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:711)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:372)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:369)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:326)
    at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:350)
    at com.android.tools.idea.rendering.RenderService$5.compute(RenderService.java:708)
    at com.android.tools.idea.rendering.RenderService$5.compute(RenderService.java:697)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:932)
    at com.android.tools.idea.rendering.RenderService.createRenderSession(RenderService.java:697)
    at com.android.tools.idea.rendering.RenderService.render(RenderService.java:816)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:646)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1700(AndroidLayoutPreviewToolWindowManager.java:82)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7$1.run(AndroidLayoutPreviewToolWindowManager.java:589)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178)
    at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7.run(AndroidLayoutPreviewToolWindowManager.java:584)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310)
    at com.intellij.util.ui.update.MergingUpdateQueue$2.run(MergingUpdateQueue.java:254)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227)
    at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217)
    at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
    at com.intellij.util.Alarm$Request$1.run(Alarm.java:327)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

My Activity class:-

protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);

Ia there any example/tutorial to login using facebook sdk4.0? I am stuck in both way. Please help.

like image 415
Rituraj Singh Avatar asked Mar 29 '15 18:03

Rituraj Singh


3 Answers

This might help you

// Custom button
private Button fbbutton;

// Creating Facebook CallbackManager Value
public static CallbackManager callbackmanager;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Initialize SDK before setContentView(Layout ID)
    FacebookSdk.sdkInitialize(getApplicationContext());

    setContentView(R.layout.activity_main);

    // Initialize layout button
    fbbutton = (Button) findViewById(R.id.button2);

    fbbutton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Call private method
            onFblogin();
        }
    });

}

// Private method to handle Facebook login and callback
private void onFblogin()
{
    callbackmanager = CallbackManager.Factory.create();

    // Set permissions 
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email","user_photos","public_profile"));

    LoginManager.getInstance().registerCallback(callbackmanager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {

                    System.out.println("Success");
                    GraphRequest.newMeRequest(
                            loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject json, GraphResponse response) {
                                    if (response.getError() != null) {
                                        // handle error
                                        System.out.println("ERROR");
                                    } else {
                                        System.out.println("Success");
                                        try {

                                            String jsonresult = String.valueOf(json);
                                            System.out.println("JSON Result"+jsonresult);

                                            String str_email = json.getString("email");
                                            String str_id = json.getString("id");
                                            String str_firstname = json.getString("first_name");
                                            String str_lastname = json.getString("last_name");

                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }

                            }).executeAsync();

                }

                @Override
                public void onCancel() {
                    Log.d(TAG_CANCEL,"On cancel");
                }

                @Override
                public void onError(FacebookException error) { 
                    Log.d(TAG_ERROR,error.toString());
                }
    });
}

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

    callbackmanager.onActivityResult(requestCode, resultCode, data);
}

In manifest add following,

<application
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    .
    .
     <!-- [START Facebook] -->
    <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" />

    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id" />
    <!-- [END Facebook] -->
    .
    .
</application>
like image 99
ManishSB Avatar answered Nov 04 '22 19:11

ManishSB


The best solution is to log in by using LoginManager. Here is how I managed this ( on click is made with ButterKnife ):

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    mCallbackManager = CallbackManager.Factory.create();
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    LoginManager.getInstance().registerCallback(mCallbackManager, this);
}

@OnClick(R.id.facebook_login_button)
@SuppressWarnings("unused")
public void loginWithFacebookAccount() {
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));
}

@Override
public void onSuccess(LoginResult loginResult) {
    Bundle parameters = new Bundle();
    parameters.putString("fields", "id,name,last_name,link,email,picture");
    GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), (jsonObject, graphResponse) -> {
        String id = null;
        if (jsonObject != null) {
            try {
                id = jsonObject.getString("id");
            } catch (JSONException e) {
                e.printStackTrace();
            }                
        }
    });
    request.setParameters(parameters);
    request.executeAsync();
}

@Override
public void onCancel() {

}

@Override
public void onError(FacebookException e) {
}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        mCallbackManager.onActivityResult(requestCode, resultCode, data);           
    }
}

So this is how I've made it. Feel free to ask ;)

like image 15
Mariusz Brona Avatar answered Nov 04 '22 19:11

Mariusz Brona


public class AuthWFacebookSDKFour extends Activity implements View.OnClickListener,FacebookCallback<LoginResult>   {

    List<String> permissionNeeds=Arrays.asList("user_photos","friends_photos", "email", "user_birthday", "user_friends");

    //facebook callbacks manager
    private CallbackManager cm;
    private LoginButton mFbLoginButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //init facebook sdk and 
        FacebookSdk.sdkInitialize(getApplicationContext());

        //instantiate callbacks manager
        mCallbackManager = CallbackManager.Factory.create();


        mFbLoginButton=(LoginButton)findViewById(R.id.FBBUTTONID);

        //set permissions mFbLoginButton.setReadPermissions(ApplicationContext.facebookPermissions);
        // register callback
        //means hey facebook after login call onActivityResult of **this**  
        mFbLoginButton.registerCallback(mCallbackManager, this);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        //manage login result
        mCallbackManager.onActivityResult(requestCode, resultCode, data);
    }


    @Override
    public void onSuccess(LoginResult loginResults) {


        //login ok  get access token 
        AccessToken.getActiveAccessToken();   

    }
    @Override
    public void onCancel() {

        Log.e(TAG(),"facebook login canceled");

    }


    @Override
    public void onError(FacebookException e) {



        Log.e(TAG(),"facebook login failed error");

    }






}

remember to insert in manifest

<activity
 android:name="com.facebook.FacebookActivity"
 android:label="@string/app_name"
 android:theme="@android:style/Theme.Translucent.NoTitleBar"
                />
like image 5
dnocode Avatar answered Nov 04 '22 19:11

dnocode