在Android上上传图片至Facebook,无需使用Facebook SDK。

3
我正在开发一个应用程序,它与Facebook的唯一连接是为了上传位图。有没有不需要注册应用、下载sdk等操作就能完成上传的方法?

你有尝试过什么吗?你有任何可用的东西吗? - Anthony Graglia
到目前为止,我已经尝试使用SDK了,但什么都没能成功。 - n00b programmer
3个回答

0

兄弟,试试这个

import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.text.util.Linkify;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class UploadPhotoResultDialog extends Dialog {

private String response, photo_id;
private TextView mOutput, mUsefulTip;
private Button mViewPhotoButton, mTagPhotoButton;
private ImageView mUploadedPhoto;
private Activity activity;
private ProgressDialog dialog;
private boolean hidePhoto = false;
private Handler mHandler;

public UploadPhotoResultDialog(Activity activity, String title, String response) {
    super(activity);
    this.activity = activity;
    this.response = response;
    setTitle(title);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mHandler = new Handler();

    setContentView(R.layout.upload_photo_response);
    LayoutParams params = getWindow().getAttributes();
    params.width = LayoutParams.FILL_PARENT;
    params.height = LayoutParams.FILL_PARENT;
    getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);

    mOutput = (TextView) findViewById(R.id.apiOutput);
    mUsefulTip = (TextView) findViewById(R.id.usefulTip);
    mViewPhotoButton = (Button) findViewById(R.id.view_photo_button);
    mTagPhotoButton = (Button) findViewById(R.id.tag_photo_button);
    mUploadedPhoto = (ImageView) findViewById(R.id.uploadedPhoto);

    JSONObject json;
    try {
        json = Util.parseJson(response);
        final String photo_id = json.getString("id");
        this.photo_id = photo_id;

        mOutput.setText(json.toString(2));
        mUsefulTip.setText(activity.getString(R.string.photo_tip));
        Linkify.addLinks(mUsefulTip, Linkify.WEB_URLS);

        mViewPhotoButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (hidePhoto) {
                    mViewPhotoButton.setText(R.string.view_photo);
                    hidePhoto = false;
                    mUploadedPhoto.setImageBitmap(null);
                } else {
                    hidePhoto = true;
                    mViewPhotoButton.setText(R.string.hide_photo);
                    /*
                     * Source tag: view_photo_tag
                     */
                    Bundle params = new Bundle();
                    params.putString("fields", "picture");
                    dialog = ProgressDialog.show(activity, "",
                            activity.getString(R.string.please_wait), true, true);
                    dialog.show();
                    Utility.mAsyncRunner.request(photo_id, params,
                            new ViewPhotoRequestListener());
                }
            }
        });
        mTagPhotoButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*
                 * Source tag: tag_photo_tag
                 */
                setTag();
            }
        });
    } catch (JSONException e) {
        setText(activity.getString(R.string.exception) + e.getMessage());
    } catch (FacebookError e) {
        setText(activity.getString(R.string.facebook_error) + e.getMessage());
    }
}

public void setTag() {
    String relativePath = photo_id + "/tags/" + Utility.userUID;
    Bundle params = new Bundle();
    params.putString("x", "5");
    params.putString("y", "5");
    Utility.mAsyncRunner.request(relativePath, params, "POST", new TagPhotoRequestListener(),
            null);
}

public class ViewPhotoRequestListener extends BaseRequestListener {

    @Override
    public void onComplete(final String response, final Object state) {
        try {
            JSONObject json = Util.parseJson(response);
            final String pictureURL = json.getString("picture");
            if (TextUtils.isEmpty(pictureURL)) {
                setText("Error getting \'picture\' field of the photo");
            } else {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        new FetchImage().execute(pictureURL);
                    }
                });
            }
        } catch (JSONException e) {
            dialog.dismiss();
            setText(activity.getString(R.string.exception) + e.getMessage());
        } catch (FacebookError e) {
            dialog.dismiss();
            setText(activity.getString(R.string.facebook_error) + e.getMessage());
        }
    }

    public void onFacebookError(FacebookError error) {
        dialog.dismiss();
        setText(activity.getString(R.string.facebook_error) + error.getMessage());
    }
}

public class TagPhotoRequestListener extends BaseRequestListener {

    @Override
    public void onComplete(final String response, final Object state) {
        if (response.equals("true")) {
            String message = "User tagged in photo at (5, 5)" + "\n";
            message += "Api Response: " + response;
            setText(message);
        } else {
            setText("User could not be tagged.");
        }
    }

    public void onFacebookError(FacebookError error) {
        setText(activity.getString(R.string.facebook_error) + error.getMessage());
    }
}

public void setText(final String txt) {
    mHandler.post(new Runnable() {
        @Override
        public void run() {
            mOutput.setText(txt);
        }
    });
}

private class FetchImage extends AsyncTask<String, Void, Bitmap> {
    @Override
    protected Bitmap doInBackground(String... urls) {
        return Utility.getBitmap(urls[0]);
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        dialog.dismiss();
        mUploadedPhoto.setImageBitmap(result);
    }
}}

0

假设用户已经安装了Facebook应用程序,您可以使用您的图像触发ACTION_SEND意图。然后用户选择Facebook并以这种方式上传它。在我看来有点丑陋......但是为什么要避免SDK呢?将其集成起来并不太难,并且在您考虑要在应用中执行其他操作时,可以为您提供更多的灵活性。


0

我之前尝试过这篇文章,下载了所有东西等等,但是遇到了一些问题。Java无法识别某些库等等,所以我希望有一个非常简单的方法来解决它。它希望可以分发 :) - n00b programmer
你应该发布代码……这有助于人们了解正在发生的事情,以便他们能提供帮助。 - Anthony Graglia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接