简体   繁体   English

Facebook权限-Android移动应用

[英]Facebook permissions - Android Mobile app

I am trying to retrieve the info of Facebook user in my android app 我正在尝试在我的Android应用中检索Facebook用户的信息

This is what I got so far: 这是我到目前为止所得到的:

MainActivity.java MainActivity.java

package com.firstandroidapp;

import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;

import android.support.v4.app.FragmentActivity;
import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;


import com.facebook.*;
import com.facebook.Session.OpenRequest;
import com.facebook.model.*;
import com.facebook.widget.LoginButton;

import android.widget.TextView;
import android.content.Intent;

public class MainActivity extends FragmentActivity {

    private MainFragment mainFragment;

//   


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

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

      @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
      }
}

and the MainFragment.java 和MainFragment.java

package com.firstandroidapp;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import com.facebook.LoggingBehavior;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.Settings;
import com.facebook.UiLifecycleHelper;
import com.facebook.model.GraphObject;
import com.facebook.model.GraphObjectList;
import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainFragment extends Fragment {

    private static final String TAG = "MainFragment";
    private TextView userInfoTextView;
    private UiLifecycleHelper uiHelper;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(getActivity(), callback);
        uiHelper.onCreate(savedInstanceState);


    }

    @Override
    public View onCreateView(LayoutInflater inflater, 
            ViewGroup container, 
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_main, container, false);
        LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
        userInfoTextView = (TextView) view.findViewById(R.id.userInfoTextView);
        authButton.setFragment(this);

        List<String> permission=new ArrayList<String>();
        permission.add("public_profile");
        permission.add("email");
        permission.add("user_birthday");
        permission.add("user_location");

        permission.add("user_likes");
        permission.add("user_interests");
        permission.add("user_relationships");

        authButton.setReadPermissions(permission);




        return view;
    }

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {
            Log.i(TAG, "Logged in...");
            userInfoTextView.setVisibility(View.VISIBLE);

            // Request user data and show the results
            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {



                @Override
                public void onCompleted(GraphUser user, Response response) {
                    // TODO Auto-generated method stub
                    userInfoTextView.setText(buildUserInfoDisplay(user));
                }
            });
        } else if (state.isClosed()) {
            Log.i(TAG, "Logged out...");
            userInfoTextView.setVisibility(View.INVISIBLE);
        }
    }

    private Session.StatusCallback callback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };


    @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);
    }

    @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);
    }

    private interface MyGraphLanguage extends GraphObject {
        // Getter for the ID field
        String getId();
        // Getter for the Name field
        String getName();
    }


    private String buildUserInfoDisplay(GraphUser user) {
        StringBuilder userInfo = new StringBuilder("");
        //Settings.addLoggingBehavior(LoggingBehavior.REQUESTS);

        // Example: typed access (name)
        // - no special permissions required
        userInfo.append(String.format("Name: %s\n\n", 
            user.getName()));


        // Example: typed access (birthday)
        // - requires user_birthday permission

//      userInfo.append(String.format("Birthday: %s\n\n", 
//              user.getBirthday()));
//      
        userInfo.append(String.format("E-mail: %s\n\n", 
                user.asMap().get("email").toString()));

        // Example: partially typed access, to location field,
        // name key (location)
        // - requires user_location permission
//      userInfo.append(String.format("Location: %s\n\n", 
//          user.getLocation().getProperty("name")));

        // Example: access via property name (locale)
        // - no special permissions required
        userInfo.append(String.format("Locale: %s\n\n", 
            user.getProperty("locale")));

        // Example: access via key for array (languages) 
        // - requires user_likes permission
//      JSONArray languages = (JSONArray)user.getProperty("languages");
//      if (languages.length() > 0) {
//          ArrayList<String> languageNames = new ArrayList<String> ();
//
//          // Get the data from creating a typed interface
//          // for the language data.
//          GraphObjectList<MyGraphLanguage> graphObjectLanguages = 
//              GraphObject.Factory.createList(languages, 
//                                             MyGraphLanguage.class);
//
//          // Iterate through the list of languages
//          for (MyGraphLanguage language : graphObjectLanguages) {
//              // Add the language name to a list. Use the name
//              // getter method to get access to the name field.
//              languageNames.add(language.getName());
//          } 
//
//          userInfo.append(String.format("Languages: %s\n\n", 
//          languageNames.toString()));
//      }   


        Log.d(TAG, user.getName() + user.asMap().get("email").toString() + user.getProperty("locale") );
        return userInfo.toString();
    }

}

and I only get he Name and e-mail and language and I want more information such as the birthday and pages he/she likes and already added these permissions but for example the birthday returns null any idea what I am doing wrong please ?? 并且我只得到他的姓名,电子邮件和语言,我想要更多信息,例如生日和他/她喜欢的页面,并且已经添加了这些权限,但是例如生日返回null了,我在做什么错了吗?

Any help would be appreciate it Thanks 任何帮助将不胜感激谢谢

Are you sure if the birthday date exists on Facebook profile as well? 您确定Facebook个人资料中是否也存在生日? or they may have set to privacy. 否则他们可能已设置为隐私。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM