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调用,而不是已弃用的.
有人可以解释一下吗?
该Session.OpenRequest有在这里你可以设置权限的方法.但是,使用3.0 SDK,Facebook现在要求开发人员分别请求"读取"和"发布"权限.因此,如果您的应用需要同时阅读用户信息并代表他们发布,那么您需要调用重新授权.
好的,这是我制作的一个对话框片段,它使用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)
| 归档时间: |
|
| 查看次数: |
20310 次 |
| 最近记录: |