Правилно използване на вход във facebook

В моето приложение на началната страница моля потребителя да се удостовери чрез Facebook, след което искам някои разрешения и извличам малко информация:

LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
        authButton.setFragment(this);
        authButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));
        fb = new FacebookMain(); 

Мога да получа цялата тази информация, но преминавайки към следващата си страница, искам да дам бутон на моя изглед на списък и оттам потребителят да може да публикува на стената на приятели. Следвах примера на 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();
        }
    }

Това обаче не ми се струва правилен подход, има ли по-добър начин? Освен това как да разбера дали потребителската сесия е изтекла и да подканя потребителя да влезе отново? Изглежда документите не разкриват вътрешното функциониране на бутона за влизане?


person User3    schedule 14.05.2014    source източник
comment
Опитах комбинация от тези две публикации, това ми помогна да го изградя правилно developers.facebook.com/docs/android/login-with-facebook/v2.0 androidhive.info/2012/03/android-facebook-connect-tutorial   -  person Kamal Upasena    schedule 29.05.2014


Отговори (2)


Не започвайте нова сесия... променете го в изходния код

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

  • Добавете facebook SDK във вашия проект
  • Добавете редове по-долу в AndroidManifest.xml под етикет

        <activity android:name="com.facebook.LoginActivity" />
    
  • Също така добавете идентификатор на приложението facebook в string.xml

  • Декларирайте личните членове

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

    Вижте вашата лог котка с етикет "json" ще имате facebook обект

person Usman Afzal    schedule 28.05.2014