Android FB API 3.0 - 仅设置一次权限

Bal*_*yto 14 android facebook facebook-android-sdk

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

现在在HelloFacebookSample和SessionLoginSimple中,只需登录到facebook,在HelloFacebookSample中,当您单击"发布照片"时,会出现一个新的登录对话框,因为未设置权限.

这是来自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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因为我们没有"publish_actions",我们需要重新授权.

在SimpleSessionLogin中,登录如下所示:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我无法弄清楚如何在登录期间请求权限.使用完全相同的对话框在几秒钟内登录服务两次是一种奇怪或冗余.

它可以让用户听到错误或奇怪的事情.

我想使用所需的权限登录到facebook一次,但是使用API​​ 3.0 Session调用,而不是已弃用的.

有人可以解释一下吗?

Min*_* Li 8

Session.OpenRequest有在这里你可以设置权限的方法.但是,使用3.0 SDK,Facebook现在要求开发人员分别请求"读取"和"发布"权限.因此,如果您的应用需要同时阅读用户信息并代表他们发布,那么您需要调用重新授权.


Dan*_*ofr 6

好的,这是我制作的一个对话框片段,它使用Facebook的3.0 SDK for Android.它是封装的,意味着片段中包含所有Facebook功能.这是一个对话框片段,因此会弹出您正在运行的活动.此片段允许您登录,然后在使用Facebook附带的UiHelper类登录后启用某些视图.

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);
}
Run Code Online (Sandbox Code Playgroud)

}

以下代码行是您在活动中用于显示对话框的代码.

FFragment mFacebookFragment = new FFragment();
        Bundle args = new Bundle();
        args.putString("file_path", mFilePath);
        mFacebookFragment.setArguments(args);
        mFacebookFragment.show(getSupportFragmentManager(), "tag");
Run Code Online (Sandbox Code Playgroud)

无论如何,如果您查看onCreate,我们将设置发布权限.默认情况下,片段启动时已设置读取权限.

也让你在清单中有这个.

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
Run Code Online (Sandbox Code Playgroud)

其中@ string/app_id是您在开发人员网站上创建facbeook应用程序时创建的应用程序ID.另外一定要下载新的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"
    />
Run Code Online (Sandbox Code Playgroud)