我正在我的应用程序中集成facebook登录和发布提要。为此,我使用的是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从头开始实现一切?
非常感谢您对此事的任何帮助或澄清
编辑:请澄清。在facebookSDK中,您可以请求新的权限,用户将看到新的权限屏幕以接受。这类似于instagram,我对此很满意,这就是我想要的。但我想知道为什么Simple Facebook库在注销之前会强制注销,有没有办法覆盖它,或者我必须停止使用该库,只使用原生的Facebook SDK重新实现所有功能?感谢
在最新的FB SDK中,Session类已被删除。所以这是等价的工作代码
LoginManager.getInstance().logInWithReadPermissions(
fragmentOrActivity,
Arrays.asList("email"));
参考编号:https://developers.facebook.com/docs/facebook-login/android/permissions
您所要求的是不可能的。(理所当然)若要获得新权限,您必须获得新的用户访问令牌。如果用户未重新验证自己并批准此新权限,FB将不会向您授予额外权限。这很有道理——当任何应用程序都可以在没有用户批准的情况下获得额外权限时,用户权限的意义何在?
理论上,您不必在请求新权限之前注销,但FB Android API不支持这种行为,因为只能有一个活动会话,因此必须直接使用FB REST API实现。
也许你最好的办法是在一开始就请求发布许可。
我不熟悉android,但在php中,它只会在添加权限的情况下撤销登录对话框,无需登录到facebook。据此:https://developers.facebook.com/docs/android/login-with-facebook/v2.1#permissions-发布
Session.NewPermissionsRequest newPermissionsRequest = new Session
.NewPermissionsRequest(this, Arrays.asList("publish_actions"));
session.requestNewPublishPermissions(newPermissionsRequest);
有一点是可以肯定的,对于每一组权限,您都会获得一个新的令牌,从中您可以在开放图调试器中查看您的权限。https://developers.facebook.com/tools/debug/或者通过api。
"很抱歉,由于我的声誉,我无法对此发表评论。"
注意:请使用最新的FBandroid API以获得更好的选择,并且易于集成
如果您想在开始时获得发布权限,请将以下代码与FacebookLoginButton一起使用
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;
}
我就是这么做的!
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);
}
}
这是视图的代码(它只是一个按钮,但你可以自定义到你想要的w/e!)
<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:这比异步请求权限要好得多。。。
private static final String PERMISSION = "publish_actions";
private boolean pendingAnnounce;
如果会话存在。您可以检查是否已授予publsh操作权限。如果是,您可以继续发布详细信息。。否则它会请求许可吗?
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);
}
}