2014-05-08 20 views
6

Đây là lần đầu tiên tôi sử dụng SDK Android-Facebook. Tôi đang cố đăng một ảnh bitmap nhưng tôi tiếp tục nhận được thông báo này:SDK Android-Facebook: Không thể chia sẻ ảnh, hộp thoại không hiển thị

Warning: Error: com.facebook.FacebookException: Failed to copy image. 

Tôi có thể đăng liên kết đơn giản, nhưng không thể đăng liên kết đơn giản.

Tôi nên sửa lỗi này như thế nào? Ngoài ra, một điều tôi nhận thấy là StatusCallback.call() không được gọi.

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, resultCode, 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, "Done", 
            message, 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, SessionState state, 
      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(); 
     } 

    } 

} 
+0

bạn có thể gửi mã hoạt động của bạn. – anuruddhika

+0

@mussharapp bitmap đăng thành công trong facebook – Ashok

+0

@Mark, bạn có phải đặt hàm gọi lại bên trong 'onActivityResult()' không? Tôi đang cố gắng làm theo hướng dẫn Facebook để đăng ảnh nhưng nó không rõ ràng, và nó không nói bất cứ điều gì về việc thêm mã ở đó. Nhưng tôi đã làm theo hướng dẫn của họ và hộp thoại của tôi không hiển thị. https://developers.facebook.com/docs/sharing/android – Azurespot

Trả lời

28

Cuối cùng, nó đã hoạt động!

Trong dự án HelloFacebookSample cung cấp Tôi thấy điều này trong biểu hiện:

<provider android:authorities="com.facebook.app.NativeAppCallContentProvider355198514515820" 
        android:name="com.facebook.NativeAppCallContentProvider" 
        android:exported="true"/> 

Tôi chỉ đơn giản là thay đổi một phần số sử dụng riêng ID ứng dụng Facebook của tôi. Không chắc tại sao tôi không thấy điều này trong tài liệu.

EDIT Các mặt hàng này sau đó: https://developers.facebook.com/docs/reference/android/current/class/NativeAppCallContentProvider/

+0

Tôi đang sử dụng dự án HelloFacebookSample khi facebookapp được cài đặt trong mydeveice, nó hoạt động tốt cho me.fbapp chưa được cài đặt bitmap không đăng – Ashok

+0

Cảm ơn nó đã làm việc – Aayushi

+0

Tài liệu hiện tại (tính đến Tháng 6 năm 2015) nói để sử dụng: '' , nơi bạn đặt ID ứng dụng của mình ở vị trí '{APP_ID}', nhưng tôi đã có tất cả và vẫn gặp lỗi tương tự. :( – Azurespot

Các vấn đề liên quan