Is it possible to fetch data of user from FACEBOOK eg. pages he has liked. I need to fetch this info and generate push notification on android mobile. What should be approach and a reference would be much appreciated
try this to login, check session and get information from facebook , you can customized the permissions for the information you want.
private void performFacebookLogin()
{
Log.d("FACEBOOK", "performFacebookLogin");
final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, Arrays.asList("email"));
Session openActiveSession = Session.openActiveSession(this, true, new Session.StatusCallback()
{
#Override
public void call(Session session, SessionState state, Exception exception)
{
Log.d("FACEBOOK", "call");
if (session.isOpened() && !isFetching)
{
Log.d("FACEBOOK", "if (session.isOpened() && !isFetching)");
isFetching = true;
session.requestNewReadPermissions(newPermissionsRequest);
Request getMe = Request.newMeRequest(session, new GraphUserCallback()
{
#Override
public void onCompleted(GraphUser user, Response response)
{
Log.d("FACEBOOK", "onCompleted");
if (user != null)
{
Log.d("FACEBOOK", "user != null");
org.json.JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
String email = graphResponse.optString("email");
String id = graphResponse.optString("id");
//String facebookName = user.getUsername();
System.out.println("Birthday--------------"+user.getBirthday());
System.out.println("User ID----------------"+user.getId());
System.out.println("LINK---------------------"+user.getLink());
System.out.println("username---------------"+user.getUsername());
System.out.println("Hashcode----------------"+user.hashCode());
System.out.println("Inner JSON--------------"+user.getInnerJSONObject());
System.out.println("Location-------------------"+user.getLocation());
System.out.println("class------------------------"+user.getClass());
System.out.println(user.getProperty("email"));
if (email == null || email.length() < 0)
{
System.out.println(
"Facebook Login"+
"An email address is required for your account, we could" +
" not find an email associated with this Facebook account. Please associate a email with this account or login the oldskool way.");
return;
}
}
}
});
getMe.executeAsync();
}
else
{
if (!session.isOpened())
Log.d("FACEBOOK", "!session.isOpened()");
else
Log.d("FACEBOOK", "isFetching");
}
}
});
}
Related
I need to fetch user's birth day from their FB account. I tried this link : Get Date of Birth and Town/City from Facebook SDK GraphUserCallback
But it not help me much. Please let me know is it possible to fetch birth date, or there are any restriction from FB SDk to access this?
Thanks.
First of all you have to specify user_birthday permission while using Facebook SDK and then you can use the below snippet to request for the User Birthday.
Revised code just to give you full demonstration
public void getBirthDate(){
// set permissions
List<String> permissions = new ArrayList<String>();
permissions.add("user_birthday");
Session activeSession = Session.getActiveSession();
Context context=getApplicationContext();
if (activeSession == null || activeSession.getState().isClosed()) {
Session session = new Session.Builder(context).build();
Session.setActiveSession(session);
// set active session
activeSession = session;
}
// if a session is already open then issue a request using the available
// session. Otherwise ask for user credentials.
if (activeSession.isOpened()) {
// User Logged In
Session.getActiveSession().closeAndClearTokenInformation();
// Open Active Session
Session.openActiveSession(this, true, new Session.StatusCallback() {
#Override
public void call(final Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
Log.i(LOGTAG, "Json Data that is coming from FB:" + user.getInnerJSONObject());
}
}
});
}
}
});
} else {
//If session is not opened
OpenRequest openRequest = new Session.OpenRequest((Activity) this);
openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
//Setting no call back dealing it in OnAcitivityResult
openRequest.setCallback(null);
//Setting Permission
openRequest.setPermissions(permissions);
activeSession.openForRead(openRequest);
}
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (Session.getActiveSession() != null)
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
Session activeSession = Session.getActiveSession();
if (activeSession == null || activeSession.getState().isClosed()) {
Session session = new Session.Builder(getApplicationContext()).build();
Session.setActiveSession(session);
activeSession = session;
}
if (activeSession.isOpened()) {
Session.openActiveSession(this, true, new Session.StatusCallback() {
#Override
public void call(final Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
Log.i(LOGTAG, "Json Data that is coming from FB:" + user.getInnerJSONObject());
}
}
});
}
}
});
}
}
Hope this will help you
The JSON callback would look like
{
"id": "146473xxx",
"name": "XYZ",
"first_name": "dkajsd",
"last_name": "kajs",
"link": "https://....",
"username": "xxxx",
"birthday": "12/12/91",
"hometown":
}
I am trying to get email address of user from ParseFacebook for android but i am getting null when i try to fetch email.
here is my code
//on Login:
List<String> permissions = Arrays.asList("email","basic_info", "user_about_me", "user_location");
ParseFacebookUtils.logIn(permissions,SignUpActivity. this, new LogInCallback() {
#Override
public void done(ParseUser user, ParseException err) {
SignUpActivity.this.progressDialog.dismiss();
if(err!=null)
Log.w("parse exception",""+err.getMessage());
if (user == null) {
Log.e("FB","Uh oh. The user cancelled the Facebook login.");
} else if (user.isNew()) {
Log.w("FB","User signed up and logged in through Facebook!");
//showUserDetailsActivity();
getProfileInfo();
} else {
Log.w("FB","User logged in through Facebook!");
// showUserDetailsActivity();
getProfileInfo();
}
}
});
making request:
Request request = Request.newMeRequest(ParseFacebookUtils.getSession(),new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
JSONObject userProfile = new JSONObject();
try {
// Populate the JSON object
try {
userProfile.put("facebookId", user.getId());
userProfile.put("name", user.getName());
} catch (Exception e) {
// TODO: handle exception
}
if (user.getProperty("email") != null) {
userProfile.put("email",(String) user.getProperty("email"));
}
if (user.getLocation().getProperty("name") != null) {
userProfile.put("location", (String) user.getLocation().getProperty("name"));
}
if (user.getProperty("gender") != null) {
userProfile.put("gender",(String) user.getProperty("gender"));
}
} catch (JSONException e) {
Log.e("Facebook parsing data","Error parsing returned user data.");
}
} else if (response.getError() != null) {
if ((response.getError().getCategory() == FacebookRequestError.Category.AUTHENTICATION_RETRY) || (response.getError().getCategory() == FacebookRequestError.Category.AUTHENTICATION_REOPEN_SESSION)) {
Log.e("Facebook parsing data","The facebook session was invalidated.");
//onLogoutButtonClicked();
} else {
Log.e("Facebook parsing data","Some other error: "+ response.getError().getErrorMessage());
}
}
}
});
request.executeAsync();
I have tried everything but where ever i do i am getting email null :(
After setting the permissions as above access the email via: user.asMap().get("email"));
You should get the email like this
String email = (String) response.getGraphObject().getProperty("email");
if(email!=null && !email.equals("")
//email variable should've email id.
Try removing the permission list in the login call.
ParseFacebookUtils.logIn(SignUpActivity.this, new LogInCallback() {
//you can add permissions on later screens.
}
Please add you this request:
Request request = Request.newMeRequest(ParseFacebookUtils.getSession(),new Request.GraphUserCallback()
In login request condition => user.isnew()
else if (user.isNew()) {
Log.w("FB","User signed up and logged in through Facebook!");
//showUserDetailsActivity();
getProfileInfo();
}
write your block in between this and you will be able to get new user info with email also.
This perfectly works in iOS and sure will help in android.
Before the line
request.executeAsync();
add these three lines.
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email");
request.setParameters(parameters);
Now you will get email in your response
I am trying to integrate Facebook SDK for android in my application.
Below is code I am using to use FB Integration.
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bundle = savedInstanceState;
permissions = new ArrayList<String>();
readpermissions = new ArrayList<String>();
permissions.add("publish_actions");
readpermissions.add("email");
executeFacebookLogin();
}
private void executeFacebookLogin() {
Session session = Session.getActiveSession();
Log.i("FB Login "," Session Status "+session);
if(session == null) {
if(session == null) {
Log.i("TEST","CREATE NEW SESSION");
session = new Session(this);
}
Session.setActiveSession(session);
session.addCallback(statusCallback);
if(session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
}
}
Log.i("TEST","Session State "+session.isOpened()+ " for close "+session.isClosed());
if(session.isClosed()) {
session.closeAndClearTokenInformation();
Session.setActiveSession(null);
}
if(!session.isOpened()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
Log.i("FB Login ","Open for Publish");
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
private class SessionStatusCallback implements Session.StatusCallback {
#Override
public void call(Session session, SessionState state, Exception exception) {
//Check if Session is Opened or not
processSessionStatus(session, state, exception);
}
}
#SuppressWarnings("deprecation")
public void processSessionStatus(Session session, SessionState state, Exception exception) {
Log.i("TEST","Session in process session "+session);
if(session != null && session.isOpened()) {
if(session.getPermissions().contains("publish_actions")) {
//Show Progress Dialog
dialog = new ProgressDialog(this);
dialog.setMessage("Loggin in..");
dialog.show();
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user, Response response) {
if (dialog!=null && dialog.isShowing()) {
dialog.dismiss();
}
if(user != null) {
Map<String, Object> responseMap = new HashMap<String, Object>();
GraphObject graphObject = response.getGraphObject();
responseMap = graphObject.asMap();
Log.i("FbLogin", "Response Map KeySet - " + responseMap.keySet());
// TODO : Get Email responseMap.get("email");
fb_id = user.getId();
fb_email = null;
user.getBirthday();
fb_userName = user.getUsername();
fb_fullname = user.getFirstName() +" "+user.getLastName();
String name = (String) responseMap.get("name");
if (responseMap.get("email")!=null) {
fb_email = responseMap.get("email").toString();
Log.i("TEST", "FB_ID="+fb_id +"email="+fb_email+"name="+name+"user_name="+user.getUsername()+"birthday="+user.getBirthday());
Session session = Session.getActiveSession();
tokenKey = session.getAccessToken();
SharedPreferenceStoring myPrefsClass = new SharedPreferenceStoring();
myPrefsClass.storingFBToken(FBActivity.this, tokenKey);
Log.i("TEST", "TOKEN kEY fourth = "+tokenKey);
}
else {
//Clear all session info & ask user to login again
Session session = Session.getActiveSession();
if(session != null) {
session.closeAndClearTokenInformation();
}
}
}
}
});
} else {
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(FBActivity.this, permissions));
}
}
}
This code works perfectly if NATIVE FB app is installed.
In case where Native FB app is not installed it shows FB login Web view ( which is correct ).
But if I login into Web view its again showing me that I already authorize application and when I click on Ok button I am getting the same Login FB View and not returning control back to my application.
I am not getting why this is happening.
Can anyone please tell me how to resolve this issue ?
**EDIT**
I am getting this in my logcat when I press Ok button on "You already authorize this app" screen
{Session state:OPENED, token:{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[email]}, appId:xxxxxxxxxxxxx}
and
{act=SSO_WITH_FALLBACK cmp=com.myapp/com.facebook.LoginActivity (has extras)}
Comment this lines any check
if(!session.isOpened()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
Log.i("FB Login ","Open for Publish");
} else {
Session.openActiveSession(this, true, statusCallback);
}
EDIT: this code work ing for me Both Native And Webview once try this..
And See this FACEBOOK LOGIN
if (fb_session != null && fb_session.isOpened()) {
makeMeRequest(fb_session);
Log.i("Facebook Login State == >", "Facebook Login State");
} else {
if (fb_session == null) {
fb_session = new Session(mCurrContext);
}
Session.setActiveSession(fb_session);
ConnectToFacebook();
Log.i("Facebook not Login State == >", "Facebook Not login State");
}
}
while trying to access user details, I am getting this error:
07-29 14:49:47.343: W/System.err(2745): org.json.JSONException: No value for email
07-29 14:49:47.353: W/System.err(2745): at org.json.JSONObject.get(JSONObject.java:354)
07-29 14:49:47.374: W/System.err(2745): at org.json.JSONObject.getString(JSONObject.java:510)
07-29 14:49:47.374: W/System.err(2745): at com.example.healthcity.common.FacebookContainer$3$1.onCompleted(FacebookContainer.java:237)
07-29 14:49:47.409: W/System.err(2745): at com.facebook.Request$1.onCompleted(Request.java:264)
07-29 14:49:47.413: W/System.err(2745): at com.facebook.Request$4.run(Request.java:1240)
07-29 14:49:47.423: W/System.err(2745): at android.os.Handler.handleCallback(Handler.java:725)
07-29 14:49:47.423: W/System.err(2745): at android.os.Handler.dispatchMessage(Handler.java:92)
07-29 14:49:47.433: W/System.err(2745): at android.os.Looper.loop(Looper.java:137)
07-29 14:49:47.444: W/System.err(2745): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-29 14:49:47.444: W/System.err(2745): at java.lang.reflect.Method.invokeNative(Native Method)
07-29 14:49:47.463: W/System.err(2745): at java.lang.reflect.Method.invoke(Method.java:511)
07-29 14:49:47.463: W/System.err(2745): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-29 14:49:47.485: W/System.err(2745): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-29 14:49:47.493: W/System.err(2745): at dalvik.system.NativeStart.main(Native Method)
I am not able to capture breakpoint on callback method. plz help if you have gone through this error.
below is my code for getting user details:
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
//RFR//_("onSessionStateChange----------------");
/////////////// super.onSessionStateChange(state, exception);
if (state.isOpened()) {
readUserInfo(session);
} else if (state.isClosed()) {
// Session closed
}
}
private Request.GraphUserCallback graphCallback = new Request.GraphUserCallback() {
// callback after Graph API response with user object
#Override
public void onCompleted(GraphUser user, Response response) {
String name = user.getName();
String gender = (String) user.getProperty("gender");
String email = (String) user.getProperty("email");
String birthday = user.getBirthday();
Log.d("FB----->","name: "+ name +" gender: "+ gender +" email: "+ email +" birthday: " +birthday);
}
};
public void readUserInfo(Session session){
// make request to the /me API
Request.executeMeRequestAsync(session, graphCallback);
}
And below is the permission that I've set:
openRequest.setPermissions(Arrays.asList("user_birthday", "email", "user_location"));
Here is the response i get from the graph api, when checked from browser:
{
"id": "1000000XXXXX930",
"name": "First Last",
"first_name": "First",
"last_name": "Last",
"link": "http://www.facebook.com/<myusername>",
"username": "<myusername>",
"gender": "male",
"locale": "en_US"
}
Exception is thrown because You are trying to access email
But user has not used email for registration and has used phone
number for the registration.
You have to check the possibility in code that whether the son
response has the key and only then try to extract the value of that
key
if(object.has("email")){
userEmail = object.getString("email");
}
Have you given "email" permission to request the Facebook application to access any user's email id?
If you want to access email id of Facebook user using API then you must need to give email permission. General info about user profile will not give you the email address of the Facebook user.
Email Permissions in Facebook API
NOTE: Some user also put security to do not share any email address to any other then also it might be the case that you will not get the email address.
Hope it will help you.
you do need permission to grab someone's email although some people have their privacy set so that you can get their emails without this expressed permission, most don't.
This Piece of code is working fine with me in getting required permissions
this will also help you in getting Email permission
private void FaceBookSignIn()
{
facebookBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
Session session = new Session.Builder(context).build();
Session.setActiveSession(session);
currentSession = session;
}
if (currentSession.isOpened()) {
Session.openActiveSession(SignIn_Rewards.this, false, new Session.StatusCallback() {
#Override
public void call(final Session session, SessionState state,
Exception exception) {
if (session.isOpened()) {
Request.executeMeRequestAsync(session,
new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
fromFB=true;
UserID=user.getId();
firstName=user.getFirstName();
Lastname=user.getLastName();
Gender=user.getProperty("gender").toString();
Email=user.getProperty("email").toString();
DateofBirth=user.getBirthday();
try {
getToken();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
}
});
}
// Do whatever u want. User has logged in
else if (!currentSession.isOpened()) {
// Ask for username and password
OpenRequest op = new Session.OpenRequest((Activity) context);
op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
op.setCallback(null);
List<String> permissions = new ArrayList<String>();
permissions.add("publish_stream");
permissions.add("user_likes");
permissions.add("email");
permissions.add("user_birthday");
op.setPermissions(permissions);
Session session = new Session.Builder(SignIn_Rewards.this).build();
Session.setActiveSession(session);
session.openForPublish(op);
}
}
}) ;
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (Session.getActiveSession() != null)
Session.getActiveSession().onActivityResult(this, requestCode,
resultCode, data);
Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
Session session = new Session.Builder(context).build();
Session.setActiveSession(session);
currentSession = session;
}
if (currentSession.isOpened()) {
Session.openActiveSession(this, true, new Session.StatusCallback() {
#Override
public void call(final Session session, SessionState state,
Exception exception) {
if (session.isOpened()) {
Request.executeMeRequestAsync(session,
new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
fromFB=true;
UserID=user.getId();
firstName=user.getFirstName();
Lastname=user.getLastName();
Gender=user.getProperty("gender").toString();
Email=user.getProperty("email").toString();
DateofBirth=user.getBirthday();
try {
getToken();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
}
});
}
}
You have check like this:
private Request.GraphUserCallback graphCallback = new Request.GraphUserCallback() {
// callback after Graph API response with user object
#Override
public void onCompleted(GraphUser user, Response response) {
String name = user.getName();
String gender = (String) user.getProperty("gender");
String email = (String) user.getProperty("email");
String birthday = user.getBirthday();
if(email!=null){
//perform your task here.
}else{
Log.v("email","is empty");
}
Log.d("FB----->","name: "+ name +" gender: "+ gender +" email: "+ email +" birthday: " +birthday);
}};
Try this to get value for email
Edited: By default you won't get the email, for email you have to specify permission.
Session.StatusCallback statusCallback = new Session.StatusCallback()
{
#Override
public void call(Session session, SessionState state, Exception exception)
{
if(session.isOpened())
{
Request.executeMeRequestAsync(session, new Request.GraphUserCallback()
{
#Override
public void onCompleted(GraphUser user, Response response)
{
if(user != null)
{
try
{
System.out.println("Graph Inner Json"+user.getInnerJSONObject());
String email = user.getInnerJSONObject().getString("email");
}
}
}
}
}
}
YourActivityName.openActiveSession(this, true, statusCallback);
This is our openActiveSession() where we specify permissions
private static Session openActiveSession(Activity activity, boolean allowLoginUI, Session.StatusCallback statusCallback)
{
OpenRequest openRequest = new OpenRequest(activity);
openRequest.setPermissions(Arrays.asList("user_birthday", "email"));
openRequest.setCallback(statusCallback);
Session session = new Session.Builder(activity).build();
if(SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI)
{
Session.setActiveSession(session);
session.openForRead(openRequest);
return session;
}
return null;
}
And in the End you should do in onActivityResult Method like:
if(Session.getActiveSession() != null)
{
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
I'm trying to get the user email and birthday (using a Me request). My app has email and user_birthday permissions and the fb account i'm using has an email and a birthday set.
When I try using the 'Graph API Explorer' (https://developers.facebook.com/tools/explorer) using the user access_token with 'fields=id,email,birthday' all I get is the id.
Can anybody advice me on this please.
Here is my code:
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
#Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
// make request to the /me API
Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
#Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
// here I check the infos I got.
Log.d("some tag", user.getInnerJSONObject().toString()); // it shows only the id, no email or birthday.
if (Session.getActiveSession() != null) {
Log.i(TAG, "Log out from FB");
Session.getActiveSession().closeAndClearTokenInformation();
}
}
}
});
// set params.
request.getParameters().putString("fields", "id,email,birthday");
// execute request.
request.executeAsync();
Log.d(TAG, request.toString());
}
if (exception != null) {
exception.printStackTrace();
}
}
});
Many thanks.
I finally changed the approach using the OpenRequest instead of getMeRequest:
Here is my code:
public void onClick(View v) {
Logger.d(TAG, "Start FB session");
// check if a session exists.
Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
// create a new session.
Session session = new Session.Builder(getApplicationContext()).build();
// set it a the active session.
Session.setActiveSession(session);
// keep a variable link to session.
currentSession = session;
}
// if a session is already open then issue a request using the available
// session. Otherwise ask for user credentials.
if (currentSession.isOpened()) {
// The user is logged in.
Logger.e(TAG, "User is logged in.");
Session.getActiveSession().closeAndClearTokenInformation();
Logger.i(TAG, "Session closed an token information cleared.");
// get user data here with no extra call.
Session.openActiveSession(this, true, new Session.StatusCallback() {
#Override
public void call(final Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
Logger.i(TAG, "User:" + user.getInnerJSONObject());
}
}
});
}
}
});
} else {
// Ask for username and password
OpenRequest op = new Session.OpenRequest((Activity) this);
// don't use SSO.
op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
// no callback needed.
op.setCallback(null);
// set permissions.
List<String> permissions = new ArrayList<String>();
permissions.add("email");
permissions.add("user_birthday");
op.setPermissions(permissions);
// open session for read.
currentSession.openForRead(op);
Logger.d(TAG, "Session open for read request issued.");
}
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Logger.d(TAG, "Request code is: " + requestCode);
Logger.d(TAG, "Result code is: " + resultCode);
super.onActivityResult(requestCode, resultCode, data);
if (Session.getActiveSession() != null)
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
Session session = new Session.Builder(getApplicationContext()).build();
Session.setActiveSession(session);
currentSession = session;
}
if (currentSession.isOpened()) {
Session.openActiveSession(this, true, new Session.StatusCallback() {
#Override
public void call(final Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
Logger.i(TAG, "User:" + user.getInnerJSONObject());
}
}
});
}
}
});
}
}
I hope this helps.
When you are using Request.GraphUserCallback(), its best to use it in MAIN UI THREAD
Session s = Session.getActiveSession();
if(s!=null)
{
Request.executeMeRequestAsync(s,new Request.GraphUserCallback()
{
#Override
public void onCompleted(GraphUser user, Response response)
{
if(user!=null)
{
try {
String fbid=null;
String birthday=null;
fbid=user.getId();
birthday=user.getBirthday();
} catch (JSONException e1) {
e1.printStackTrace();
}
}
}
});
}
you can try this also before the Request.executeMeRequestAsync(...){...}
List<String> permissions = session.getPermissions();
List<String> permissionsBirthday = new ArrayList<String>();
permissionsBirthday.add("user_birthday");
if (!isSubsetOf(permissionsBirthday, permissions)) {
pendingPublishReauthorization = true;
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, permissionsBirthday);
if (setPermissions(session, newPermissionsRequest))
return;
}
the method isSubsetOf();
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
for (String string : subset) {
if (!superset.contains(string)) {
return false;
}
}
return true;
}
hope this helps.
This code worked for me hope you find it useful. This retrieves the user email in 3 different ways and also logs it
try{
// new Read().execute("Facebook");
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
#Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
// make request to the /me API
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
#Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
// TextView welcome = (TextView) findViewById(R.id.welcome);
// welcome.setText("Hello " + user.getName() + "!");
Log.d("useremai", (String) user.getProperty("email"));
Log.d("USER", user.getInnerJSONObject().toString());
JSONObject details = user.getInnerJSONObject();
useremail = details.optString("email");
Log.d("name", user.getName());
Log.d("email", useremail);
}
}
});
}
}
});
}catch(NoClassDefFoundError e){
e.printStackTrace();
}
Try this one:
if you have object of user than do below:
if (user != null) {
String UserId = user.getId();
try {
Log.i("Birthdate", ""+user.getInnerJSONObject().getString("birthday"));
} catch (JSONException e) {
e.printStackTrace();
}
}