繁体   English   中英

Android / Java - 将简单文本发布到Facebook墙上?

[英]Android/Java — Post simple text to Facebook wall?

我正试图在我的应用程序中将发布集成到一个人的墙上。 我已经有一个区域,用户可以保存他/她的用户名和密码(加密)。 我希望我的程序能够回忆起保存的用户名和密码,将其传递给Facebook进行身份验证,然后允许应用程序将简单文本(也可能是链接)发布到用户的墙上。

也就是说,我已经在Facebook的开发者页面上阅读了所有内容(api看起来对我来说完全陌生......我以前从未做过任何类型的网络应用程序开发......只是桌面应用程序),并尝试使用Java 这里的库但说实话,我不理解任何各种实现。 有些人声称使用起来很简单,但显然它们远远超出我的想象。

我甚至试过搞乱官方的Facebook Android SDK,但是使用了webview界面,我无法传递用户名和密码以便于身份验证。 另外,即使经过正确的身份验证,我仍然无法知道如何发布到墙上。

请帮忙。 谢谢。

哦,顺便说一下,我已经有了一个Facebook API密钥和应用程序ID。

[更新1]

有关进一步说明:如果我将以下代码片段与官方Facebook Android SDK http://github.com/facebook/facebook-android-sdk一起使用,我应该在接下来做什么(在用户登录后)? 我不清楚这一点。

Facebook facebookClient = new Facebook();
facebookClient.authorize(this, "[APP ID]", new String[] {"publish_stream", "read_stream", "offline_access"}, this);

其中“this”是实现DialogListener的Activity,“[APP ID]”是我的Facebook应用程序ID。

谢谢。

[更新2]

我找到了一个解决方案(见下文),但唯一缺少的是能够使用我存储在应用程序中的数据自动填充登录文本框。 官方Facebook Android SDK可能不允许这样做。 我会继续调查。

在汤姆的帮助下我想出来了(谢谢)。 关键是使用Facebook Android SDK创建一个带有“stream.publish”API调用的对话框。 以下是步骤:

  1. 下载官方Facebook Android SDK: http//github.com/facebook/facebook-android-sdk
  2. 将项目文件导入Eclipse。
  3. 将项目导出为* .jar文件。 (这可能会导致冲突)

    [UPDATE]

    Facebook最近更新了源代码,我注意到图标文件导致资源ID与我的项目冲突(Android 1.5+)。 我的解决方案是忘记导出为jar。 相反,将Facebook“com”文件夹直接复制到应用程序的“src”文件夹中(即“com.facebook.android”应该是您应用程序中的软件包...与您的源文件一起)。 如果您的“src”文件夹中已有“com”文件夹,请不要担心出现有关覆盖文件的任何对话框,不应覆盖任何源文件。 返回Eclipse,刷新“src”文件夹,“com.facebook.android”现在应该作为包列出。 将其中一个包含的Facebook图标复制到应用程序的“可绘制”文件夹中,并刷新它。 Eclipse会抱怨“FbDialog.java”文件...只需添加一个导入,指向你的应用程序的“R”文件到该文件的标题(例如,如果你的应用程序的包名是“com.android.myapp”,那么添加这个:“import com.android.myapp.R;”)。 如果需要,请转到#5。

  4. 将.jar文件添加到项目的构建路径中

  5. 请看以下简化示例代码:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import com.facebook.android.*;
import com.facebook.android.Facebook.DialogListener;

public class FacebookActivity extends Activity implements DialogListener,
        OnClickListener
{

    private Facebook facebookClient;
    private LinearLayout facebookButton;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.test);//my layout xml

        facebookButton = (LinearLayout)this.findViewById(R.id.Test_Facebook_Layout);

    }

    @Override
    public void onComplete(Bundle values)
    {

        if (values.isEmpty())
        {
            //"skip" clicked ?
            return;
        }

        // if facebookClient.authorize(...) was successful, this runs
        // this also runs after successful post
        // after posting, "post_id" is added to the values bundle
        // I use that to differentiate between a call from
        // faceBook.authorize(...) and a call from a successful post
        // is there a better way of doing this?
        if (!values.containsKey("post_id"))
        {
            try
            {
                Bundle parameters = new Bundle();
                parameters.putString("message", "this is a test");// the message to post to the wall
                facebookClient.dialog(this, "stream.publish", parameters, this);// "stream.publish" is an API call
            }
            catch (Exception e)
            {
                // TODO: handle exception
                System.out.println(e.getMessage());
            }
        }
    }

    @Override
    public void onError(DialogError e)
    {
        System.out.println("Error: " + e.getMessage());
    }

    @Override
    public void onFacebookError(FacebookError e)
    {
        System.out.println("Error: " + e.getMessage());
    }

    @Override
    public void onCancel()
    {
    }

    @Override
    public void onClick(View v)
    {
        if (v == facebookButton)
        {
            facebookClient = new Facebook();
            // replace APP_API_ID with your own
            facebookClient.authorize(this, APP_API_ID,
                new String[] {"publish_stream", "read_stream", "offline_access"}, this);
        }
    }
}
AsyncFacebookRunner mAsyncRunner;
    Facebook    facebook =new Facebook("Your app id");

btnLogin.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                facebook.authorize(FbdemoActivity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() {
                    @Override
                    public void onComplete(Bundle values) {



                    }

                    @Override
                    public void onFacebookError(FacebookError error) {
                    }

                    @Override
                    public void onError(DialogError e) {
                    }

                    @Override
                    public void onCancel() {
                    }
                });

            }
        });

    public void postOnWall(String msg) {
            Log.d("Tests", "Testing graph API wall post");
             try {
                    String response = facebook.request("me");
                    Bundle parameters = new Bundle();
                    parameters.putString("message", msg);
                    parameters.putString("description", "test test test");
                    response = facebook.request("me/feed", parameters, 
                            "POST");
                    Log.d("Tests", "got response: " + response);
                    if (response == null || response.equals("") || 
                            response.equals("false")) {
                       Log.v("Error", "Blank response");
                   }
             } catch(Exception e) {
                 e.printStackTrace();
             }

以下是对您的新问题的客观答案:“我接下来该做什么?”

快速查看源代码会让我相信这就是你所做的:

检查此URL以获取用于发表评论/帖子的REST( http://en.wikipedia.org/wiki/Representational_State_Transfer )API方法:

http://developers.facebook.com/docs/reference/rest/

具体来说: http//developers.facebook.com/docs/reference/rest/links.post

查看Facebook.java的第171到295行http://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/android/Facebook.java

要了解如何使用API​​来发出这些请求。

您可能想要这个方法(它已经过载,请参阅代码)。

        /**
* Make a request to Facebook's old (pre-graph) API with the given
* parameters. One of the parameter keys must be "method" and its value
* should be a valid REST server API method.
*
* See http://developers.facebook.com/docs/reference/rest/
*
* Note that this method blocks waiting for a network response, so do not
* call it in a UI thread.
*
* Example:
* <code>
* Bundle parameters = new Bundle();
* parameters.putString("method", "auth.expireSession");
* String response = request(parameters);
* </code>
*
* @param parameters
* Key-value pairs of parameters to the request. Refer to the
* documentation: one of the parameters must be "method".
* @throws IOException
* if a network error occurs
* @throws MalformedURLException
* if accessing an invalid endpoint
* @throws IllegalArgumentException
* if one of the parameters is not "method"
* @return JSON string representation of the response
*/
    public String request(Bundle parameters) 

对于那些有问题的人,在新的facebook(); ,字符串是App_id,只需删除授权呼叫中的APP_ID即可。

不知道为什么显示错误信息,但我想facebook更新了facebook SDK。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM