1

我正在我的应用程序中集成 facebook 登录和发布提要。为此,我正在使用Android Simple Facebook

我实现了登录流程,然后我正在处理发布流程。为此,我想做以下事情:

当用户在我的应用程序中单击分享到 facebook 按钮时,我不想直接发布,但我想获得发布权限,以便稍后发布(类似于 instagram,他们首先获得权限,然后他们添加照片时发布)。

为此,我这样做了:

if (mSimpleFacebook.isLogin()) {
    //The user is logged in so we proceed
    if (mSimpleFacebook.getGrantedPermissions().contains(
        Permission.PUBLISH_ACTION.getValue())) {
        hasPermission = true;
    } else {
        //we don't have permission we request it.
        mSimpleFacebook.requestNewPermissions(
            SocialUtilities.getFacebookPublishPermissions(), true,
            newPermissionListener);
    }
}

但是,即使我已经登录并有一个会话,我也会在获得许可之前提示我再次登录。我查看了 Simple Facebook 库的代码,看起来他正在注销然后再次登录,登录后他请求新的权限。

我想问,为什么会这样?我们不能只请求新权限而不注销然后再次登录(类似于instagram)吗?由于 SessionManager 是私有且不可访问的,因此无法在库中覆盖该行为。

那么有没有一种方法可以在不注销并强制用户再次登录的情况下使用库来请求新权限?还是我必须把它放在一边,使用原生 Facebook SDK 从头开始​​实现一切?

非常感谢您对此事的任何帮助或澄清

编辑: 为了澄清。在 facebook SDK 中,您可以请求新的权限,并且用户将看到新的权限屏幕以接受。这类似于 instagram 我同意,这就是我想要的。但我想知道为什么 Simple Facebook 库在这样做之前会强制注销,有没有办法覆盖它,或者我是否必须停止使用该库并仅使用本机 facebook SDK 重新实现所有内容?感谢

4

6 回答 6

2

在最新的 FB SDK 中,Session 类已被移除。所以这是等效且有效的代码

LoginManager.getInstance().logInWithReadPermissions(
    fragmentOrActivity,
    Arrays.asList("email"));

参考:https ://developers.facebook.com/docs/facebook-login/android/permissions

于 2016-07-04T08:36:09.003 回答
1

我对 android 不熟悉,但在 php 中,它只撤销登录对话框并添加了权限,无需登录 facebook。据此: https ://developers.facebook.com/docs/android/login-with-facebook/v2.1#permissions-publish

 Session.NewPermissionsRequest newPermissionsRequest = new Session
   .NewPermissionsRequest(this, Arrays.asList("publish_actions"));
 session.requestNewPublishPermissions(newPermissionsRequest);

可以肯定的是,对于每组权限,您都会获得一个新令牌,您可以从中在打开的图形调试器中查看您的权限。 https://developers.facebook.com/tools/debug/ 或通过 api。

“抱歉,由于我的名声,我无法对此发表评论。”

于 2014-09-27T07:02:50.803 回答
1

你问的是不可能的。(这是理所当然的)要获得新的权限,您必须获得新的用户访问令牌。除非用户重新验证自己并批准此新权限,否则 FB 不会给您额外的权限。这很有意义 - 当任何应用程序无需用户批准即可获得额外权限时,用户权限的意义何在?

理论上,您不必在请求新权限之前注销,但 FB Android API 不支持此行为,因为只能有一个活动会话,因此必须直接使用 FB REST API 来实现。

可能你最好的选择是在一开始就要求发布许可。

于 2014-09-25T09:48:44.690 回答
0
private static final String PERMISSION = "publish_actions";
private boolean pendingAnnounce;  

如果会话存在。您可以检查是否已授予发布操作权限。如果是,您可以继续发布您的详细信息。否则它会请求许可?

 if (session.isOpened())
     {

                                List<String> permissions = session.getPermissions();
                                if (!permissions.contains(PERMISSION)) {
                                    pendingAnnounce = true;
                                    requestPublishPermissions(session);
                                    return;
                                }



private void requestPublishPermissions(Session session) {
            if (session != null) {
                Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
                        this, PERMISSION)
                        // demonstrate how to set an audience for the publish
                        // permissions,
                        // if none are set, this defaults to FRIENDS
                        .setDefaultAudience(SessionDefaultAudience.FRIENDS)
                        .setRequestCode(REAUTH_ACTIVITY_CODE);
                session.requestNewPublishPermissions(newPermissionsRequest);
            }
        }
于 2014-09-30T08:53:59.543 回答
0

我就是这样做的!

public class FacebookConnection extends FragmentActivity {
    private MainFragment mainFragment;
    private final String TAG = "FacebookConnection";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Session fbook = Session.openActiveSession(this,false,null);
        if(fbook != null) {
            Log.e(TAG, "!=null");
            if (fbook.isOpened()) {
                Log.e(TAG, "fbook is connected");
                if (fbook.isPermissionGranted("publish_actions") && fbook.isPermissionGranted("user_photos")) {
                    Log.e(TAG, "have permissions");
                    //whatever you want to do.
                    finish();
                }
            }
        }
        if (savedInstanceState == null) {
            // Add the fragment on initial activity setup
            mainFragment = new MainFragment();
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(android.R.id.content, mainFragment)
                    .commit();
        } else {
            // Or set the fragment from restored state info
            mainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(android.R.id.content);
        }

    }

这是视图的代码(它只是一个按钮,但您可以根据需要自定义!)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.widget.LoginButton
        android:id="@+id/authButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        />

</LinearLayout>

现在关于您不必使用代码的多个权限,请转到 facebook 开发人员控制台,在状态和审核下,提交您希望您的应用要求的权限的审核,在 facebooks 批准审核后,facebook 会询问为他们从用户登录。

PD:这比请求异步权限要好得多......

于 2014-09-29T01:34:22.480 回答
0

注意:请使用最新的 FBandroid API 以获得更好的选择,并且易于集成。

如果您想在开始时发布权限,请使用以下代码和 Facebook LoginButton

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

否则使用以下权限获取登录用户详细信息

private static final List<String> PERMISSIONS = Arrays.asList("public_profile","user_friends");

示例:(一次请求任何一个权限,不要同时使用)

loginButton.setReadPermissions(PERMISSIONS);

要请求新权限,请使用以下

private void requestfor_new_permissions()
{
       Session session = Session.getActiveSession();

        if (session != null)
        {

             // Check whether you have already granted these permissions    
             List<String> permissions = session.getPermissions();

             if (!isSubsetOf(PERMISSIONS, permissions)) 
             {
                 Session.NewPermissionsRequest newPermissionsRequest = new Session
                        .NewPermissionsRequest(this, PERMISSIONS);
                 session.requestNewPublishPermissions(newPermissionsRequest);

                 return;
             }
          else
          {
              //publish your items
          }
        }
}

private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
    for (String string : subset) {
        if (!superset.contains(string)) {
            return false;
        }
    }
    return true;
}
于 2014-09-30T07:14:15.677 回答