2010-06-01 46 views
45

我试图张贴到自己的墙,从我的应用程序中集成。我已经有一个区域,用户可以保存他/她的用户名和密码(加密)。我想我的程序调用已保存的用户名和密码,传递到Facebook的身份验证,然后允许应用程序发布简单的文字(也许是太链接)到用户的墙。Android/Java - 将简单文本发布到Facebook墙上?

这么说,我读过关于Facebook的开发者页面的一切(该API看起来完全陌生的我...我从来没有做过任何类型的Web应用程序开发的前...只是桌面应用程序),并尝试了Java库here,但说实话,我不明白任何各种实现。有人声称使用起来很简单,但显然他们远远超出了我的想象。

我甚至试图与Facebook官方Android SDK中搞乱,而是采用网页视图界面,​​我不能轻松认证的用户名和密码通过。另外,即使经过正确的认证,我仍然无法知道如何张贴到墙上。

请帮忙。 谢谢。

哦,顺便说一句,我已经有一个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可能不允许这样做。我会继续研究它。

+0

我还没有找到一种方法来执行此状态更新“在后台”,而不显示对话框。我尝试过直接使用图形API和SDK为Android提供的access_token,但它不起作用。没有例外。 – 2010-07-28 03:12:58

+0

我仍然能够正常工作,但是单点登录选项可以在没有用户名/密码的情况下登录,如果他们已经在手机上使用了Facebook。它仍然要求授权。 – HaMMeReD 2010-12-19 04:48:00

+0

伙计非常感谢 你救了我的屁股。我有这个东西为tommorows演示工作。 但仍然有一些东西,我需要在我的Facebook分享: - - 我可以张贴图像以及墙上的文字? - 我可以将我的文章的所有内容链接到我的客户网站吗? 除了这个我很高兴我想通了 – abhishek 2011-02-04 02:51:49

回答

45

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

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

    [更新]

    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); 
     } 
    } 
} 
 
+1

哪个项目应该导出为.jar? facebook文件夹中的文件夹(不是示例文件夹)? 我得到一个关于哪些资源应该被导出的许多选项的屏幕,我应该在那里选择什么? Tnx – DixieFlatline 2010-06-26 16:19:56

+0

嘿,所有你需要的是源文件夹(“Facebook”)和资源,如果它可以让你选择。虽然有一件事。 Facebook最近改变了一些源,我有问题导入生成的jar到我的项目(有一个资源ID与Facebook图标和我的项目中的文件冲突)。我更新了解决方案以包含修复程序。 抱歉没有及时回复。 – RyanM 2010-06-27 11:33:06

+0

至于函数onComplete中if(!values.containsKey(“post_id”))的注释,我认为你可以简单地传递一个新的DialogDelegate作为facebookClient.dialog的第四个参数来避免这个问题。无论如何,感谢一个非常有用的例子! – 9re 2010-09-28 12:51:57

1

以下是您的新问题“接下来要做什么?”的一个客观答案。

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

选中此网址为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

退房线171通过Facebook.java 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) 
+0

感谢您的回复。您的链接帮助我意识到接下来我需要做什么(我发布了解决方案)。唯一缺少的是能够使用我存储在应用程序中的数据自动填充登录文本框。 – RyanM 2010-06-02 09:27:25

0

为那些谁的问题,新的Facebook(); ,这个字符串就是你的App_id,并且只需在授权调用中删除APP_ID即可。

不知道为什么会显示错误消息,但我猜Facebook更新了Facebook SDK。

6
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(); 
      }