我正在尝试从我的应用程序中集成发布到墙上。我已经有一个用户可以在其中保存用户名和密码(已加密)的区域。我希望我的程序重新调用保存的用户名和密码,将其传递给Facebook进行身份验证,然后允许该应用将简单的文本(也可能是链接)发布到用户的墙上。
就是说,我已经阅读了Facebook开发人员页面上的所有内容(该API对我来说似乎完全陌生。我从未做过任何类型的Web应用程序开发……只是台式机应用程序),并尝试了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可能不允许这样做。我会继续调查。
在汤姆(Tom)的帮助下,我找到了答案(谢谢)。关键是使用Facebook Android SDK通过“ stream.publish” API调用创建对话框。步骤如下:
[更新]
Facebook最近更新了源代码,我注意到该图标文件与我的项目(Android 1.5+)导致资源ID冲突。我的解决方案是忘记导出为jar。相反,直接将Facebook“ com”文件夹复制到应用程序的“ src”文件夹中(即“ com.facebook.android”应为应用程序中的一个包…与源文件一起)。如果“ src”文件夹中已经有一个“ com”文件夹,则不必担心出现任何有关覆盖文件的对话框,任何源文件都不应被覆盖。返回Eclipse,并刷新“ src”文件夹,“ com.facebook.android”现在应该作为软件包列出。将其中包含的Facebook图标之一复制到应用程序的“可绘制”文件夹中,并对其进行刷新。Eclipse会抱怨“ FbDialog.java”文件…只需将指向你应用程序“ R”文件的导入添加到该文件的头(例如,如果你应用程序的包名称是“ com.android.myapp”,则添加此:“导入com.android.myapp.R;”)。如果需要,请转到#5。
将.jar文件添加到项目的构建路径
查看以下简化的示例代码:
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); } } }