1

我想在 Facebook 上分享手机 SD 卡上的图像。

我的问题是运行应用程序后,我可以看到以下消息

Myapplication 想要访问您的公开个人资料和好友列表。

但是当我按 OK 并转到我的 Facebook 页面时,我在那里看不到任何图像。

我正在按照此链接上的说明进行操作,我的代码如下

public class PhotoActivity extends BaseFragmentActivity {
    private static final String MIME_TYPE = "image/jpeg";

    private Uri uri;
    private ImageView mPhotoView;

    private Session.StatusCallback mStatusCallback = new SessionStatusCallback();
    private boolean mPostToWall = false;

    private ImageButton retakeBtn;

    private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {

            if (session.isOpened() && mPostToWall) {
                share();

            }
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        Session.getActiveSession().addCallback(mStatusCallback);
    }

    @Override
    public void onStop() {
        super.onStop();
        Session.getActiveSession().removeCallback(mStatusCallback);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode,
                resultCode, data);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Session session = Session.getActiveSession();
        Session.saveSession(session, outState);
    }

    private void share() {


        Bundle bundle = new Bundle();
        mPhotoView.setDrawingCacheEnabled(true);
        mPhotoView.buildDrawingCache();
        Bitmap bmap = mPhotoView.getDrawingCache();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmap.compress(Bitmap.CompressFormat.JPEG, 80, stream);
        byte[] byteArray = stream.toByteArray();

        bundle.putByteArray("picture", byteArray);


            WebDialog feedDialog = (
                new WebDialog.FeedDialogBuilder(getApplicationContext(),
                    Session.getActiveSession(),
                    bundle))
                .setOnCompleteListener(new OnCompleteListener() {

                    @Override
                    public void onComplete(Bundle values,
                        FacebookException error) {
                        if (error == null) {
                            // When the story is posted, echo the success
                            // and the post Id.
                            final String postId = values.getString("post_id");
                            if (postId != null) {
                                Toast.makeText(getApplicationContext(),
                                    "Posted story, id: "+postId,
                                    Toast.LENGTH_SHORT).show();
                            } else {
                                // User clicked the Cancel button
                                Toast.makeText(getApplicationContext(), 
                                    "Publish cancelled", 
                                    Toast.LENGTH_SHORT).show();
                            }
                        } else if (error instanceof FacebookOperationCanceledException) {
                            // User clicked the "x" button
                            Toast.makeText(getApplicationContext(), 
                                "Publish cancelled", 
                                Toast.LENGTH_SHORT).show();
                        } else {
                            // Generic, ex: network error
                            Toast.makeText(getApplicationContext(), 
                                "Error posting story", 
                                Toast.LENGTH_SHORT).show();
                        }
                    }

                })
                .build();
            feedDialog.show();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppTheme);

        uri = getIntent().getData();

        setContentView(R.layout.activity_photo);

        retakeBtn = (ImageButton) findViewById(R.id.retake_btn);

        String lang = getString(R.string.lang);
        if (lang.endsWith("FR")) {
            retakeBtn.setImageResource(R.drawable.retake_xhdpi);
        } else {
            retakeBtn.setImageResource(R.drawable.retake_en_xhdpi);

        }

        // Facebook
        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

        Session session = Session.getActiveSession();
        if (session == null) {
            if (savedInstanceState != null) {
                session = Session.restoreSession(this, null, mStatusCallback,
                        savedInstanceState);
            }
            if (session == null) {
                session = new Session(this);
            }
            Session.setActiveSession(session);
            if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {

                session.openForPublish(new Session.OpenRequest(PhotoActivity.this)
                        .setCallback(mStatusCallback).setPermissions(Arrays.asList("photo_upload","publish_stream","publish_actions")));


            }
        }

        mPhotoView = (ImageView) findViewById(R.id.photo);
        mPhotoView.setImageURI(uri);

        retakeBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent intent = new Intent(PhotoActivity.this,
                        CameraActivity.class);
                startActivity(intent);

                finish();
            }
        });


    }

    @Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.item_photo_activity, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(
            com.actionbarsherlock.view.MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            Intent intent = new Intent(PhotoActivity.this, CameraActivity.class);
            intent.putExtra("from_activity", 300);
            startActivity(intent);
            finish();
            break;

        case R.id.share_button:
            Session session = Session.getActiveSession();

            if (!session.isOpened() && !session.isClosed()) {
                session.openForPublish(new Session.OpenRequest(PhotoActivity.this)
                        .setCallback(mStatusCallback).setPermissions(Arrays.asList("photo_upload","publish_stream","publish_actions")));


            } else {
                Session.openActiveSession(PhotoActivity.this, true,
                        mStatusCallback);
            }
            break;
        }
        return true;
    }
4

2 回答 2

1

您正在尝试将照片添加到提要对话框,该对话框不采用二进制数据。请参阅此处的提要对话框文档,“图片”参数仅采用 URL。

如果要上传照片,需要获得“publish_actions”权限,并调用Request.newUploadPhotoRequest方法。查看 SDK 附带的 Hello Facebook 示例应用程序,它演示了如何上传照片。

于 2013-08-26T21:50:37.657 回答
1

确保您已授予所有权限。

我认为您忘记添加一些权限,例如:“photo_upload”、“publish_stream”、“publish_actions”。

授予此权限并尝试一下,可能会奏效。

于 2013-08-24T12:00:48.200 回答