Кнопка входа в Facebook с ответом по электронной почте
Я реализовал кнопку facebook, следуя инструкциям на Facebook.
имя,
Фамилия,
Эл. адрес,
секс,
fb_id.
У меня есть все, кроме электронной почты. Возможно, мне нужно дать какое-то разрешение, Но я не могу найти, где его дать.
MainActivity.class
public class MainActivity extends FragmentActivity {
private MainFragment mainFragment;
private LoginButton loginBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
loginBtn = (LoginButton) findViewById(R.id.fb_login_button);
loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback()
{
@Override
public void onUserInfoFetched(GraphUser user)
{
if (user != null)
{
Intent i = new Intent(MainActivity.this, RegistrationActivity.class);
i.putExtra("first_name", user.getFirstName());
i.putExtra("last_name", user.getLastName());
//i.putExtra("email", user.asMap().get("email").toString());
i.putExtra("sex", user.asMap().get("gender").toString());
i.putExtra("fb_id", user.getId());
Log.i("first_name", user.getFirstName());
Log.i("last_name", user.getLastName());
//Log.i("email", user.getProperty("email").toString());
Log.i("sex", user.asMap().get("gender").toString());
Log.i("fb_id", user.getId());
finish();
startActivity(i);
}
else
{
Log.i("TAG", "You are not logged");
}
}
});
if (savedInstanceState == null)
{
// Add the fragment on initial activity setup
mainFragment = new MainFragment();
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, mainFragment)
.commit();
}
else
{
// Or set the fragment from restored state info
mainFragment = (MainFragment) getSupportFragmentManager()
.findFragmentById(android.R.id.content);
}
}
public void goingToRegister(View v)
{
v.findViewById(R.id.buttonRegister).startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.image_click));
Intent i = new Intent(MainActivity.this, RegistrationActivity.class);
finish();
startActivity(i);
}
public void loginNow(View v)
{
v.findViewById(R.id.buttonLogin).startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.image_click));
Intent i = new Intent(MainActivity.this, LoginActivity.class);
finish();
startActivity(i);
}
}
MainFragment.class
public class MainFragment extends Fragment {
private static final String TAG = "MainFragment";
private UiLifecycleHelper uiHelper;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.main_activity, container, false);
LoginButton authButton = (LoginButton) view.findViewById(R.id.fb_login_button);
authButton.setReadPermissions(Arrays.asList("public_profile","email","user_friends"));
authButton.setFragment(this);
return view;
}
private void onSessionStateChange(Session session, SessionState state, Exception exception)
{
if (state.isOpened())
{
Log.i(TAG, "Logged in...");
}
else if (state.isClosed())
{
Log.i(TAG, "Logged out...");
}
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
// For scenarios where the main activity is launched and user
// session is not null, the session state change notification
// may not be triggered. Trigger it if it's open/closed.
Session session = Session.getActiveSession();
if (session != null &&
(session.isOpened() || session.isClosed()) ) {
onSessionStateChange(session, session.getState(), null);
}
uiHelper.onResume();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
Log.i("TAG", "responce: " + data);
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
}
В фейсбуке я добавил разрешение вот так
2 ответа
Поле электронной почты не является стандартным, которое возвращается из конечной точки me, поэтому вам потребуется специальный запрос для его извлечения с использованием класса Request.
Используйте этот https://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/Request.java#L278
Установите необходимые для этого поля, например:
// Make sure the user is logged in first
Request meRequest = Request.newMeRequest(Session.getActiveSession(), yourCallback);
Bundle parameters = new Bundle();
// The fields you want in comma separated list
parameters.putString(fields, "id,name,email");
meRequest.setParameters(parameters);
meRequest.executeAsync();
Вам нужно разрешение по электронной почте, прежде чем это работает, хотя.
Вы можете использовать граф API Explorer, чтобы увидеть, как граф запрос должен вести себя.
Попробуйте эту библиотеку, это самый простой способ справиться с Facebook https://github.com/sromku/android-simple-facebook