OAuthException при попытке опубликовать на стене друзей
У меня много проблем при попытке опубликовать на стене друзей с помощью API Facebook в Android. Вот что у меня на данный момент:
if (facebook.isSessionValid()) {
String response = facebook.request((userID == null) ? "me" : userID);
Bundle params = new Bundle();
params.putString("message", "put message here");
params.putString("link", "http://mylink.com");
params.putString("caption", "{*actor*} just posted this!");
params.putString("description", "description of my link. Click the link to find out more.");
params.putString("name", "Name of this link!");
params.putString("picture", "http://mysite.com/picture.jpg");
response = facebook.request(((userID == null) ? "me" : userID) + "/feed", params, "POST");
Log.d("Tests",response);
if (response == null || response.equals("") ||
response.equals("false")) {
Log.v("Error", "Blank response");
}
} else {
// no logged in, so relogin
Log.d("1234567890", "sessionNOTValid, relogin");
}
}catch(Exception e){
e.printStackTrace();
}
Но это возвращается с этой ошибкой:
12-11 21:34:06.604: D/FACEBOOK RESPONSE(14954): {"error":{"message":"(#200) Feed story publishing to other users is disabled for this application","type":"OAuthException","code":200}}
2 ответа
Вы, вероятно, недавно создали это приложение Facebook, что означает, что в феврале 2013 года включены последние изменения.
Последние изменения февраля включают в себя:
Удаление возможности публиковать в стенах друзей через Graph API
Мы удалим возможность публиковать сообщения на стенах друзей пользователя через Graph API. В частности, сообщения против [user_id]/feed, где [user_id] отличается от пользователя сеанса, или вызовы stream.publish, где user_id пользователя отличается от пользователя сеанса, завершатся ошибкой. Если вы хотите, чтобы люди могли публиковать сообщения на ленте своих друзей, откройте диалоговое окно канала. Истории, которые включают друзей с помощью пометок пользователя или тегов действий, будут отображаться на временной шкале друга (при условии, что друг одобряет тег). Для получения дополнительной информации см. Этот пост в блоге.
Мы отключаем эту функцию, начиная с февраля, если вы хотите включить ее (только временно до февраля), перейдите на панель мониторинга своего приложения> Настройки> Дополнительно> Отключить "Февраль 2013 года, последние изменения"
Однако я настоятельно рекомендую не делать этого, так как начиная с февраля эта функция приведет к тому, что ваше приложение снова выдаст ту же ошибку.
У меня есть решение, которое может вам помочь, я использую это для своего кода, и он работает нормально..
private void publishFeedDialog (String friend_uid) {
try{
Session mCurrentSession = Session.getActiveSession();
SessionTracker mSessionTracker = new SessionTracker(
getBaseContext(), new StatusCallback() {
public void call(Session session, SessionState state,
Exception exception) {
}
}, null, false);
String applicationId = Utility
.getMetadataApplicationId(getBaseContext());
mCurrentSession = mSessionTracker.getSession();
if (mCurrentSession == null
|| mCurrentSession.getState().isClosed()) {
mSessionTracker.setSession(null);
Session session = new Session.Builder(getBaseContext())
.setApplicationId(applicationId).build();
Session.setActiveSession(session);
mCurrentSession = session;
}
if (!mCurrentSession.isOpened()) {
Session.OpenRequest openRequest = null;
openRequest = new Session.OpenRequest(
NewFriendList.this);
if (openRequest != null) {
openRequest
.setDefaultAudience(SessionDefaultAudience.FRIENDS);
openRequest.setPermissions(Arrays.asList("email", "publish_actions"));
openRequest
.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
mCurrentSession.openForPublish(openRequest);
}
}
if (regobj != null && friend_uid != null ) {
final Activity activity = this;
Bundle params = new Bundle();
//This is what you need to post to a friend's wall
params.putString("from", "" + regobj.MyFBID);
params.putString("to", friend_uid);
//up to this
params.putString("name", "Facebook SDK for Android");
params.putString("caption", "Build great social apps and get more installs.");
params.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps.");
params.putString("link", "https://developers.facebook.com/android");
params.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png");
WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(this, mCurrentSession, params))
.setOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(Bundle values, FacebookException error) {
if (error == null) {
// When the story is posted, echo the success
// and the post Id.
final String postId = values.getString("post_id");
if (postId != null) {
Toast.makeText(activity,
"Posted story, id: "+postId,
Toast.LENGTH_SHORT).show();
} else {
// User clicked the Cancel button
Toast.makeText(activity,
"Publish cancelled",
Toast.LENGTH_SHORT).show();
}
} else if (error instanceof FacebookOperationCanceledException) {
// User clicked the "x" button
Toast.makeText(activity,
"Publish cancelled",
Toast.LENGTH_SHORT).show();
} else {
// Generic, ex: network error
Toast.makeText(activity,
"Error posting story",
Toast.LENGTH_SHORT).show();
}
}
}).build();
feedDialog.show();
}
}catch(Exception e)
{
Log.d("Error", ""+e.toString());
}
}
Этот код будет работать только для одного пользователя. Если вы хотите отправить его нескольким пользователям, вы можете использовать RequestsDialogBuilder вместо WebDialog.