Android / Java – 简单的文本发布到Facebook墙?

我正在尝试从我的应用程序中整合张贴到墙上。 我已经有一个区域,用户可以保存他/她的用户名和密码(encryption)。 我希望我的程序能够调用已保存的用户名和密码,并将其传递给Facebook进行身份validation,然后允许应用程序发送简单的文本(也可能是链接)到用户的墙上。

也就是说,我已经阅读了Facebook上开发者页面上的所有内容(api对我来说完全是陌生的…我从来没有做过任何types的web应用程序开发,只是桌面应用程序),并尝试使用Java图书馆,但说实话,我不明白任何各种实施。 有人声称使用起来很简单,但显然他们都超出了我的想象。

我甚至试图搞乱官方的Facebook Android SDK,但使用webview界面,我不能通过用户名和密码进行简单的身份validation。 另外,即使经过正确的authentication,我仍然无能为力。

请帮忙。 谢谢。

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

[更新1]

为了进一步的澄清:如果我使用官方Facebook Android SDK下面的代码片段http://github.com/facebook/facebook-android-sdk接下来我应该做什么(用户login后)? 这个我不清楚。

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]

我find了一个解决scheme(见下文),但唯一缺less的是能够使用我存储在应用程序中的数据自动填充login文本框。 官方的Facebook Android SDK可能不允许这样做。 我会继续研究它。

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

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

    [UPDATE]

    Facebook最近更新了源代码,我注意到图标文件导致资源ID与我的项目(Android 1.5+)冲突。 我的解决scheme是忘记导出为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文件添加到项目的构buildpath

  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); } } }
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以获取可用于留下评论/post的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(); ,那么这个string就是你的App_id,只需要在授权的调用中删除APP_ID。

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