Android Facebook Login In Non Activity Class
Solution 1:
You receive the result of login into onActivityResult method of your Activity or Fragment. Then into that method you must pass the result to the CallbackManager. This step is not automatic.
So you need something like this (this the Fragment's method)
@OverridepublicvoidonActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
If you want to implement login in non Activity class you must anyway add at least this code
Solution 2:
There is no documentation about it, but technically it is possible. Here is how I achieved this:
This is my MainActivity:
package com.saddan.facebook_login_mvc;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import com.facebook.login.widget.LoginButton;
publicclassMainActivityextendsAppCompatActivity
{
LoginButton loginButton;
private FacebookLogin Login;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loginButton=findViewById(R.id.login_button);
Login=newFacebookLogin(loginButton,this);
Login.facebookLogin();
Login.checkLoginStatus();
}
@OverrideprotectedvoidonActivityResult(int requestCode, int resultCode,@Nullable Intent data) {
Login.onActivityResultFB(requestCode,resultCode,data);
super.onActivityResult(requestCode, resultCode, data);
}
}
And my Facebook Login Class is:
package com.saddan.facebook_login_mvc;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Arrays;
publicclassFacebookLogin
{
privateLoginButton loginButton;
privateContext context;
privateCallbackManager callbackManager;
publicFacebookLogin(LoginButton loginButton, Context context)
{
this.loginButton = loginButton;
this.context = context;
}
publicvoidfacebookLogin()
{
callbackManager = CallbackManager.Factory.create();
loginButton.setPermissions(Arrays.asList("email","public_profile","user_friends"));
loginButton.registerCallback(callbackManager, newFacebookCallback<LoginResult>()
{
@OverridepublicvoidonSuccess(LoginResult loginResult)
{
Toast.makeText(context, "Login successfull", Toast.LENGTH_SHORT).show();
}
@OverridepublicvoidonCancel()
{
Toast.makeText(context, "cancel", Toast.LENGTH_SHORT).show();
}
@OverridepublicvoidonError(FacebookException error)
{
Toast.makeText(context, "error log", Toast.LENGTH_SHORT).show();
}
});
}
publicvoidonActivityResultFB(int requestCode, int resultCode, Intent data)
{
callbackManager.onActivityResult(requestCode, resultCode,data) ;
}
AccessTokenTracker accessTokenTracker=newAccessTokenTracker() {
@OverrideprotectedvoidonCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken)
{
if(currentAccessToken==null)
{
Toast.makeText(context,"User Logged out",Toast.LENGTH_LONG).show();
}
elseloadUserProfile(currentAccessToken);
}
};
privatevoidloadUserProfile(AccessToken newAccessToken)
{
GraphRequest request = GraphRequest.newMeRequest(newAccessToken, newGraphRequest.GraphJSONObjectCallback() {
@OverridepublicvoidonCompleted(JSONObject object, GraphResponse response)
{
try {
String first_name = object.getString("first_name");
String last_name = object.getString("last_name");
String email = object.getString("email");
String id = object.getString("id");
String image_url = "https://graph.facebook.com/"+id+ "/picture?type=normal";
Log.d("Name", first_name+" "+last_name);
Log.d("email", email);
Log.d("image", image_url);
} catch (JSONException e)
{
e.printStackTrace();
Toast.makeText(context, "exception", Toast.LENGTH_SHORT).show();
Log.d("Error_fb","fb"+e.getMessage());
}
}
});
Bundle parameters = newBundle();
parameters.putString("fields","first_name,last_name,email,id");
request.setParameters(parameters);
request.executeAsync();
}
publicvoidcheckLoginStatus()
{
if(AccessToken.getCurrentAccessToken()!=null)
{
loadUserProfile(AccessToken.getCurrentAccessToken());
}
}
}
One thing you really need to concentrate is onActivityResult method, which you can't use to any normal class,see my MainActivity and my Facebook login class how I override onActivityResult for facebook login.
If you are useing Fragment instead of Activity you can initialize like this
loginButton.setFragment(this);
Login=newFacebookLogin(loginButton,getActivity());
Post a Comment for "Android Facebook Login In Non Activity Class"