2010-06-01 40 views
45

我試圖張貼到自己的牆,從我的應用程序中集成。我已經有一個區域,用戶可以保存他/她的用戶名和密碼(加密)。我想我的程序調用已保存的用戶名和密碼,傳遞到Facebook的身份驗證,然後允許應用程序發佈簡單的文字(也許是太鏈接)到用戶的牆。Android/Java - 將簡單文本發佈到Facebook牆上?

這麼說,我讀過關於Facebook的開發者頁面的一切(該API看起來完全陌生的我...我從來沒有做過任何類型的Web應用程序開發的前...只是桌面應用程序),並嘗試了Java庫here,但說實話,我不明白任何各種實現。有人聲稱使用起來很簡單,但顯然他們遠遠超出了我的想象。

我甚至試圖與Facebook官方Android SDK中搞亂,而是採用網頁視圖界面,​​我不能輕鬆認證的用戶名和密碼通過。另外,即使經過正確的認證,我仍然無法知道如何張貼到牆上。

請幫忙。 謝謝。

哦,順便說一句,我已經有一個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

我還沒有找到一種方法來執行此狀態更新「在後臺」,而不顯示對話框。我嘗試過直接使用圖形API和SDK爲Android提供的access_token,但它不起作用。沒有例外。 – 2010-07-28 03:12:58

+0

我仍然能夠正常工作,但是單點登錄選項可以在沒有用戶名/密碼的情況下登錄,如果他們已經在手機上使用了Facebook。它仍然要求授權。 – HaMMeReD 2010-12-19 04:48:00

+0

夥計非常感謝 你救了我的屁股。我有這個東西爲tommorows演示工作。 但仍然有一些東西,我需要在我的Facebook分享: - - 我可以張貼圖像以及牆上的文字? - 我可以將我的文章的所有內容鏈接到我的客戶網站嗎? 除了這個我很高興我想通了 – abhishek 2011-02-04 02:51:49

回答

45

我明白了,在湯姆的幫助下(謝謝)。關鍵是使用Facebook Android SDK創建一個帶有「stream.publish」API調用的對話框。以下是具體步驟:

  1. 下載的官方Facebook Android SDK中:http://github.com/facebook/facebook-android-sdk
  2. 導入項目文件到Eclipse中。
  3. 將項目導出爲* .jar文件。 (這可能會導致衝突)

    [更新]

    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。

  4. .jar文件在下面的簡單示例代碼添加到項目的構建路徑

  5. 看看:
 

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

哪個項目應該導出爲.jar? facebook文件夾中的文件夾(不是示例文件夾)? 我得到一個關於哪些資源應該被導出的許多選項的屏幕,我應該在那裏選擇什麼? Tnx – DixieFlatline 2010-06-26 16:19:56

+0

嘿,所有你需要的是源文件夾(「Facebook」)和資源,如果它可以讓你選擇。雖然有一件事。 Facebook最近改變了一些源,我有問題導入生成的jar到我的項目(有一個資源ID與Facebook圖標和我的項目中的文件衝突)。我更新瞭解決方案以包含修復程序。 抱歉沒有及時回覆。 – RyanM 2010-06-27 11:33:06

+0

至於函數onComplete中if(!values.containsKey(「post_id」))的註釋,我認爲你可以簡單地傳遞一個新的DialogDelegate作爲facebookClient.dialog的第四個參數來避免這個問題。無論如何,感謝一個非常有用的例子! – 9re 2010-09-28 12:51:57

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

退房線171通過Facebook.java 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) 
+0

感謝您的回覆。您的鏈接幫助我意識到接下來我需要做什麼(我發佈瞭解決方案)。唯一缺少的是能夠使用我存儲在應用程序中的數據自動填充登錄文本框。 – RyanM 2010-06-02 09:27:25

0

爲那些誰的問題,新的Facebook(); ,這個字符串就是你的App_id,並且只需在授權調用中刪除APP_ID即可。

不知道爲什麼會顯示錯誤消息,但我猜Facebook更新了Facebook SDK。

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(); 
      }