wake-up-neo.com

Wann kann ich mit dem neuen Android SDK 3.0) von Facebook Berechtigungen anfordern?

Mit dem neuen Android SDK 3.0, das vor einigen Tagen veröffentlicht wurde) von Facebook hat sich der Authentifizierungsprozess geändert.

Wie beantragen Sie eine Leseberechtigung wie "friends_hometown"?

Der folgende Code ist, wie ich es versuche - aber ich bin mir ziemlich sicher, dass es nicht so ist, wie Sie dies tun sollten:

Version 1:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Session.openActiveSession(this, true, new Session.StatusCallback() { // start Facebook login
        @Override
        public void call(Session session, SessionState state, Exception exception) { // callback for session state changes
            if (session.isOpened()) {
                List<String> permissions = new ArrayList<String>();
                permissions.add("friends_hometown");
                session.requestNewReadPermissions(new Session.NewPermissionsRequest(FBImport.this, permissions));
                Request.executeGraphPathRequestAsync(session, "me/friends/?access_token="+session.getAccessToken()+"&fields=id,name,hometown", new Request.Callback() {
                    ...
                });
            }
        }
    });
}

Version 2:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Session currentSession = Session.getActiveSession();
    if (currentSession == null || currentSession.getState().isClosed()) {
        Session session = Session.openActiveSession(this, true, fbStatusCallback); // PROBLEM: NO PERMISSIONS YET BUT CALLBACK IS EXECUTED ON OPEN
        currentSession = session;
    }
    if (currentSession != null && !currentSession.isOpened()) {
        OpenRequest openRequest = new OpenRequest(this).setCallback(fbStatusCallback); // HERE IT IS OKAY TO EXECUTE THE CALLBACK BECAUSE WE'VE GOT THE PERMISSIONS
        if (openRequest != null) {
            openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
            openRequest.setPermissions(Arrays.asList("friends_hometown"));
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
            currentSession.openForRead(openRequest);
        }
    }
}

Ich beantrage die Erlaubnis, sobald die Sitzung geöffnet ist. Zu diesem Zeitpunkt startet der Code jedoch bereits eine Graph API-Anfrage, sodass die Erlaubnisanfrage zu spät kommt.

Können Sie nicht gleichzeitig mit der Initialisierung der Sitzung eine Erlaubnis anfordern?

37
caw

Ich empfehle, dass Sie unser Login-Tutorial lesen hier speziell in Schritt 3. Die Verwendung der von uns bereitgestellten Login-Schaltfläche ist die bequemste Methode (siehe authButton.setReadPermissions()).

BEARBEITEN:

Das Festlegen von Berechtigungen ohne Verwendung der Anmeldeschaltfläche ist schwieriger, da Sie die gesamte Sitzungsverwaltung manuell durchführen müssen. Wenn Sie in den Quellcode für die Anmeldeschaltfläche graben, ist dies Codezeile wahrscheinlich das, was Sie brauchen. Anscheinend müssen Sie Ihren eigenen Session.OpenRequest Erstellen und dessen Attribute wie Berechtigungen, Zielgruppe und Anmeldeverhalten festlegen. Rufen Sie dann die aktuelle Sitzung ab und geben Sie openForRead() für Ihren Session.OpenRequest.

16
Jesse Chen

Ich konnte es zum Laufen bringen. Es ist eine Modifikation Ihres Version 2-Beispiels. Die link Jesse hat auch eine Tonne geholfen.

Hier ist der Code, den ich beim Authentifizieren eines Benutzers durchlaufen habe:

private void signInWithFacebook() {

    mSessionTracker = new SessionTracker(getBaseContext(), new StatusCallback() {

        @Override
        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(SignUpChoices.this);

        if (openRequest != null) {
            openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
            openRequest.setPermissions(Arrays.asList("user_birthday", "email", "user_location"));
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);

            mCurrentSession.openForRead(openRequest);
        }
    }else {
        Request.executeMeRequestAsync(mCurrentSession, new Request.GraphUserCallback() {
              @Override
              public void onCompleted(GraphUser user, Response response) {
                  Log.w("myConsultant", user.getId() + " " + user.getName() + " " + user.getInnerJSONObject());
              }
            });
    }
}

Zum Testen habe ich den folgenden Code durchlaufen, nachdem ich von der Facebook-Authentifizierung zurückgekehrt war:

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

  if (mCurrentSession.isOpened()) {
    Request.executeMeRequestAsync(mCurrentSession, new Request.GraphUserCallback() {

          // callback after Graph API response with user object
          @Override
          public void onCompleted(GraphUser user, Response response) {
              Log.w("myConsultant", user.getId() + " " + user.getName() + " " + user.getInnerJSONObject());
          }
        });
    }
}
67
KevinM

Ich habe das gleiche Problem gelöst, indem ich meine eigene Session.openActiveSession() -Methode implementiert habe:

private static Session openActiveSession(Activity activity, boolean allowLoginUI, StatusCallback callback, List<String> permissions) {
    OpenRequest openRequest = new OpenRequest(activity).setPermissions(permissions).setCallback(callback);
    Session session = new Builder(activity).build();
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) {
        Session.setActiveSession(session);
        session.openForRead(openRequest);
        return session;
    }
    return null;
}
55
Pedro Oliveira

Obwohl die erste Frage vor einigen Monaten gestellt wurde und es akzeptierte Antworten gibt, gibt es eine andere elegantere Lösung, um mehr Berechtigungen vom Benutzer während der Authentifizierung anzufordern. Außerdem wurde Facebook SDK 3.5 kürzlich veröffentlicht und es wäre gut, diesen Thread zu aktualisieren :)

Die elegante Lösung kommt mit dieser Open-Source-Bibliothek: Android-simple-facebook

Setup

Fügen Sie einfach die nächsten Zeilen in Ihre Klasse Activity ein:

  1. Definiere und wähle Berechtigungen , die du brauchst, wie friends_hometown:

    Permissions[] permissions = new Permissions[]
    {
        Permissions.FRIENDS_HOMETOWN,
        Permissions.FRIENDS_PHOTOS,
        Permissions.PUBLISH_ACTION
    };
    

    Das Tolle an den Berechtigungen ist, dass Sie die Berechtigungen READ und PUBLISH nicht trennen müssen. Sie erwähnen nur, was Sie brauchen und die Bibliothek kümmert sich um den Rest.

  2. Erstellen und definieren Sie die Konfiguration, indem Sie app_id, namespace und permissions:

    SimpleFacebookConfiguration configuration = new SimpleFacebookConfiguration.Builder()
            .setAppId("625994234086470")
            .setNamespace("sromkuapp")
            .setPermissions(permissions)
            .build();
    
  3. Erstellen Sie die Instanz SimpleFacebook und legen Sie die folgende Konfiguration fest:

    SimpleFacebook simpleFacebook = SimpleFacebook.getInstance(Activity);
    simpleFacebook.setConfiguration(configuration);
    

Jetzt können Sie die folgenden Methoden ausführen: login , publish feed/story , einladen ,…

Login

mSimpleFacebook.login(OnLoginListener);

Abmelden

mSimpleFacebook.logout(OnLogoutListener);

Weitere Beispiele und Verwendungsmöglichkeiten finden Sie auf dieser Seite: https://github.com/sromku/Android-simple-facebook#actions-examples

4
sromku