Android FB API 3.0 – 只设置一次权限

我试图弄清楚新API是如何工作的,所以我设法理解了这个概念,并设法做到了我自己的“hello world”,login到facebook,注销并尝试上传图片。

现在,在HelloFacebookSample和SessionLoginSimple中,都有一个简单的Facebooklogin,而在HelloFacebookSample中,当你点击“张贴照片”时,会出现一个新的login对话框,因为没有设置权限。

这是HelloFacebookSample的代码:

private void performPublish(PendingAction action) { Session session = Session.getActiveSession(); if (session != null) { pendingAction = action; if (session.getPermissions().contains("publish_actions")) { // We can do the action right away. handlePendingAction(); } else { // We need to reauthorize, then complete the action when we get called back. Session.ReauthorizeRequest reauthRequest = new Session.ReauthorizeRequest(this, PERMISSIONS). setRequestCode(REAUTHORIZE_ACTIVITY). setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); session.reauthorizeForPublish(reauthRequest); } } } 

所以,因为我们没有“publish_actions”,我们需要重新授权。

在SimpleSessionLoginlogin看起来像这样:

 private void onClickLogin() { Session session = Session.getActiveSession(); if (!session.isOpened() && !session.isClosed()) { session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); } else { Session.openActiveSession(this, true, statusCallback); } } 

所以,我无法弄清楚在login时如何请求权限。 这是一个奇怪的,或说冗余login到几秒钟的服务两次完全相同的对话。

它可以听到用户的东西是错的或怪异的。

我想login到facebook一次,需要的权限,但使用API​​ 3.0会话调用,而不是弃用的。

任何人都可以请解释如何?

Session.OpenRequest有一个方法可以设置权限。 但是,使用3.0 SDK,Facebook现在要求开发者分别请求“读取”和“发布”权限。 因此,如果您的应用程序需要同时读取用户信息和代表他们发布,那么您需要调用重新授权。

好的,这里是我使用Facebook的3.0 SDK的Android对话框片段。 它被封装,这意味着所有的Facebookfunction都包含在片段中。 这是一个对话框片段,因此它会popup您正在运行的活动。 这个片段可以让你login,然后使用Facebook附带的UiHelper类login后启用某些视图。

 public class FFragment extends DialogFragment { private static final String TAG = "FacebookFragment"; private UiLifecycleHelper uiHelper; private String mFilePath; private Button shareButton, cancelButton; private EditText mMessageText; private TextView mMessageTitle; private ProgressBar pBar; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.facebook_login, container, false); LoginButton authButton = (LoginButton) view .findViewById(R.id.authButton); authButton.setFragment(this); authButton.setPublishPermissions(Arrays.asList("publish_stream")); shareButton = (Button) view.findViewById(R.id.shareButton); mMessageText = (EditText) view.findViewById(R.id.facebook_post_text); mMessageTitle = (TextView) view.findViewById(R.id.facebook_post_title); cancelButton = (Button) view.findViewById(R.id.cancelButton); pBar = (ProgressBar) view.findViewById(R.id.facebook_pbar); cancelButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { FFragment.this.dismiss(); } }); shareButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { publishPhoto(); } }); return view; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mFilePath = getArguments().getString("file_path"); uiHelper = new UiLifecycleHelper(getActivity(), callback); uiHelper.onCreate(savedInstanceState); } /** * After user selects to upload photo */ private void publishPhoto() { pBar.setVisibility(View.VISIBLE); GraphObject graphObject; Bitmap bmap = BitmapFactory.decodeFile(mFilePath); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] byteArray = stream.toByteArray(); Bundle params = new Bundle(); params.putByteArray("picture", byteArray); params.putString("message", mMessageText.getText() + " " + getActivity().getResources().getString("String goes here")); Request request = new Request(Session.getActiveSession(), "me/photos",params, HttpMethod.POST); request.setCallback(new Request.Callback() { @Override public void onCompleted(Response response) { if (response.getError()==null) { Toast.makeText(getActivity(), "Successfully posted photo", Toast.LENGTH_SHORT).show(); FlurryAgent.logEvent(Globals.EVENT_FACEBOOK); } else { Toast.makeText(getActivity(), response.getError().getErrorMessage(), Toast.LENGTH_SHORT).show(); } pBar.setVisibility(View.GONE); FFragment.this.dismiss(); } }); request.executeAsync(); } private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (state.isOpened()) { Log.i(TAG, "Logged in..."); // Check for reading user_photos permission shareButton.setVisibility(View.VISIBLE); mMessageText.setVisibility(View.VISIBLE); mMessageTitle.setVisibility(View.VISIBLE); } else if (state.isClosed()) { Log.i(TAG, "Logged out..."); shareButton.setVisibility(View.GONE); mMessageText.setVisibility(View.GONE); mMessageTitle.setVisibility(View.GONE); } } private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); } }; @Override public void onResume() { super.onResume(); uiHelper.onResume(); // For scenarios where the main activity is launched and user // session is not null, the session state change notification // may not be triggered. Trigger it if it's open/closed. Session session = Session.getActiveSession(); if (session != null && (session.isOpened() || session.isClosed())) { onSessionStateChange(session, session.getState(), null); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data); } @Override public void onPause() { super.onPause(); uiHelper.onPause(); } @Override public void onDestroy() { super.onDestroy(); uiHelper.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); uiHelper.onSaveInstanceState(outState); } 

}

以下几行代码是您在活动中用来显示对话框的内容。

 FFragment mFacebookFragment = new FFragment(); Bundle args = new Bundle(); args.putString("file_path", mFilePath); mFacebookFragment.setArguments(args); mFacebookFragment.show(getSupportFragmentManager(), "tag"); 

无论如何,如果你看onCreate我们设置发布权限。 默认情况下,在片段启动时已经设置了读取权限。

也让你在清单中有这个。

 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/> 

其中@ string / app_id是您在开发人员网站上创build的Facbeook应用程序时创build的应用程序标识。 也请务必下载新的sdk facebook项目并将其作为库项目引用。 用于对话框布局的XML文件。

  <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical" > <com.facebook.widget.LoginButton android:id="@+id/authButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_gravity="center_horizontal|top" /> <TextView android:id="@+id/facebook_post_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:text="Message to post with photo" android:textColor="@android:color/white" android:textSize="18dp" android:textStyle="bold" android:visibility="gone" /> <EditText android:id="@+id/facebook_post_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:minLines="3" android:visibility="gone" /> <Button android:id="@+id/shareButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:gravity="center" android:text="Post" android:textStyle="bold" android:visibility="gone" /> <Button android:id="@+id/cancelButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Cancel" android:textStyle="bold" /> </LinearLayout> <ProgressBar android:id="@+id/facebook_pbar" android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" android:visibility="gone" /> 

第一次授权/login应用程序时,您只能请求读取权限。 我之前也尝试过这个新的SDK,也有些困惑。

Facebook希望用户对自己的应用的发布能力更有信心,因此您必须在第一次发布OG操作时重新授权发布权限。 如果您看Foursquare或Instagram发布OG的方式,他们有一个Facebookcheckbox或button,表示您想要在FB上共享该操作。 你可以实现类似的,或者我最终做的是在用户授权应用程序后,显示一个button,要求他们点击以启用发布到Facebook的行动。

Facebook 3.0 API实际上限制了不能同时要求阅读和发布。 我确实find了解决方法,但是你必须修改库。

只需将其添加到Session.java中即可:

 public final void openForReadAndPublish(OpenRequest openRequest) { open(openRequest, null); } 

这将导致它跳过引发exception的validation检查。 当然,你现在可能需要做更多的手工操作。 你也可以在Session中注释掉validatePermissions(openRequest,authType)调用,并且应该这样做,所以你可以传入你想要的任何权限。

@李明,当我创build一个会话使用

 public static final List<String> ALL_PERMISSIONS = Arrays.asList( "read_friendlists", "publish_stream", "offline_access", "email", "read_stream", "user_location" ); session.openForPublish(new Session.OpenRequest(this).setPermissions(ALL_PERMISSIONS).setCallback(statusCallback).setRequestCode(100)); 

获得的会话具有(读取和发布)权限。 所以我觉得想要获取会话的用户可以使用openForPublish()api。 有用…!!