No se puede obtener la ubicación y el correo electrónico con la API de Facebook

En mi aplicación de Android desarrollé este código para iniciar sesión con mi cuenta y obtener propiedades del usuario como nombre, ubicación y correo electrónico. El problema es que puedo obtener el nombre, pero no puedo obtener el correo electrónico y la ubicación. Cuando probé mi código sin intentar capturar el enamoramiento de la aplicación y mi punto de registro en getproperty("email") y getlocation() . Cuando uso el bash. La aplicación funciona pero no hay correo electrónico o ubicación.

 public class Share extends Fragment {private static final String TAG ="Share";private UiLifecycleHelper uiHelper; private View otherView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // To maintain FB Login session uiHelper = new UiLifecycleHelper(getActivity(), callback); uiHelper.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.share, container, false); // Looks for Login button LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton); authButton.setFragment(this); // Set View that should be visible after log-in invisible initially otherView = view.findViewById(R.id.other_views); otherView.setVisibility(View.GONE); //authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday")); return view; } // Called when session changes private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state,Exception exception) { onSessionStateChange(session, state, exception); } }; // When session is changed, this method is called from callback method private void onSessionStateChange(Session session, SessionState state,Exception exception) { final TextView name = (TextView) getView().findViewById(R.id.name); final TextView mail = (TextView) getView().findViewById(R.id.mail); final TextView location = (TextView) getView().findViewById(R.id.location); final TextView locale = (TextView) getView().findViewById(R.id.locale); final TextView info = (TextView)getView().findViewById(R.id.msginfo); final LinearLayout views= (LinearLayout)getView().findViewById(R.id.other_views); if (state.isOpened()) { Log.i(TAG, "Logged in..."); // make request to the /me API to get Graph user views.setVisibility(View.VISIBLE); info.setText("You can now share images in facebook "); Request.newMeRequest(session, new Request.GraphUserCallback() { // callback after Graph API response with user // object @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { try { // Set view visibility to true otherView.setVisibility(View.VISIBLE); // Set User name name.setText("Hello " + user.getName()); // Set Email mail.setText("Your Email: " + user.getProperty("email").toString()); locale.setText("Locale: " + user.getProperty("locale").toString()); location.setText("Your Current Location: " + user.getLocation().getProperty("name").toString()); } catch(Exception e) { e.printStackTrace(); } } } }).executeAsync(); } else if (state.isClosed()) { views.setVisibility(View.INVISIBLE); info.setText("If you want to share images in Facebook, please Login"); Log.i(TAG, "Logged out..."); otherView.setVisibility(View.GONE); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data); Log.i(TAG, "OnActivityResult..."); } @Override public void onResume() { super.onResume(); uiHelper.onResume(); } @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); } } 

El problema es que no has pedido permisos:

 authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday")); 

Sin embargo, está utilizando un SDK de Facebook anterior, mientras que el último SDK es 4.0. + . A continuación, le daré un código de muestra completo para iniciar sesión en Facebook, basado en la API más reciente. Tenga en cuenta que primero debe agregar su aplicación en developers.facebook como se menciona en la documentación .

 public class LoginActivity extends ActionBarActivity{ @Override protected void onActivityResult(int requestCode, int responseCode, Intent data) { super.onActivityResult(requestCode, responseCode, data); callbackManager.onActivityResult(requestCode, responseCode, data); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FacebookSdk.sdkInitialize(this.getApplicationContext()); setContentView(R.layout.activity_login); callbackManager = CallbackManager.Factory.create(); loginButton = (LoginButton) findViewById(R.id.loginFaceBook_button); List permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile"); loginButton.setReadPermissions(permissionNeeds); loginButton.registerCallback(callbackManager, new FacebookCallback() { @Override public void onSuccess(LoginResult loginResult) { System.out.println("onSuccess"); GraphRequest request = GraphRequest.newMeRequest (loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { // Application code Log.v("LoginActivity", response.toString()); //System.out.println("Check: " + response.toString()); try { String id = object.getString("id"); String name = object.getString("name"); String email = object.getString("email"); String gender = object.getString("gender"); String birthday = object.getString("birthday"); System.out.println(id + ", " + name + ", " + email + ", " + gender + ", " + birthday); } catch (JSONException e) { e.printStackTrace(); } } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id,name,email,gender, birthday"); request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { System.out.println("onCancel"); } @Override public void onError(FacebookException exception) { System.out.println("onError"); Log.v("LoginActivity", exception.getCause().toString()); } }); } } 

Si desea utilizar Fragment lugar de ActionBarActivity , simplemente agregue loginButton.setFragment(this); justo después de su línea de permiso.

manifest.xml:

        

Necesitarás agregar a tu aplicación una clave hash también. Aquí hay una manera de hacer esto con el código:

 try { //paste Your package name at the first parameter PackageInfo info = getPackageManager().getPackageInfo("PUT_YOUR_PACKAGE_NAME_HERE", PackageManager.GET_SIGNATURES); for (android.content.pm.Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String sign = Base64.encodeToString(md.digest(), Base64.DEFAULT); Log.e("MY KEY HASH:", sign); Toast.makeText(getApplicationContext(),sign, Toast.LENGTH_LONG).show(); } } catch (PackageManager.NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } 

Después de que imprima la clave hash, copie y péguelo en su cuenta de facebook.developer , donde se encuentra su proyecto.

En grandle, debe agregar jcenter en repositories y también agregar compile 'com.facebook.android:facebook-android-sdk:4.0.0' en dependecies .

 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() /*more project attrs..*/ } } 

Y el otro archivo grandle:

 apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "YOUR_PACKAGE_NAME" minSdkVersion 14 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.facebook.android:facebook-android-sdk:4.0.0' } 

Editar:

Para rastrear la ubicación del usuario, necesitará un rastreador GPS, algo como esto . "user_location" permiso "user_location" no devuelve un objeto lon, lat , sino un objeto Page , que creo que no es lo que desea. Por lo tanto, sus permisos deben ser List permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile"); y ahora deberías poder recuperar el correo electrónico del usuario

Todo está bien, pero estoy obteniendo el diferente fbid. aquí está mi código

  Profile profile = Profile.getCurrentProfile(); if (profile != null) { Log.e("profile.getId()" , "profile.getId()" + profile.getId()); } else { Log.e("profile.getId()" , "profile.getId() not available"); } Thanks in advance.