Android 正确使用facebook登录

Android 正确使用facebook登录,android,facebook,android-facebook,Android,Facebook,Android Facebook,在我的应用程序的起始页上,我要求用户通过Facebook进行身份验证,然后我请求一些权限并获取一些信息: LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton); authButton.setFragment(this); authButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));

在我的应用程序的起始页上,我要求用户通过Facebook进行身份验证,然后我请求一些权限并获取一些信息:

LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
        authButton.setFragment(this);
        authButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));
        fb = new FacebookMain(); 
我可以得到所有这些信息,但移动到我的下一页,我想在我的listview上提供一个按钮,从那里用户可以在朋友的墙上发表文章。我遵循HelloFacebook示例,它就像一个符咒一样工作,但是在我的例子中,当我尝试在一个片段中实现它时,它并没有按照预期工作,我不希望用户每次想发布时都登录(我在这里使用一个额外的权限——发布)我必须在这个片段中实现所有生命周期事件吗?是否有其他或推荐的方法

目前我正在做的是:

我的班级宣言:

public class FragmentTab1 extends Fragment {
类级别变量:

String FACEBOOK_ID;
String IMAGE_CONTENT;
EditText SEARCH; 
private static final String PERMISSION = "publish_actions";
Session session;
private final String PENDING_ACTION_BUNDLE_KEY = "com.exa.digitalrem:PendingAction";
private PendingAction pendingAction = PendingAction.NONE;
private GraphUser user1;
private UiLifecycleHelper uiHelper;
与facebook相关的功能:

private PendingAction pendingAction = PendingAction.NONE;
private GraphUser user1;

private enum PendingAction {
    NONE, POST_PHOTO, POST_STATUS_UPDATE
}



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

public static boolean isActive() {
    Session session = Session.getActiveSession();
    if (session == null) {
        return false;
    }
    return session.isOpened();
}


private void onSessionStateChange(Session session, SessionState state,
            Exception exception) {
        if (pendingAction != PendingAction.NONE && (exception instanceof FacebookOperationCanceledException || exception instanceof FacebookAuthorizationException)) {
            new AlertDialog.Builder(getActivity()) .setTitle("cancelled").setMessage("NotGranted").setPositiveButton("Ok", null).show();
            pendingAction = PendingAction.NONE;
        } else if (state == SessionState.OPENED_TOKEN_UPDATED) {
            handlePendingAction();
        }
        updateUI();
    }

    private void updateUI() {
        Session session = Session.getActiveSession();
        boolean enableButtons = (session != null && session.isOpened());



        if (enableButtons && user1 != null) {
            //  profilePictureView.setProfileId(user.getId());
            //  greeting.setText(getString(R.string.app_name, user.getFirstName()));
        } else {
            //  profilePictureView.setProfileId(null);
            //  greeting.setText(null);
        }
    }

    @SuppressWarnings("incomplete-switch")
    private void handlePendingAction() {
        PendingAction previouslyPendingAction = pendingAction;
        // These actions may re-set pendingAction if they are still pending, but
        // we assume they
        // will succeed.
        pendingAction = PendingAction.NONE;

    } 
在onCreate中:

 uiHelper = new UiLifecycleHelper(getActivity(), callback);
 uiHelper.onCreate(savedInstanceState);


    if (savedInstanceState != null) {
            name = savedInstanceState.getString(PENDING_ACTION_BUNDLE_KEY);
            pendingAction = PendingAction.valueOf(name);
        }

        //===============================================

        Session.openActiveSessionFromCache(getActivity());

        //================================================
这是我在facebook上发布的方法,我通过点击按钮来调用它,它位于列表视图中:

public void postFB(String id) {
        System.out.println("in fb");
        if (isNetworkConnected()) {
            Session session = Session.getActiveSession();
            if (session != null) {
                System.out.println("session not null");
                if (hasPublishPermission()) {
                    //do something

                    WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(
                            getActivity(), Session.openActiveSessionFromCache(getActivity()),
                            params)).setOnCompleteListener(
                                    new OnCompleteListener() {

                                        @Override
                                        public void onComplete(Bundle values,
                                                FacebookException error) {
                                            // frag3.setFbId(null);
                                            // ---------------------------- got to put
                                            // check here
                                            //  onBackPressed();

                                        }
                                    }).build();
                    feedDialog.show();
                } else if (session.isOpened()) {
                    // We need to get new permissions, then complete the action
                    // when we get called back.

                    session.requestNewPublishPermissions(new Session.NewPermissionsRequest(
                            getActivity(), PERMISSION));
                    // do something

                    WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(
                            getActivity(), Session.getActiveSession(),
                            params)).setOnCompleteListener(
                                    new OnCompleteListener() {

                                        @Override
                                        public void onComplete(Bundle values,
                                                FacebookException error) {
                                            // frag3.setFbId(null);
                                            // ---------------------------- got to put
                                            // check here
                                            //onBackPressed();

                                        }
                                    }).build();
                    feedDialog.show();
                }
            }else if(session == null){
                System.out.println("login");
            }
        } else {
            Toast.makeText(getActivity(),
                    "Please check your internet connection", Toast.LENGTH_LONG)
                    .show();
        }
    }

然而,在我看来,这不是一个正确的方法,有没有更好的方法?另外,如何检测用户会话是否过期并提示用户再次登录?文档似乎没有显示登录按钮的内部功能

不要启动新会话。。。。在源代码中更改它

private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
        Exception exception) {
    onSessionStateChange(session, state, exception);
}
};
  • 在项目中添加facebook SDK
  • 在标记下的AndroidManifest.xml中添加以下行

    
    
  • 还可以在string.xml中添加facebook应用程序id

  • 宣布非公开成员

    private boolean isOnCreate;
    private List<String> permissions = new ArrayList<String>();
    private JSONObject facebookObject;
    private ProgressDialog progressDialog;
    
    /** The callback. */
    private final com.facebook.Session.StatusCallback callback = new 
    
    com.facebook.Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
    SignInActivity.this.onSessionStateChange(session, state, exception);
    }
    };
    
    private void onSessionStateChange(Session session, SessionState state, Exception         exception) {
    
    if (state == SessionState.OPENED) {
    if (this.isOnCreate) {
     this.isOnCreate = false;
     return;
         }
         onFacebookLoginDone();
    } else if (state == SessionState.CLOSED_LOGIN_FAILED) {
    showErrorMessage();
    }
    }
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Session session = Session.getActiveSession();
        if (session == null) {
            session = new Session(this);
            session.closeAndClearTokenInformation();
        }
        Session.setActiveSession(session);
        }
    
        @Override
        public void onClick(View v) {
        switch (v.getId()) {
    
        case R.id.btn_fb_login:
            this.loginUsingFacebook();
            break;
    
        default:
            break;
        }
    
        }
    
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
        }
    
        /**
         * Login using facebook.
         */
        private void loginUsingFacebook() {
        isOnCreate = false;
        final Session session = Session.getActiveSession();
        if (session != null && session.getState().equals(SessionState.OPENED)) {
            Session.openActiveSession(this, true, this.callback);
            onFacebookLoginDone();
        } else {
            final Session.OpenRequest temp = new Session.OpenRequest(this);
            this.permissions.clear();
            this.permissions.add(UserClass.EMAIL);
            this.permissions.add("user_location");
            temp.setPermissions(this.permissions);
            temp.setCallback(this.callback);
            session.openForRead(temp);
        }
    
        }
    
        /**
         * On facebook login done.
         */
        private void onFacebookLoginDone() {
    
        final Bundle bundle = new Bundle();
        bundle.putString("fields", "first_name,last_name,id,location,locale,username,email,verified");
        new PerformSignUpOnServer("/me", bundle).execute();
        }
    
        /**
         * The Class PerformSignUpOnServer.
         */
        private class PerformSignUpOnServer extends AsyncTask<Void, Void, Void> {
    
        /** The server url. */
        private String serverURL;
    
        /** The server bundle. */
        private Bundle serverBundle;
    
        /**
         * Instantiates a new perform sign up on server.
         * 
         * @param url
         *            the url
         * @param bundle
         *            the bundle
         */
        public PerformSignUpOnServer(String url, Bundle bundle) {
    
            this.serverBundle = bundle;
            this.serverURL = url;
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see android.os.AsyncTask#onPreExecute()
         */
        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(SignInActivity.this, "", "Loading...");
            super.onPreExecute();
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see android.os.AsyncTask#doInBackground(Params[])
         */
        @Override
        protected Void doInBackground(Void... params) {
    
            signUpUserOnServer(this.serverURL, this.serverBundle);
    
            return null;
    
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(Void result) {
    
    
        }
        }
    
        /**
         * Sign up user on server.
         * 
         * @param url
         *            the url
         * @param bundle
         *            the bundle
         */
        private void signUpUserOnServer(String url, Bundle bundle) {
        final Session session = Session.getActiveSession();
        if (session != null && session.isClosed() == false) {
            final Request userInformation = new Request(session, url, bundle, HttpMethod.GET);
            final Response response = userInformation.executeAndWait();
            facebookObject = response.getGraphObject().getInnerJSONObject();
            Log.d("json", facebookObject.toString());
        }
        }
    
        /**
         * On session state change.
         * 
         * @param state
         *            the state
         */
        private void onSessionStateChange(SessionState state) {
    
        if (state == SessionState.OPENED) {
            if (isOnCreate) {
            isOnCreate = false;
            return;
            }
            onFacebookLoginDone();
        }
        }
    
    private boolean isOnCreate;
    私有列表权限=新建ArrayList();
    私有JSONObject facebookObject;
    私有进程对话;
    /**回调*/
    private final com.facebook.Session.StatusCallback callback=新建
    com.facebook.Session.StatusCallback(){
    @凌驾
    公共无效调用(会话、会话状态、异常){
    signalivity.this.onSessionStateChange(会话、状态、异常);
    }
    };
    private void OnSessionState更改(会话、会话状态、异常){
    if(state==SessionState.OPENED){
    如果(此.isOnCreate){
    this.isOnCreate=false;
    返回;
    }
    onFacebookLoginDone();
    }else if(state==SessionState.CLOSED\u登录失败){
    发送消息();
    }
    }
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Session=Session.getActiveSession();
    if(会话==null){
    会话=新会话(本);
    session.closeAndClearTokenInformation();
    }
    Session.setActiveSession(Session);
    }
    @凌驾
    公共void onClick(视图v){
    开关(v.getId()){
    案例R.id.btn\u fb\u登录:
    这个。loginUsingFacebook();
    打破
    违约:
    打破
    }
    }
    @凌驾
    受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
    super.onActivityResult(请求代码、结果代码、数据);
    Session.getActiveSession().onActivityResult(此、请求代码、结果代码、数据);
    }
    /**
    *使用facebook登录。
    */
    私有void登录使用Facebook(){
    isOnCreate=false;
    最终会话=Session.getActiveSession();
    if(session!=null&&session.getState().equals(SessionState.OPENED)){
    openActiveSession(this,true,this.callback);
    onFacebookLoginDone();
    }否则{
    final Session.OpenRequest temp=新Session.OpenRequest(此);
    此参数为.permissions.clear();
    this.permissions.add(UserClass.EMAIL);
    此.permissions.add(“用户位置”);
    临时设置权限(此权限);
    临时设置回调(此回调);
    openForRead(temp);
    }
    }
    /**
    *在facebook上登录完成。
    */
    私有void onFacebookLoginDone(){
    最终捆绑=新捆绑();
    bundle.putString(“字段”、“名字、姓氏、id、位置、区域设置、用户名、电子邮件、已验证”);
    新的PerformSignUpOnServer(“/me”,bundle).execute();
    }
    /**
    *类PerformSignUpOnServer。
    */
    私有类PerformSignUpOnServer扩展异步任务{
    /**服务器url*/
    私有字符串serverURL;
    /**服务器包*/
    私有包服务器包;
    /**
    *在服务器上实例化新的执行注册。
    * 
    *@param-url
    *网址
    *@param束
    *包裹
    */
    公共PerformSignUpOnServer(字符串url、捆绑包){
    this.serverBundle=bundle;
    this.serverURL=url;
    }
    /*
    *(非Javadoc)
    * 
    *@see android.os.AsyncTask#onPreExecute()
    */
    @凌驾
    受保护的void onPreExecute(){
    progressDialog=progressDialog.show(SignenActivity.this,“,”正在加载…);
    super.onPreExecute();
    }
    /*
    *(非Javadoc)
    * 
    *@see android.os.AsyncTask#doInBackground(Params[])
    */
    @凌驾
    受保护的Void doInBackground(Void…参数){
    signUpUserOnServer(this.serverURL、this.serverBundle);
    返回null;
    }
    /*
    *(非Javadoc)
    * 
    *@see android.os.AsyncTask#onPostExecute(java.lang.Object)
    */
    @凌驾
    受保护的void onPostExecute(void结果){
    }
    }
    /**
    *在服务器上注册用户。
    * 
    *@param-url
    *网址
    *@param束
    *包裹
    */
    私有void signUpUserOnServer(字符串url、捆绑包){
    最终会话=Session.getActiveSession();
    if(session!=null&&session.isClosed()==false){
    最终请求userInformation=新请求(会话、url、bundle、HttpMethod.GET);
    最终响应=userInformation.executeAndWait();
    facebookObject=response.getGraphObject().getInnerJSONObject();
    Log.d(“json”,facebookObject.toString());
    }
    }
    /**
    *关于会话状态的更改。
    * 
    *@param状态
    *国家
    */
    
    private boolean isOnCreate;
    private List<String> permissions = new ArrayList<String>();
    private JSONObject facebookObject;
    private ProgressDialog progressDialog;
    
    /** The callback. */
    private final com.facebook.Session.StatusCallback callback = new 
    
    com.facebook.Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
    SignInActivity.this.onSessionStateChange(session, state, exception);
    }
    };
    
    private void onSessionStateChange(Session session, SessionState state, Exception         exception) {
    
    if (state == SessionState.OPENED) {
    if (this.isOnCreate) {
     this.isOnCreate = false;
     return;
         }
         onFacebookLoginDone();
    } else if (state == SessionState.CLOSED_LOGIN_FAILED) {
    showErrorMessage();
    }
    }
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Session session = Session.getActiveSession();
        if (session == null) {
            session = new Session(this);
            session.closeAndClearTokenInformation();
        }
        Session.setActiveSession(session);
        }
    
        @Override
        public void onClick(View v) {
        switch (v.getId()) {
    
        case R.id.btn_fb_login:
            this.loginUsingFacebook();
            break;
    
        default:
            break;
        }
    
        }
    
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
        }
    
        /**
         * Login using facebook.
         */
        private void loginUsingFacebook() {
        isOnCreate = false;
        final Session session = Session.getActiveSession();
        if (session != null && session.getState().equals(SessionState.OPENED)) {
            Session.openActiveSession(this, true, this.callback);
            onFacebookLoginDone();
        } else {
            final Session.OpenRequest temp = new Session.OpenRequest(this);
            this.permissions.clear();
            this.permissions.add(UserClass.EMAIL);
            this.permissions.add("user_location");
            temp.setPermissions(this.permissions);
            temp.setCallback(this.callback);
            session.openForRead(temp);
        }
    
        }
    
        /**
         * On facebook login done.
         */
        private void onFacebookLoginDone() {
    
        final Bundle bundle = new Bundle();
        bundle.putString("fields", "first_name,last_name,id,location,locale,username,email,verified");
        new PerformSignUpOnServer("/me", bundle).execute();
        }
    
        /**
         * The Class PerformSignUpOnServer.
         */
        private class PerformSignUpOnServer extends AsyncTask<Void, Void, Void> {
    
        /** The server url. */
        private String serverURL;
    
        /** The server bundle. */
        private Bundle serverBundle;
    
        /**
         * Instantiates a new perform sign up on server.
         * 
         * @param url
         *            the url
         * @param bundle
         *            the bundle
         */
        public PerformSignUpOnServer(String url, Bundle bundle) {
    
            this.serverBundle = bundle;
            this.serverURL = url;
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see android.os.AsyncTask#onPreExecute()
         */
        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(SignInActivity.this, "", "Loading...");
            super.onPreExecute();
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see android.os.AsyncTask#doInBackground(Params[])
         */
        @Override
        protected Void doInBackground(Void... params) {
    
            signUpUserOnServer(this.serverURL, this.serverBundle);
    
            return null;
    
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(Void result) {
    
    
        }
        }
    
        /**
         * Sign up user on server.
         * 
         * @param url
         *            the url
         * @param bundle
         *            the bundle
         */
        private void signUpUserOnServer(String url, Bundle bundle) {
        final Session session = Session.getActiveSession();
        if (session != null && session.isClosed() == false) {
            final Request userInformation = new Request(session, url, bundle, HttpMethod.GET);
            final Response response = userInformation.executeAndWait();
            facebookObject = response.getGraphObject().getInnerJSONObject();
            Log.d("json", facebookObject.toString());
        }
        }
    
        /**
         * On session state change.
         * 
         * @param state
         *            the state
         */
        private void onSessionStateChange(SessionState state) {
    
        if (state == SessionState.OPENED) {
            if (isOnCreate) {
            isOnCreate = false;
            return;
            }
            onFacebookLoginDone();
        }
        }