I tried to use below code to get my facebook email address via my app, but return value is null.
I don't know what the reason, but I can get email address using Graph API explorer. Is there anybody know what is wrong with this code?
#Override
public void onCreate(Bundle savedInstanceState) {
// Request email address
GraphRequest.newMeRequest(
loginResult.getAccessToken(),new GraphRequest.GraphJSONObjectCallback() {
public void onCompleted(JSONObject me, GraphResponse response) {
Log.d("TEST", response.toString());
if (response.getError() != null) {
// handle error
} else {
Log.d("TEST", me.toString());
String email = me.optString("email");
String id = me.optString("id");
Log.d("TEST", "Email:" + email);
}
}
}).executeAsync();
LoginButton authButton =(LoginButton) findViewById(R.id.login_button);
List<String> permissions = new ArrayList<>();
permissions.add("public_profile");
permissions.add("email");
authButton.setReadPermissions(permissions);
}
Finally I found the solution, using newMeRequest method fetches fields from a user object. In the case, I need email as an additional fields, so added “email” into fields parameter and request specific fields:
GraphRequest request = GraphRequest.newMeRequest(
//...
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email");
request.setParameters(parameters);
request.executeAsync();
Set the read permissions before you make the request and do it in the following way:
GraphRequestAsyncTask request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject user, GraphResponse response) {
final Profile profile = Profile.getCurrentProfile();
if ((user != null) && (profile != null)) {
accessToken = AccessToken.getCurrentAccessToken();
if (accessToken.getDeclinedPermissions().isEmpty()) {
try {
String email = user.get("email").toString();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
}).executeAsync();
You have to set permissions before the request.
Anywayt the email field may return null for two reasons:
1 - user didn't confirm the email address during the registration
2 - users could be signed up in Facebook using a phone number instead of email.
Documentation says:
Note, even if you request the email permission it is not guaranteed
you will get an email address. For example, if someone signed up for
Facebook with a phone number instead of an email address, the email
field may be empty.
Related
sometimes randomly a few of my users are getting null values from facebook graph request. but the only thing im requesting from the user is a email address ? lets say the usr did not have a email address but used a phone number to register with facebook. then still why would the raw server response be null. For most of my users its working. anyway, let me show you what my graph request looks like to shed some light:
GraphRequest request = GraphRequest.newMeRequest(
token,
new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject userInfo, GraphResponse response) {
if (userInfo == null)
Crashlytics.log("facebook graph info null:" + response.getRawResponse());
String email = "";
try {
email = userInfo.getString("email");
} catch (JSONException e1) {
e1.printStackTrace();
/* sometimes i end up in this catch block and the rawResponse object is null
}
presenter.presentPasswordPrompt(task, email, credential);
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "email");
request.setParameters(parameters);
request.executeAsync();
as you can see i am printing out a log when the user info is null but the value from response.getRawResponse() is null itself so i cant figure out what the issue is.
I am new in using facebook api for Android. I am trying to read message from facebook using Graph Api. When I try to pass read_mailbox permission I get invalid permission error.
Here is the link I tried to refer.
https://developers.facebook.com/docs/graph-api/reference/v2.8/user/inbox
Here is the code how I am trying to do so.
loginButton.setReadPermissions(Arrays.asList("public_profile","user_friends","email","user_about_me","read_mailbox"));
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
#Override
public void onSuccess(final LoginResult loginResult) {
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject json, GraphResponse response) {
if (response.getError() != null) {
System.out.println("ERROR" +response.getError().getErrorMessage());
} else {
System.out.println("Success");
try {
String jsonresult = String.valueOf(json);
System.out.println("JSON Result"+jsonresult);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link,email,inbox");
request.setParameters(parameters);
request.executeAsync();
}
Here is the link for permission which shows that read_mailbox is depricated.
https://developers.facebook.com/docs/facebook-login/permissions
But what is the alternative to this.
I Also wanted to send message, but I stuck here only. Any help is appriciated.
Thanks in advance
read_mailbox is deprecated and there is no alternative. It is not possible to read the user mailbox anymore.
Sending a message is easy with the Send Dialog: https://developers.facebook.com/docs/sharing/reference/send-dialog
...or the Message Dialog on Android: https://developers.facebook.com/docs/sharing/android#message
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");
In my App i am integrating facebook SDK 4.5.0.
To fetch details of user I am using method
GraphRequest request = GraphRequest.newMeRequest
In user json response i am getting wrong user id.
In case of IOS for same application and same user i get correct userId.
Can anyone help me to solve this?
This is my Code to fetch user details:
GraphRequest request = GraphRequest.newMeRequest(com.facebook.AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
#Override
public void onCompleted(JSONObject user, GraphResponse response) {
if (user != null) {
doLoginFb(user);
}
}
});
request.executeAsync();
After V2.0API user id is "app-scoped" so the id can be different for same user on different apps.
You can refer to the documentation here for more details.
It also says this :
No matter what version they originally used to sign up for your app,
the ID will remain the same for people who have already logged into
your app. This change is backwards-compatible for anyone who has
logged into your app at any point in the past.
If you're not mapping IDs across apps, then no code changes should be required.
Get some public profile of user:
Bundle params = new Bundle();
params.putString("fields", "id,name,email");
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"/me",
params,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
try {
Log.e("JSON",response.toString());
JSONObject data = response.getJSONObject();
//data.getString("id"),
//data.getString("name"),
//data.getString("email")
} catch (Exception e){
e.printStackTrace();
}
}
}
).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!