使用 Facebook Android SDK 在 Facebook 墙上发帖,无需打开对话框
Posted
技术标签:
【中文标题】使用 Facebook Android SDK 在 Facebook 墙上发帖,无需打开对话框【英文标题】:Post on Facebook wall using Facebook Android SDK without opening dialog box 【发布时间】:2010-11-18 10:25:47 【问题描述】:使用 Facebook SDK,我可以登录并将我的access_token
存储到数据库中。当我尝试创建帖子时,由于以下问题,我的手机和模拟器上的 Facebook 墙仍然是空的:
1) 我从数据库中获取 access_token
并将 access_token
传递给 Facebook,但我不允许在墙上发帖。
2) 我无法在不打开对话框的情况下发布消息。
mPostButton.setOnClickListener(new OnClickListener()
public void onClick(View v)
String message = "Post this to my wall";
Bundle params = new Bundle();
params.putString("message", message);
mAsyncRunner.request("me/feed", params, "POST", new WallPostRequestListener());
);
public class WallPostRequestListener extends BaseRequestListener
public void onComplete(final String response)
Log.d("Facebook-Example", "Got response: " + response);
String message = "<empty>";
try
JSONObject json = Util.parseJson(response);
message = json.getString("message");
catch (JSONException e)
Log.w("Facebook-Example", "JSON Error in response");
catch (FacebookError e)
Log.w("Facebook-Example", "Facebook Error: " + e.getMessage());
final String text = "Your Wall Post: " + message;
Example.this.runOnUiThread(new Runnable()
public void run()
mText.setText(text);
);
如何在不打开对话框的情况下向 Facebook 发帖?
【问题讨论】:
看起来很简单,但是我尝试了Ankit的代码并得到以下错误:02-02 16:52:58.672: WARN/Bundle(6774): Key access_token expected byte[]但值是 java.lang.String。返回默认值我应用了以下代码,并且可以成功地将我的消息发布到墙上。
public void postOnWall(String msg)
Log.d("Tests", "Testing graph API wall post");
try
String response = mFacebook.request("me");
Bundle parameters = new Bundle();
parameters.putString("message", msg);
parameters.putString("description", "test test test");
response = mFacebook.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();
【讨论】:
然而,我正在寻找一种解决方案,以便在另一项活动中在墙上发布帖子,因为当我尝试从其他活动中在墙上发布消息时,它给了我一个错误,处理消息等等。跨度> 我也找到了解决方案,我刚刚通过调用“SessionStore.restore(mFacebook, this);”从我想发帖的页面恢复了我的 facebook 会话(Facebook 示例中给出的方法,文件名为 SessionStore) 嗨 Ankit,你能告诉我在调用这个函数之前你是如何授权用户的吗?我尝试创建一个传递应用程序ID的facebook对象,然后调用授权函数,出现登录框但登录后没有任何反应 mFb.authorize(this, new String[] "publish_stream", "read_stream", "offline_access",new LoginDialogListener()); 它为我提供了 AccessToken,我存储在 sharedPreferences 中的 TokenExpire 值,然后在我在 AsyncTask 中创建 Facebook 对象后,通过在 Facebook 对象中恢复这些 AccessToken 和 expire 值,我可以在我的 android 应用程序的任何活动中完成上述任务。 感谢您的代码,效果很好。我一直在模拟器和我的真手机上进行试验。它似乎总是让我保持登录状态。为什么需要在共享首选项中存储令牌信息?只有在请求offline_access时才需要吗?谢谢你的时间。【参考方案2】:我在http://www.integratingstuff.com/2010/10/14/integrating-facebook-into-an-android-application/ 更新了我的教程,它现在正好回答了这个问题。 它基于并且与 Ankit 的答案基本相同,但指导人们从头到尾通过实施整个过程。
【讨论】:
【参考方案3】:这并不是在不通知用户的情况下将某些内容张贴在墙上。当用户允许您的应用程序时,Android Facebook sdk 会显示另一个页面,其中有您的应用程序发送的文本,以及用户可以在墙上书写的文本框,类似于我附上的屏幕截图
移动设备上的实际布局略有不同,但格式相同。这个过程在 facebook android sdk 的示例示例中得到了很好的展示。
现在检查这篇文章中提出的问题:
Facebook Connect Android -- 使用 stream.publish @ http://api.facebook.com/restserver.php'>Facebook Connect Android -- using stream.publish @ http://api.facebook.com/restserver.php
在该问题中查找这些:postParams.put(),您的一些 JAVA 文件中会出现类似类型的行。您可以使用这些线路将数据发布到 Facebook。
例如:
postParams.put("user_message", "TESTING 123");
是消息,
postParams.put("attachment", "\"name\":\"Facebook Connect for Android\",\"href\":\"http://code.google.com/p/fbconnect-android/\",\"caption\":\"Caption\",\"description\":\"Description\",\"media\":[\"type\":\"image\",\"src\":\"http://img40.yfrog.com/img40/5914/iphoneconnectbtn.jpg\",\"href\":\"http://developers.facebook.com/connect.php?tab=iphone/\"],\"properties\":\"another link\":\"text\":\"Facebook home page\",\"href\":\"http://www.facebook.com\"");
是您为应用程序、描述、标题、标题等提供图标的行。
【讨论】:
嗨 viv,感谢您的回复。但是,我将如何在我的应用程序中处理这个问题,当用户点击特定按钮时,在通过 facebook 对他进行身份验证后,应该在他的墙上发布一些内容而不提示他。 我无法得到这个窗口..我应该设计这个窗口......或者如果有任何程序请告诉我......谢谢 @kamal_tech_view :有一种新方法。打开一个拨号,检查这个:developers.facebook.com/docs/reference/androidsdk/dialog,然后使用以下参数,检查这个:developers.facebook.com/docs/reference/dialogs/feed【参考方案4】:我使用 Ankit 的代码在 facebook 墙上发帖,但他的代码给了我错误 android.os.NetworkOnMainThreadException
。
在搜索此问题后,一个解决方案告诉我将您的代码放入AsyncTask
以摆脱此问题。修改他的代码后它对我来说工作正常。
修改后的代码如下:
public class UiAsyncTask extends AsyncTask<Void, Void, Void>
public void onPreExecute()
// On first execute
public Void doInBackground(Void... unused)
// Background Work
Log.d("Tests", "Testing graph API wall post");
try
String response = facebook.request("me");
Bundle parameters = new Bundle();
parameters.putString("message", "This test message for wall post");
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();
return null;
public void onPostExecute(Void unused)
// Result
【讨论】:
感谢 Deepak,在与 Web 服务/服务器通信时,您应该始终使用线程/异步任务,因此应该使用线程来间接在墙上发帖或在 twitter 上发帖。感谢您指出这一点。【参考方案5】:这个类帮助我在我的 Facebook 墙上发送消息WITHOUT对话框:
public class FBManager
private static final String FB_ACCESS_TOKEN = "fb_access_token";
private static final String FB_EXPIRES = "fb_expires";
private Activity context;
private Facebook facebookApi;
private Runnable successRunnable=new Runnable()
@Override
public void run()
Toast.makeText(context, "Success", Toast.LENGTH_LONG).show();
;
public FBManager(Activity context)
this.context = context;
facebookApi = new Facebook(FB_API_ID);
facebookApi.setAccessToken(restoreAccessToken());
public void postOnWall(final String text, final String link)
new Thread()
@Override
public void run()
try
Bundle parameters = new Bundle();
parameters.putString("message", text);
if(link!=null)
parameters.putString("link", link);
String response = facebookApi.request("me/feed", parameters, "POST");
if(!response.equals(""))
if(!response.contains("error"))
context.runOnUiThread(successRunnable);
else
Log.e("Facebook error:", response);
catch (Exception e)
e.printStackTrace();
.start();
public void save(String access_token, long expires)
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor=prefs.edit();
editor.putString(FB_ACCESS_TOKEN, access_token);
editor.putLong(FB_EXPIRES, expires);
editor.commit();
public String restoreAccessToken()
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
return prefs.getString(FB_ACCESS_TOKEN, null);
public long restoreExpires()
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
return prefs.getLong(FB_EXPIRES, 0);
【讨论】:
以上是关于使用 Facebook Android SDK 在 Facebook 墙上发帖,无需打开对话框的主要内容,如果未能解决你的问题,请参考以下文章
Android:在eclipse中导入facebook sdk 4.10.1
使用 Facebook Android SDK 在 Facebook 墙上发帖,无需打开对话框
在 Android 上使用 facebook SDK 会给出“用户以不同的 Facebook 用户身份登录”。错误
使用来自 android 的 sdk 3.19.0 在 Facebook 上上传图片
无法使用 Facebook Android SDK 和 Facebook Audience Network SDK 编译