这是我第一次使用
Android-Facebook SDK.我想发布一个位图,但我继续收到这条消息:
- Warning: Error: com.facebook.FacebookException: Failed to copy image.
我该怎么解决这个问题?另外,我注意到的一件事是没有调用StatusCallback.call().
- public abstract class FacebookReadyBaseActivity extends Activity {
- private static final String TAG = "FacebookReadyBaseActivity";
- private UiLifecycleHelper uiHelper;
- protected PendingAction pendingAction = PendingAction.NONE;
- private static final String PERMISSION = "publish_actions";
- protected boolean canPresentShareDialogWithPhotos;
- private boolean canPresentShareDialog;
- private GraphUser user;
- private GraPHPlace place;
- private List<GraphUser> tags;
- protected Bitmap pendingBitmap;
- protected enum PendingAction {
- NONE,POST_PHOTO,POST_STATUS_UPDATE
- }
- private Session.StatusCallback callback = new Session.StatusCallback() {
- @Override
- public void call(Session session,SessionState state,Exception exception) {
- onSessionStateChange(session,state,exception);
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- uiHelper = new UiLifecycleHelper(this,callback);
- uiHelper.onCreate(savedInstanceState);
- canPresentShareDialog = FacebookDialog.canPresentShareDialog(this,FacebookDialog.ShareDialogFeature.SHARE_DIALOG);
- canPresentShareDialogWithPhotos = FacebookDialog.canPresentShareDialog(
- this,FacebookDialog.ShareDialogFeature.PHOTOS);
- }
- @Override
- protected void onActivityResult(int requestCode,int resultCode,Intent data) {
- super.onActivityResult(requestCode,resultCode,data);
- uiHelper.onActivityResult(requestCode,data,new FacebookDialog.Callback() {
- @Override
- public void onError(FacebookDialog.PendingCall pendingCall,Exception error,Bundle data) {
- Log.e(TAG,String.format("Error: %s",error.toString()));
- }
- @Override
- public void onComplete(
- FacebookDialog.PendingCall pendingCall,Bundle data) {
- Log.i(TAG,"Success!");
- }
- });
- }
- @Override
- protected void onResume() {
- super.onResume();
- uiHelper.onResume();
- }
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- uiHelper.onSaveInstanceState(outState);
- }
- @Override
- public void onPause() {
- super.onPause();
- uiHelper.onPause();
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- uiHelper.onDestroy();
- }
- protected UiLifecycleHelper getFacebookUiHelper() {
- return uiHelper;
- }
- protected void performPublish(PendingAction action,boolean allowNoSession) {
- Session session = Session.getActiveSession();
- if (session != null) {
- pendingAction = action;
- if (hasPublishPermission()) {
- // We can do the action right away.
- handlePendingAction();
- return;
- } else if (session.isOpened()) {
- // We need to get new permissions,then complete the action when
- // we get called back.
- session.requestNewPublishPermissions(new Session.NewPermissionsRequest(
- this,PERMISSION));
- return;
- }
- }
- if (allowNoSession) {
- pendingAction = action;
- handlePendingAction();
- }
- }
- private boolean hasPublishPermission() {
- Session session = Session.getActiveSession();
- return session != null
- && session.getPermissions().contains("publish_actions");
- }
- @SuppressWarnings("incomplete-switch")
- private void handlePendingAction() {
- PendingAction prevIoUslyPendingAction = pendingAction;
- // These actions may re-set pendingAction if they are still pending,but
- // we assume they
- // will succeed.
- pendingAction = PendingAction.NONE;
- switch (prevIoUslyPendingAction) {
- case POST_PHOTO:
- postPhoto();
- break;
- case POST_STATUS_UPDATE:
- postStatusUpdate();
- break;
- }
- }
- private void postPhoto() {
- if (canPresentShareDialogWithPhotos) {
- FacebookDialog shareDialog = createShareDialogBuilderForPhoto(
- pendingBitmap).build();
- uiHelper.trackPendingDialogCall(shareDialog.present());
- } else if (hasPublishPermission()) {
- Request request = Request.newUploadPhotoRequest(
- Session.getActiveSession(),pendingBitmap,new Request.Callback() {
- @Override
- public void onCompleted(Response response) {
- InfoDialog.newInstance(
- FacebookReadyBaseActivity.this,"Done","Photo share finished.",null).show();
- }
- });
- request.executeAsync();
- } else {
- pendingAction = PendingAction.POST_PHOTO;
- }
- }
- private void postStatusUpdate() {
- if (canPresentShareDialog) {
- FacebookDialog shareDialog = createShareDialogBuilderForLink()
- .build();
- uiHelper.trackPendingDialogCall(shareDialog.present());
- } else if (user != null && hasPublishPermission()) {
- // TODO fixme
- final String message = "Status update finished.";
- Request request = Request.newStatusUpdateRequest(
- Session.getActiveSession(),message,place,tags,new Request.Callback() {
- @Override
- public void onCompleted(Response response) {
- InfoDialog.newInstance(
- FacebookReadyBaseActivity.this,null).show();
- }
- });
- request.executeAsync();
- } else {
- pendingAction = PendingAction.POST_STATUS_UPDATE;
- }
- }
- private FacebookDialog.PhotoShareDialogBuilder createShareDialogBuilderForPhoto(
- Bitmap... photos) {
- return new FacebookDialog.PhotoShareDialogBuilder(this)
- .addPhotos(Arrays.asList(photos));
- }
- private FacebookDialog.ShareDialogBuilder createShareDialogBuilderForLink() {
- return new FacebookDialog.ShareDialogBuilder(this)
- .setName("Hello Facebook")
- .setDescription(
- "The 'Hello Facebook' sample application showcases simple Facebook integration")
- .setLink("http://developers.facebook.com/android");
- }
- private void onSessionStateChange(Session session,Exception exception) {
- if (pendingAction != PendingAction.NONE
- && (exception instanceof FacebookOperationCanceledException || exception instanceof FacebookAuthorizationException)) {
- InfoDialog.newInstance(FacebookReadyBaseActivity.this,"Failed","Not granted.",null).show();
- pendingAction = PendingAction.NONE;
- } else if (state == SessionState.OPENED_TOKEN_UPDATED) {
- handlePendingAction();
- }
- }
- }
解决方法
终于搞定了!
在提供的HelloFacebookSample项目中,我在清单中看到了这个:
- <provider android:authorities="com.facebook.app.NativeAppCallContentProvider355198514515820"
- android:name="com.facebook.NativeAppCallContentProvider"
- android:exported="true"/>
我只是使用自己的Facebook应用程序ID更改了数字部分.不知道为什么我没有在文档中看到这一点.
编辑
之后发现:https://developers.facebook.com/docs/reference/android/current/class/NativeAppCallContentProvider/