I am using Facebook SDK to sign-in a user. To get the gender I have added user_gender permission in the permission list.
List<String> accessPermissions = Arrays.asList("user_gender", "email", "user_birthday");
LoginManager.getInstance().logInWithReadPermissions(activity, accessPermissions);
After which I get the access token. Now I am passing this access token to the backend team. And the backend team is using Facebook Graph API to get the user details like birthday, gender, email, etc.
They hit the following API to get user details.
https://graph.facebook.com/me?access_token=dummyaccesstoken&fields=name,gender,birthday,email
They are able to get details like email and birthday. But they are not able to get the gender of the user. Since it is a GET API, I can also see that we are not getting the gender of the user.
However, if we try to get the details in Android itself instead of passing the access token to the backend, then it works fine.
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(
JSONObject object,
GraphResponse response) {
Log.d("Response", "response is "+response.getJSONObject().toString());
// Application code
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link, gender");
request.setParameters(parameters);
request.executeAsync();
So what is the issue in the Facebook Graph API? Why is it not able to return the gender? Anyone else faced the issue?
List<String> accessPermissions = Arrays.asList("user_gender", "email", "user_birthday");
LoginManager.getInstance().logInWithReadPermissions(activity, accessPermissions);
write instead of user_gender and email and user_birthday
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));
and write the Bundle request params
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email,gender,birthday");
request.setParameters(parameters);
request.executeAsync();
Related
I need to get user uploaded and tagged photos from facebook account using graph API.
I tried following code but it's give nothing to me .
GraphRequest request = GraphRequest.newMeRequest(
token,
new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject object, GraphResponse response) {
// Insert your code here
Log.e("Hi "," "+response.getJSONObject().toString());
}
});
GraphRequest req = GraphRequest.newGraphPathRequest(token, "me/photos", callback);
Bundle parameters = new Bundle();
parameters.putString("fields", "id, name");
req.setParameters(parameters);
req.executeAsync();
I have given following permission to facbook.
loginButton.setReadPermissions(Arrays.asList("public_profile","user_photos"));
Thanks
Use this API
json.FB_URL+json.PAGE_ID+"?fields=albums.limit(30)%7Bname%2Cid%2Cdescription%2Cpicture%7D&access_token="+json.ACCESS_TOKEN
Trying to have my Android app fetch a logged in Facebook user's e-mail, birthday, and location. The first two fields can be retrieved successfully, but location is missing from the Graph API's response, and I can't figure out why.
I'm logging in with these permissions:
LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this, Arrays.asList("public_profile", "user_friends", "email", "user_birthday", "user_location"));
The GraphRequest is implemented as follows:
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject object, GraphResponse response) {
try {
Log.d("jsonTest171", object.toString(4));
String email = object.getString("email");
UserData.emailAddress = email;
String birthday = object.getString("birthday");
UserData.birthday = birthday;
String location = object.getJSONObject("location").getString("name");
UserData.location = location;
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,email,location,birthday");
request.setParameters(parameters);
request.executeAsync();
The Facebook user has the app set to allow all 3 requested fields, as shown here.
This is the LogCat output from the debug line included in the above code:
{
"id": "101936745620608",
"email": "test77124#gmail.com",
"birthday": "12\/20\/1983"
}
Why is the requested location field not present in the Graph response?
In stead of location ask for location{location} in the Bundle parameters like:
parameters.putString("fields", "id,email,birthday,location{location}");
The location part of the response looks like:
"location":{
"location":{
"city":"",
"country":"",
"latitude":0,
"longitude":0
},
"id":""
}
So you can retrieve them in your callback method like:
JSONObject location = object.getJSONObject("location").getJSONObject("location");
String city = location.getString("city");
String country = location.getString("country");
I'm using the following code to get user's email:
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject jsonObject, GraphResponse graphResponse) {
// Obtaining
}
}).executeAsync();
The following is checked via debugger:
AccessToken instance contains permissions "email" and "public_profile"
AccessToken instance declined permissions set is empty
Resulting JSONObject contains only user id and name, but no email
Profile has email — I'm authenticating via email.
I'm using Facebook SDK 4.5
EDIT: Request via direct HTTP graph api call returns email. But Android SDK does not.
How to fix it?
Try this out, you need to send "email" as part of parameters for GraphRequest.
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(
JSONObject object,
GraphResponse response) {
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email");
request.setParameters(parameters);
request.executeAsync();
I think the user can specify no email permissions when he/she signs in via facebook. So even if you expect it, you might not get the email address.
Maybe we facing same problem, try this :
Bundle params=new Bundle();
params.putString("fields","id,name,email,verified"); //must specify the "fields" param, otherwise FB always return id and name only.
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"/me",
params,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
//do something...
}
}
).executeAsync();
I am not able to get the facebook user email in API version v2.4. I have one app in api version2.3 it returns the email and other details of the user but now facebook updated the api version to new application. if i use the old application like veriosn <=2.3 its returning the user email by using the following code. But in api version 2.4 i am not able to get the email and date of birth.
GraphRequest.newMeRequest(result.getAccessToken(), new GraphRequest.GraphJSONObjectCallback()
{
#Override
public void onCompleted(JSONObject me, GraphResponse response)
{
if (response.getError() != null)
{
// handle error
}
else
{
Log.e("",""+me.toString());
Log.e("",""+response.getJSONObject().toString());
}
}
}).executeAsync();
You'll have to explicitly define which fields you want to retrieve with your request, for example /me?fields=id,name,email,birthday instead of just /me
See
https://developers.facebook.com/docs/apps/changelog#v2_4
To try to improve performance on mobile networks, Nodes and Edges in v2.4 requires that you explicitly request the field(s) you need for your GET requests. For example, GET /v2.4/me/feed no longer includes likes and comments by default, but GET /v2.4/me/feed?fields=comments,likes will return the data. For more details see the docs on how to request specific fields.
Since v2.4 you need include in your request the fields that you need.
GraphRequest request = GraphRequest.newMeRequest(
AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject userMe, GraphResponse response) {
if(userMe!=null){
//...... do your things
}
}
});
Bundle parameters = new Bundle();
//Add the fields that you need, you dont forget add the right permission
parameters.putString("fields","email,id,name,picture,birthday");
request.setParameters(parameters);
//Now you can execute
GraphRequest.executeBatchAsync(request);
Here is code block that worked for me:
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject object, GraphResponse response) {
final JSONObject jsonObject = response.getJSONObject();
try{
email = jsonObject.getString("email");
first_name = jsonObject.getString("first_name");
last_name = jsonObject.getString("last_name");
gender = jsonObject.getString("gender");
birthday = jsonObject.getString("birthday");
} catch (JSONException e){
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "email,first_name,last_name,gender,birthday");
request.setParameters(parameters);
request.executeAsync();
Hope this helps!
I'm using the following snippet to request the friendslist of the authorized user:
System.out.println("AT: " + facebook.getAccessToken());
String response = facebook.request("me/friends?fields=first_name,last_name,id,gender");
The response I get:
{"error":{"message":"An active access token must be used to query information about the current user.","type":"OAuthException","code":2500}}
I'm printing the accesstoken, this gives me a valid token. Also, getAccessExpires() returns a time in the future. When I request the url "me/friends" without any params, I get the expected (but with less data) friends list without errors.
How can I solve this?
String response = facebook.request("me/friends?fields=first_name,last_name,id,gender");
That is the incorrect way to use facebook.request. I'm assuming you're not using the beta Android SDK so the correct way to do this is to do the following:
Facebook facebook = new Facebook(YOUR_APP_ID);
AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook);
Bundle params = new Bundle();
params.put("fields", "first_name, last_name, id, gender");
mAsyncRunner.request("me/friends", params, new RequestListener() {
// get response here
....
});
Hope this helps.