Reputation: 229
I have implemented the Facebook SDK in my application, but I am not getting user email (I think I need to set the permission to get user email - according to Fetch User Data), but somehow it's not working for me. How should I improve my code to get it done?
Here is my code.
LoginScreen.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.facebook.*;
import com.facebook.Session.OpenRequest;
import com.facebook.model.*;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class LoginScreen extends Activity{
public static final String[] PERMISSIONS = new String[] {"email"};
public String fbId,first_name,last_name,email;
private Button button_fb;
JSONObject result;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.loginhome);
button_fb = (Button) findViewById(R.id.btn_signin_fb);
button_fb.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
// start Facebook Login
Session.openActiveSession(LoginScreen.this, true, new Session.StatusCallback() {
// session.openForRead(new OpenRequest(LoginScreen.this).setPermissions(Arrays.asList("email")));
// Callback when session changes state
@Override
public void call(final 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) {
GraphObject graphObject = response.getGraphObject();
Log.d("graphboject",""+graphObject);
if (user != null) {
Toast.makeText(getApplicationContext(), user.getName(), Toast.LENGTH_SHORT).show();
fbId = user.getId();
first_name = user.getFirstName();
last_name = user.getLastName();
result = user.getInnerJSONObject();
email = (String) user.getProperty("email");
String emal = (String) response.getGraphObject().getProperty("email");
// String em = (String) user.asMap().get("email");
Log.d("user email",
(String) user.getProperty("email") + "link"
+ user.getLink());
Log.d("Fb fb_id", fbId);
Log.d("Fb first name", first_name);
Log.d("Fb last name", last_name);
Log.d("FB email", emal);
Log.d("Fb json", String.valueOf(result));
// Log.d("Fb email", email);
}
}
});
}
}
});
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
}
I checked on my console. I get everything, like username, first_name, last_name, fb_id, but I am not getting the email of the user.
How should I do it?
How should I use session.openForRead(new OpenRequest(LoginScreen.this).setPermissions(Arrays.asList("email")));
? In my code, I searched a lot and viewed many answers, but I am still confused as to how to implement it in my code.
Upvotes: 1
Views: 6225
Reputation: 3752
The following worked for me like a charm.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLogin = (Button) findViewById(R.id.logIn);
mLogin.setOnClickListener(this);
}
@Override
public void onClick(View v) {
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()) {
// Do whatever you want. The user is 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 Builder(MainActivity.this).build();
Session.setActiveSession(session);
session.openForPublish(op);
}
}
public void call(Session session, SessionState state, Exception exception) {
}
@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) {
TextView welcome = (TextView) findViewById(R.id.welcome);
welcome.setText("Hello "
+ user.getName() + "!");
access_token = session
.getAccessToken();
firstName = user.getFirstName();
fb_user_id = user.getId();
System.out
.println("Facebook Access token: "
+ access_token);
System.out.println("First Name:"
+ firstName);
System.out.println("FB USER ID: "
+ fb_user_id);
}
}
});
}
}
});
}
}
Upvotes: 4
Reputation: 5254
You also need to set the 'email' permission in developers.facebook.com.
Application > Definitions > Permissions > User & Friends Permission > (write) 'email'
Upvotes: 3