Добавление дополнительных разрешений для facebook LoginButton


Я интегрирую приложение для Android с приложением facebook, до сих пор мне это удавалось, но
без дополнительных разрешений (при входе в систему) может ли кто-нибудь дать мне общее руководство?
Я добавляю классы, которые я использовал для этого -
Основной класс для обработки всех действий, связанных с активностью в Facebook -

public abstract class FacebookActivity extends Activity {
    // Class variables
    protected GraphUser mFacebookUser;
    protected UiLifecycleHelper mUiHelper;
    protected SessionState mSessionState;
    protected Session mSession;

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

    protected FacebookDialog.Callback dialogCallback = new FacebookDialog.Callback() {
        @Override
        public void onError(FacebookDialog.PendingCall pendingCall,
                Exception error, Bundle data) {
            Log.d("FacebookActivity",
                    String.format("Error: %s", error.toString()));
        }

        @Override
        public void onComplete(FacebookDialog.PendingCall pendingCall,
                Bundle data) {
            Log.d("FacebookActivity", "Success!");
        }
    };

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initFacebookUser(savedInstanceState);
        mUiHelper = new UiLifecycleHelper(this, callback);
        mUiHelper.onCreate(savedInstanceState);
        setContentView(setActivityLayout());
        InitiateUIComponents(savedInstanceState);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mUiHelper.onResume();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mUiHelper.onSaveInstanceState(outState);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mUiHelper.onActivityResult(requestCode, resultCode, data,
                dialogCallback);
    }

    @Override
    public void onPause() {
        super.onPause();
        mUiHelper.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mUiHelper.onDestroy();
    }

    protected void onSessionStateChange(Session session, SessionState state,
            Exception exception) {
        this.mSessionState = state;
        this.mSession = session;
    }

    private void initFacebookUser(Bundle bundle) {
        if (mFacebookUser == null) {
            GetUserAsync task = new GetUserAsync();
            task.execute(new Bundle[] { bundle });
        }
    }

    protected void postStatusUpdate(String message) {
        if (mFacebookUser != null && hasPublishPermission()) {
            Request request = Request.newStatusUpdateRequest(
                    Session.getActiveSession(), message, null, null,
                    new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            doOnStatusUpdate(response.getGraphObject(),
                                    response.getError());
                        }
                    });
            request.executeAsync();
        }
    }

    protected boolean hasPublishPermission() {
        Session session = Session.getActiveSession();
        return session != null
                && session.getPermissions().contains("publish_actions");
    }

    public GraphUser getFacebookUser(Bundle bundle) {
        // Method variables
        Session session;
        Request request;
        Response response;
        GraphUser sessionUser;

        session = Session.getActiveSession();

        // If the session is null try and create a new session
        if (session == null) {
            if (bundle != null) {
                session = Session.restoreSession(this, null, callback, bundle);
            }
            if (session == null) {
                session = new Session(this);
            }
            Session.setActiveSession(session);
            if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
                session.openForRead(new Session.OpenRequest(this)
                        .setCallback(callback));
            }
        }

        request = new Request(session, "me", null, HttpMethod.GET);
        response = request.executeAndWait();
        if (response.getError() != null) {
            // bla bla
        } else {
            sessionUser = response.getGraphObjectAs(GraphUser.class);
            if (sessionUser != null) {
                return sessionUser;
            }
        }

        // If no user has been fetched
        return null;
    }

    /**
     * This method is used to set the activity layout to use simply return the
     * layout resource id (as R.layout.layout_resouce_id)
     * 
     * @return The address to the layout resource id
     */
    protected abstract int setActivityLayout();

    /**
     * This method injects the instantiation of the UI components to the built
     * in Android onCreate activity
     */
    protected abstract void InitiateUIComponents(Bundle bundle);

    /**
     * This method handle the action to be taken after a status update (toast,
     * notify, etc.) In order to do nothing simply leave it empty Note - The
     * given parameters are simply passed on runtime
     * 
     * @param result
     *            - The post request result
     * @param error
     *            - The facebook request error
     */
    protected abstract void doOnStatusUpdate(GraphObject result,
            FacebookRequestError error);

    private class GetUserAsync extends AsyncTask<Bundle, Void, Void> {

        @Override
        protected Void doInBackground(Bundle... bundle) {
            mFacebookUser = getFacebookUser(bundle[0]);
            return null;
        }

        @Override
        protected void onPostExecute(Void input) {

        }
    }
}


Класс, который я использую для регистрации пользователя с помощью facebook -

public class ActivityRegister extends FacebookActivity {

    // Class variables
    private String name;
    private String email;
    private String password;
    private EditText editTextName;
    private EditText editTextEmail;
    private EditText editTextPassword;
    private Intent intent;
    private UserFunctions user;
    private Button btnRegister;
    private LoginButton loginButton;
    private boolean isValid;

    @Override
    protected int setActivityLayout() {
        return R.layout.activity_register_screen;
    }

    /**
     * A method to validate user given details
     * 
     * @return True in case all the details are ok false otherwise
     */
    private boolean validateUserDetails(String name, String email,
            String password) {
        return false;
    }

    @Override
    protected void doOnStatusUpdate(GraphObject result,
            FacebookRequestError error) {

    }

    @Override
    protected void InitiateUIComponents(Bundle bundle) {
        user = new UserFunctions();
        btnRegister = (Button) findViewById(R.id.registerBtnRegister);
        btnRegister.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // get the data out of the fields
                editTextName = (EditText) findViewById(R.id.registerName);
                editTextEmail = (EditText) findViewById(R.id.registerEmail);
                editTextPassword = (EditText) findViewById(R.id.registerPassword);

                // get the text out of the edit text objects
                name = editTextName.getText().toString();
                email = editTextEmail.getText().toString();
                password = editTextPassword.getText().toString();
                isValid = validateUserDetails(name, email, password);
                if (isValid) {
                    user.RegisterUser(name, name, email, password);
                } else {
                    gotoNextScreen();
                }
            }
        });

        loginButton = (LoginButton) findViewById(R.id.facebook_login_button);
        loginButton.setReadPermissions(Arrays.asList("publish_actions"));
        loginButton
                .setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
                    @Override
                    public void onUserInfoFetched(GraphUser user) {
                        ActivityRegister.this.mFacebookUser = user;
                        if (mFacebookUser != null) {
                            gotoNextScreen();
                        }
                    }
                });
    }

    private void gotoNextScreen() {
        intent = new Intent(ActivityRegister.this, ActivityUUID.class);
        startActivity(intent);
        finish();
    }

}


Я нашел ветку, связанную с добавлением дополнительных разрешений на виджет кнопки входа в систему Facebbok
кажется, они просто приводят к сбою моего приложения...
Обратите внимание, что я использую Facebook SDK версии 3.6
TNX заранее

Изменить:
мне удалось добавить разрешения на публикацию, заменив следующий -
loginButton.setReadPermissions(Arrays.asList("publish_actions"));
by
loginButton.setPublishPermissions(Arrays.asList("publish_actions "));

Проблема в том, что теперь мне не удается получить активного пользователя (удалив эту строку, я получаю пользователя после согласия с условиями приложения, но, добавляя GraphUser, остается нулевым..) любая помощь ??


person crazyPixel    schedule 14.02.2014    source источник


Ответы (1)


У меня тоже была такая же проблема, тогда я работаю с кнопкой входа без publish_actions. Когда мне нужна эта перманентность, я перепроверяю, есть ли она у сеанса. Если нет, я сделал запрос на новую перманентность из моего сеанса.

person Pham Lai    schedule 02.04.2014
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его сообщением — вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно репутация, вы сможете комментировать любой пост. - person Ayush; 03.04.2014
comment
Наоборот, это действительно кажется объяснением решения проблемы. Не каждый ответ, начинающийся со слов «У меня тоже была такая же проблема», является плохим. На самом деле многие решения приходят от людей, которые сталкивались с одной и той же проблемой и преодолели ее. - person Chris Stratton; 03.04.2014
comment
извините за ответ, но я приношу ему свое решение, может быть, оно нехорошее, но я знаю только 1 способ исправить, как мой ответ - person Pham Lai; 03.04.2014