How can I get the email of a user from the facebook LoginButton widget?
I am getting null. The App Id I am using is correct. I can also get the correct name, but the email is missing. I do have permissions.
This is my code:
import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;
import com.facebook.widget.LoginButton.UserInfoChangedCallback;
// ...
public class MainActivity extends FragmentActivity {
// ...
@Override
public void onCreate(Bundle savedInstanceState) {
//
LoginButton loginBtn = (LoginButton) findViewById(R.id.fb_login_button);
loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback() {
@Override
public void onUserInfoFetched(GraphUser user) {
if (user != null) {
userName.setText("Hello, " + user.getName());
Toast.makeText(getApplicationContext(),
"User Name is , " + user.getName(), Toast.LENGTH_LONG)
.show();
Toast.makeText(getApplicationContext(),
"Email Id is , " + user.getProperty("email") , Toast.LENGTH_LONG)
.show();
} else {
userName.setText("You are not logged");
}
}
});
}
// ...
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions","email","basic_info");
public void requestPermissions() {
Session s = Session.getActiveSession();
if (s != null)
s.requestNewPublishPermissions(new Session.NewPermissionsRequest(
this, PERMISSIONS));
}
public class Login extends ActionBarActivity {
private CallbackManager callbackManager;
String emailid, gender, bday, username;
private LoginButton loginButton;
ProfilePictureView profilePictureView;
TextView info;
private AccessTokenTracker accessTokenTracker;
private ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
setContentView(R.layout.login);
loginButton = (LoginButton) findViewById(R.id.login_button);
loginButton.setReadPermissions(Arrays
.asList("public_profile, email, user_birthday, user_friends"));
loginButton.registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
new fblogin().execute(loginResult.getAccessToken());
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException e) {
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
class fblogin extends AsyncTask<AccessToken, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Login.this);
pDialog.setMessage("wait.");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
protected String doInBackground(AccessToken... params) {
GraphRequest request = GraphRequest.newMeRequest(params[0],
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object,
GraphResponse response) {
Log.v("LoginActivity", response.toString());
try {
username = object.getString("first_name");
emailid = object.getString("email");
gender = object.getString("gender");
bday = object.getString("birthday");
} catch (JSONException e) {
// TODO Auto-generated catch
// block
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields",
"id,first_name,email,gender,birthday");
request.setParameters(parameters);
request.executeAndWait();
return null;
}
protected void onPostExecute(String file_url) {
pDialog.dismiss();
}
}
}
This method work in Async manner.
Its Done . !!