如何申请新的Facebook权限,而无需注销

时间:2014-09-21 14:53:27

标签: android facebook-android-sdk android-simple-facebook

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

我实现了Login流程,然后我正在处理Publish流程。为此,我想做以下事情:

当用户点击我的应用中的分享到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类似,我很好,这就是我想要的。但是我想知道为什么简单的Facebook库在这样做之前强制注销,有没有办法覆盖它,或者我是否必须停止使用该库并通过仅使用本机facebook SDK重新实现所有内容?感谢

6 个答案:

答案 0 :(得分:2)

在最新的FB SDK中,Session类已被删除。所以这是等效的工作代码

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

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

答案 1 :(得分:1)

你问的是不可能的。 (理所当然) 要获得新权限,您必须获取新的用户访问令牌。如果没有用户重新验证自己并批准此新权限,FB将不会为您提供额外的权限。这很有意义 - 当任何应用程序在未经用户批准的情况下获得其他权限时,用户权限的重点是什么?

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

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

答案 2 :(得分: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。

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

答案 3 :(得分: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开发者控制台,在状态和审核下,在Facebook批准审核后,提交您希望应用询问的权限的审核, facebook将通过用户登录来询问他们。

PD:这比请求权限异步更好...

答案 4 :(得分: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;
}

答案 5 :(得分: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);
            }
        }