2014-09-30 2 views
0

У меня проблема с входом в facebook в моем приложении. Вход в систему работает только в том случае, если приложение Android Facebook не установлено. В этом случае вы получите всплывающее окно из facebook. Когда приложение Facebook установлено, логин будет перенаправлен в приложение. В этом случае я не получаю свой токен обратной связи, вместо этого получаю сообщение: CLOSED_LOGIN_FAILEDFacebook Войти не работает через приложение

Я искал повсюду, но я действительно не могу найти проблему.

Это код в моем фрагменте, кнопка Войти создаются с помощью XML:

private void initButtons() 
    { 
      btnFacebook.setApplicationId(v.getContext().getResources().getString(R.string.app_id)); 
      btnFacebook.setReadPermissions(Arrays.asList("email", "public_profile", "user_birthday")); 
      btnFacebook.setFragment(this); 
      btnFacebook.setSessionStatusCallback(new StatusCallback() 
      { 

       @Override 
       public void call(Session session, SessionState state, Exception exception) 
       { 
       Log.d("Token:",session.getAccessToken()); 
       } 

      }); 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     super.onActivityResult(requestCode, resultCode, data); 
     Session.getActiveSession().onActivityResult(this.getActivity(), requestCode, resultCode, data); 

} 

Любых идей, что я мог бы быть не хватаю? Опять же, вход в систему работает только без установленного приложения facebook.

EDIT: Я получаю сеанс Закрытый вход Неверное сообщение, когда используется учетная запись, уже зарегистрированное приложение. Когда пользователь впервые регистрируется в этом приложении (добавлен в свою учетную запись), результаты будут такими, какими они должны быть

ответ

0

Используйте данный класс в качестве помощника Facebook, который может иметь дело с вашей ошибкой.

import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.text.TextUtils; 

import com.facebook.FacebookException; 
import com.facebook.FacebookOperationCanceledException; 
import com.facebook.FacebookServiceException; 
import com.facebook.HttpMethod; 
import com.facebook.LoggingBehavior; 
import com.facebook.Request; 
import com.facebook.RequestAsyncTask; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.Settings; 
import com.facebook.widget.WebDialog; 
import com.quickblox.q_municate.R; 

import java.util.Arrays; 
import java.util.Collection; 
import java.util.List; 

public class FacebookHelper { 

    public static final List<String> PERMISSIONS = Arrays.asList("publish_actions", "publish_stream"); 
    private Activity activity; 
    private Session.StatusCallback facebookStatusCallback; 
    private Resources resources; 

    public FacebookHelper(Activity activity, Bundle savedInstanceState, 
      Session.StatusCallback facebookStatusCallback) { 
     this.activity = activity; 
     this.facebookStatusCallback = facebookStatusCallback; 
     resources = activity.getResources(); 
     initFacebook(savedInstanceState); 
    } 

    public static void logout() { 
     if (Session.getActiveSession() != null) { 
      Session.getActiveSession().closeAndClearTokenInformation(); 
     } 
    } 

    private void initFacebook(Bundle savedInstanceState) { 

     Session session = Session.getActiveSession(); 
     if (session != null) { 
      return; 
     } 
     if (savedInstanceState != null) { 
      session = Session.restoreSession(activity, null, facebookStatusCallback, savedInstanceState); 
     } 
     if (session == null) { 
      session = new Session(activity); 
     } 
     Session.setActiveSession(session); 
     if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
      session.openForRead(new Session.OpenRequest(activity).setCallback(facebookStatusCallback)); 
     } 
    } 

    public void onSaveInstanceState(Bundle outState) { 
     Session session = Session.getActiveSession(); 
     Session.saveSession(session, outState); 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data); 
    } 

    public void loginWithFacebook() { 
     TipsManager.setIsJustLogined(true); 
     Session session = Session.getActiveSession(); 
     if (!session.isOpened() && !session.isClosed()) { 
      session.openForRead(new Session.OpenRequest(activity).setCallback(facebookStatusCallback)); 
     } else { 
      Session.openActiveSession(activity, true, facebookStatusCallback); 
     } 
    } 

    public void onActivityStart() { 
     Session.getActiveSession().addCallback(facebookStatusCallback); 
    } 

    public void onActivityStop() { 
     if (Session.getActiveSession() != null) { 
      Session.getActiveSession().removeCallback(facebookStatusCallback); 
     } 
    } 

    public boolean isSessionOpened() { 
     return Session.getActiveSession().isOpened(); 
    } 

    public void postInviteToWall(Request.Callback requestCallback, String[] selectedFriends) { 
     Session session = Session.getActiveSession(); 
     if (session != null) { 
      Resources resources = activity.getResources(); 
      Bundle postParams = new Bundle(); 
      //Data from string.xml to post on wall ...You have to include the permission for posting 
      postParams.putString(Consts.FB_WALL_PARAM_NAME, resources.getString(R.string.inf_fb_wall_param_name)); 
      postParams.putString(Consts.FB_WALL_PARAM_DESCRIPTION, resources.getString(R.string.inf_fb_wall_param_description)); 
      postParams.putString(Consts.FB_WALL_PARAM_LINK, resources.getString(R.string.inf_fb_wall_param_link)); 
      postParams.putString(Consts.FB_WALL_PARAM_PICTURE, resources.getString(R.string.inf_fb_wall_param_picture)); 
      postParams.putString(Consts.FB_WALL_PARAM_PLACE, resources.getString(R.string.inf_fb_wall_param_place)); 
      postParams.putString(Consts.FB_WALL_PARAM_TAGS, TextUtils.join(",", selectedFriends)); 
      Request request = new Request(session, Consts.FB_WALL_PARAM_FEED, postParams, HttpMethod.POST, requestCallback); 
      RequestAsyncTask task = new RequestAsyncTask(request); 
      task.execute(); 
     } 
    } 

    private Bundle getBundleForFriendsRequest() { 
     Bundle postParams = new Bundle(); 
     postParams.putString(Consts.FB_REQUEST_PARAM_TITLE, resources.getString(R.string.inf_subject_of_invitation)); 
     postParams.putString(Consts.FB_REQUEST_PARAM_MESSAGE, resources.getString(R.string.inf_body_of_invitation)); 
     return postParams; 
    } 

    public WebDialog getWebDialogRequest() { 
     Bundle postParams = getBundleForFriendsRequest(); 
     return (new WebDialog.RequestsDialogBuilder(activity, 
       Session.getActiveSession(), postParams)).setOnCompleteListener(
       getWebDialogOnCompleteListener()).build(); 
    } 

    private WebDialog.OnCompleteListener getWebDialogOnCompleteListener() { 
     return new WebDialog.OnCompleteListener() { 

      @Override 
      public void onComplete(Bundle values, FacebookException facebookException) { 
       parseFacebookRequestError(values, facebookException); 
      } 
     }; 
    } 

    private void parseFacebookRequestError(Bundle values, FacebookException facebookException) { 
     if (facebookException != null) { 
      if (facebookException instanceof FacebookOperationCanceledException) { 
       DialogUtils.showLong(activity, resources.getString(R.string.inf_fb_request_canceled)); 
      } else if (facebookException instanceof FacebookServiceException) { 
       final int errorCodeCancel = 4201; 
       FacebookServiceException facebookServiceException = (FacebookServiceException) facebookException; 
       if (errorCodeCancel == facebookServiceException.getRequestError().getErrorCode()) { 
        DialogUtils.showLong(activity, resources.getString(R.string.inf_fb_request_canceled)); 
       } else { 
        ErrorUtils.showError(activity, 
          facebookServiceException.getRequestError().getErrorMessage()); 
       } 
      } else if (!TextUtils.isEmpty(facebookException.getMessage())) { 
       ErrorUtils.showError(activity, facebookException); 
      } 
     } else { 
      final String requestId = values.getString("request"); 
      if (requestId != null) { 
       DialogUtils.showLong(activity, resources.getString(R.string.dlg_success_request_facebook)); 
      } else { 
       DialogUtils.showLong(activity, resources.getString(R.string.inf_fb_request_canceled)); 
      } 
     } 
    } 

    public boolean checkPermissions() { 
     Session session = Session.getActiveSession(); 
     List<String> permissions = session.getPermissions(); 
     if (!isSubsetOf(FacebookHelper.PERMISSIONS, permissions)) { 
      Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity, 
        FacebookHelper.PERMISSIONS); 
      session.requestNewPublishPermissions(newPermissionsRequest); 
      return false; 
     } 
     return true; 
    } 

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

Вы также можете получить этот класс от сущности ссылки https://gist.github.com/LPURockers/e9cba51d85ffdf077062

+0

Это не сработало. Странная часть заключается в том, что приложение закрывается сразу после нажатия кнопки входа в систему, оно даже не показывает требуемые разрешения. Когда вы не используете приложение facebook для входа в систему, отображаются пропуски – HP1993

+0

Я думаю, что вы, возможно, что-то пропустили, за помощью вы можете получить помощь от Qmunicate App. https://github.com/QuickBlox/q-municate-android/blob/master/Q-municate/src/main/java/com/quickblox/q_municate/ui/authorization/base/BaseAuthActivity.java –

+0

Я создал другую приложение на консоли facebook, и там он может войти. Я меняю настройки на панели управления, но я не могу воспроизвести ошибку. Единственное, что я изменил в коде, - это идентификатор приложения. И они оба правильные – HP1993

Смежные вопросы