Can't get location and email using Facebook API

后端 未结 1 1345
忘了有多久
忘了有多久 2020-11-27 05:41

In my Android application I developed this code to login with my account and get user property like name, location and email. The problem is I can get the name, but I can\'t

相关标签:
1条回答
  • 2020-11-27 05:49

    The issue is that you have not asked for permissions:

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

    However, you are using an older Facebook SDK, while the newest SDK is 4.0.+. Below, I will give you a full sample code for Facebook login, based on the newest API. Keep in mind that you first have to add your application in developers.facebook as the documentation mentions out.

    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<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile");
        loginButton.setReadPermissions(permissionNeeds);
    
        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>()
        {
            @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());
            }
        });
      }
    }
    

    If you want to use Fragment instead of ActionBarActivity, the just add loginButton.setFragment(this); right after your permission line.

    manifest.xml:

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <application
        <!-- your other attrs..-->
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/app_id"/> <!-- Get this one from developers.facebook -->
        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:label="@string/app_name"/>
    

    You will need to add to your application a hash key too. Here is a way to do this with code:

    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)
    {
    }
    

    After it prints you out the hash key, you copy paste it to your facebook.developer account, where your project is located.

    In grandle, you should add jcenter in repositories and also add compile 'com.facebook.android:facebook-android-sdk:4.0.0' in 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..*/
      }
    }
    

    And the other grandle file:

    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'
    }
    

    Edit:

    In order to track the user's location, you will need a GPS Tracker, something like this. "user_location" permission does not return a lon, lat, but a Page object, which I think is not what you want. So, your permissions should be List<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile"); and now you should be able to retrieve user's email

    0 讨论(0)
提交回复
热议问题