我正试图在我的应用程序中将发布集成到一个人的墙上.我已经有一个区域,用户可以保存他/她的用户名和密码(加密).我希望我的程序能够回忆起保存的用户名和密码,将其传递给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调用的对话框.以下是步骤:
下载官方Facebook Android SDK:http://github.com/facebook/facebook-android-sdk
将项目文件导入Eclipse.
将项目导出为*.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.
将.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);
}
}
}
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(); }