Now FB gives provision in their 4.x SDK to do like this without using the FB Login Button.
Please try following:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
}
protected void doFBLoginForProfile() {
LoginManager loginManager = LoginManager.getInstance();
loginManager.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
fetchUserInfo();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException error) {
}
});
loginManager.logInWithReadPermissions(this, getReadPermissions());
}
private ArrayList<String> getReadPermissions() {
ArrayList<String> fbPermissions = new ArrayList<String>();
fbPermissions.add("public_profile");
fbPermissions.add("email");
fbPermissions.add("user_location");
fbPermissions.add("user_friends");
return fbPermissions;
}
public void fetchUserInfo() {
GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
Utils.displayLogs("FB", "response: " + object);
onFBUserInfoFetched(new FBProfile().parse(object));
}
}).executeAsync();
}
public class FBProfile {
public String id = "";
public String email = "";
public String firstName = "";
public String lastName = "";
public String location = "";
public FBProfile parse(JSONObject object) {
id = object.optString("id");
email = object.optString("email");
firstName = object.optString("first_name");
lastName = object.optString("last_name");
if (object.has("location")) {
location = object.optJSONObject("location").optString("name");
}
return this;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}