Intereting Posts
Ошибка: ожидания ожидания для блокировки кеша класса buildscript для файла сборки при изменении minSdkVersion Не найден ресурс, который соответствует указанному имени '@android: style / Theme.Material.Light.DialogWhenLarge.NoActionBar' Как сделать Android-телефон Bluetooth-гарнитурой? Как закодировать звук без пробелов в Android? Какой самый простой способ получить текущий день недели в Android? Fragment saveInstanceState приходит как null после изменения ориентации Добавление представлений между элементами в GridView Использование пользовательского цвета для фона кнопки при использовании атрибута selectableItemBackground Android вернется к предыдущему действию Внедрение навигации «Drilldown» в Android App UI API 14 и 15 отсутствуют в Android Studio 2.0 AVD manager Возвращение функции int из native (c ++, jni) сбой ExpandableListAdapter onClickListener, вызов notifyDataSetChanged () Android Maps API v2 Изменить значок MyLocation Включение функции увеличения размера экрана в приложении Phonegap Android не влияет

Получите разрешение publish_action после получения прав на чтение от Facebook

Я интегрирую Facebook в мой приложение. Я могу получить разрешения на чтение, но как получить разрешения на публикацию из Facebook SDK.

Вот как я прошу разрешения для чтения:

 @Override public void onClick(View v) { Session currentSession = Session.getActiveSession(); if (currentSession == null || currentSession.getState().isClosed()) { Session session = new Session.Builder(context).build(); Session.setActiveSession(session); currentSession = session; } if (currentSession.isOpened()) { // Do whatever u want. User has logged in } else if (!currentSession.isOpened()) { // Ask for username and password OpenRequest op = new Session.OpenRequest((Activity) context); op.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); op.setCallback(null); List<String> permissions = new ArrayList<String>(); permissions.add("user_likes"); permissions.add("email"); permissions.add("user_birthday"); permissions.add("user_location"); permissions.add("user_interests"); permissions.add("friends_birthday"); op.setPermissions(permissions); Session session = new Builder(MainActivity.this).build(); Session.setActiveSession(session); session.openForRead(op); } } }); 

Если пользователь предоставил разрешение, я могу получить access_token и делать свои вещи onActivityResult . Вот что я делаю с этим:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (Session.getActiveSession() != null) Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); Session currentSession = Session.getActiveSession(); if (currentSession == null || currentSession.getState().isClosed()) { Session session = new Session.Builder(context).build(); Session.setActiveSession(session); currentSession = session; } if (currentSession.isOpened()) { Session.openActiveSession(this, true, new Session.StatusCallback() { @Override public void call(final Session session, SessionState state, Exception exception) { if (session.isOpened()) { Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { TextView welcome = (TextView) findViewById(R.id.welcome); TextView access_token_txt = (TextView) findViewById(R.id.access_token); TextView email_txt = (TextView) findViewById(R.id.email); access_token = session.getAccessToken(); firstName = user.getFirstName(); fb_user_id = user.getId(); access_token_txt.setText(access_token); JSONObject graphResponse = response .getGraphObject().getInnerJSONObject(); fbEmail = null; try { fbEmail = graphResponse.getString("email"); } catch (JSONException e) { e.printStackTrace(); } email_txt.setText(fbEmail); } } }); } } }); } } 

Я прочитал документ для Facebook Developer как объяснено здесь. Разрешения – разработчики Facebook , которые я не могу запросить разрешения на публикацию с разрешениями на чтение.

Первый пользователь должен будет просить прочитать и когда пользователь будет авторизовать, тогда мы можем запросить разрешения на публикацию.

Как я могу получить разрешения на публикацию в журнале Facebook после того, как пользователь предоставил разрешения на чтение.

Любая помощь будет оценена по достоинству.

Solutions Collecting From Web of "Получите разрешение publish_action после получения прав на чтение от Facebook"

У меня есть ответ на мой вопрос. Просто нужно открыть сеанс после получения разрешений на чтение, а затем попросить разрешения на публикацию. Вот что я сделал:

 private static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); private boolean pendingPublishReauthorization = false; 

Добавьте это в свой onActivityResult :

 Session session = Session.getActiveSession(); if (session != null) { // Check for publish permissions List<String> permissions = session.getPermissions(); if (!isSubsetOf(PERMISSIONS, permissions)) { pendingPublishReauthorization = true; Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest( this, PERMISSIONS); session.requestNewPublishPermissions(newPermissionsRequest); return; } } 

Также включите этот метод в код:

 private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) { for (String string : subset) { if (!superset.contains(string)) { return false; } } return true; } 

Делая эти вещи, я могу одновременно читать и публиковать разрешения.

Надеюсь, это поможет другим.

Из документов facebook sdk 3.0 вы не можете давать разрешение на чтение и публикацию одновременно. Но как только вы откроете сеанс с правом на чтение позже, вы можете обновить этот сеанс, чтобы опубликовать разрешение, классом UiLifecycleHelper. Когда состояние сеанса изменяется на SessionState.OPENED_TOKEN_UPDATED, сеанс обновляется с разрешением публикации. Вот пример кода, на который вы надеетесь, что эта помощь вам поможет.

 public class Example { private static final int REAUTH_ACTIVITY_CODE = 100; private static final List<String> PERMISSIONS = Arrays.asList("publish_actions", "publish_stream"); private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_submit_post); uiHelper = new UiLifecycleHelper(this, callback); uiHelper.onCreate(savedInstanceState); publishStory(); } private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { if (exception != null) { new AlertDialog.Builder(SubmitPost.this) .setMessage(exception.getMessage()) .setPositiveButton("OK", null).show(); } else { SubmitPost.this.onSessionStateChange(session, state, exception); } } }; private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (state.isOpened()) { if (pendingAnnounce && state.equals(SessionState.OPENED_TOKEN_UPDATED)) { // Session updated with new permissions so try publishing once more. pendingAnnounce = false; //call your method here to publish something on facebook publishStory(); } } } private void requestPublishPermissions(Session session) { if (session != null) { pendingAnnounce = true; Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS); newPermissionsRequest.setRequestCode(REAUTH_ACTIVITY_CODE); Session mSession = Session.openActiveSessionFromCache(this); mSession.addCallback(callback); mSession.requestNewPublishPermissions(newPermissionsRequest); } } private void publishStory() { // Check for publish permissions List<String> permissions = this.session.getPermissions(); if (!permissions.containsAll(Arrays.asList(PERMISSIONS ))) { this.requestPublishPermissions(this.session); this.is_return = true; return; } Session session = Session.getActiveSession(); if (session != null) { CreateFBPost(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REAUTH_ACTIVITY_CODE: Session session = Session.getActiveSession(); if (session != null) { session.onActivityResult(this, requestCode, resultCode, data); } break; } }