使用 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。返回默认值 。为什么? 在执行 response = mFacebook.request("me/feed", parameters,"POST"); 之前,您似乎没有恢复 Facebook 对象中的 Access_Token 和 Token_Exprires 值,所以解决您的问题的方法可能是 SessionStore.restore(mFacebook, this); (facebook 示例中给出的方法,文件名为 SessionStore)或者 FacebookObject.setAccessToken(restore access_token 由 Facebook 提供); FacebookObject.setAccessExpires(恢复facebook提供的access_expires); 【参考方案1】:

我应用了以下代码,并且可以成功地将我的消息发布到墙上。

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 编译

在Android工作室使用facebook sdk