我正试图在我的应用中将发布集成到一个人的墙上。我已经有一个区域,用户可以保存他/她的用户名和密码(加密)。我希望我的程序能够回忆起保存的用户名和密码,将其传递给Facebook进行身份验证,然后允许应用程序将简单文本(也可能是链接)发布到用户的墙上。
那就是说,我已经阅读了Facebook开发者页面上的所有内容(api对我来说看起来完全陌生......我以前从未做过任何类型的网络应用程序开发......只是桌面应用程序),并进行了实验使用Java库here但是说实话,我不理解任何各种实现。有些人声称使用起来很简单,但显然它们远远超出我的想象。
我甚至尝试过使用官方的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可能不允许这样做。我会继续研究它。
答案 0 :(得分:45)
我在汤姆的帮助下想出来了(谢谢)。关键是使用Facebook Android SDK创建一个带有“stream.publish”API调用的对话框。以下是步骤:
将项目导出为* .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);
}
}
}
答案 1 :(得分: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();
}
答案 2 :(得分: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
查看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)
答案 3 :(得分:0)
对于那些有问题的人,在新的facebook(); ,字符串是App_id,只需删除授权呼叫中的APP_ID。
不知道为什么显示错误信息,但我猜Facebook更新了facebook SDK。