網頁

2011年6月26日 星期日

Android學習_使用facebook sdk_Part2貼上塗鴉牆

完成上次的準備工作以後,就可以開始製作一個最簡單的互動"貼上塗鴉牆"。

一、建立一個新的專案,並且讓他擁有facebook功能:
Part1已經把facebook sdk所提供的專案匯入到Eclipse了,所以要讓我們的專案擁有與facebook溝通的能力,就必須將該專案以library的方式參考到新建專案當中,在專案名稱上點擊右鍵,選擇"Properties",選擇第二項"Android",並於library框中利用"Add"加進com_facebook_android該專案。


二、將識別碼加入專案中:
Prat1最後,取得了Application ID,而是否可以正確的與facebook進行互動都取決於這個識別碼,所以在專案的一開始必須先定義。

private Facebook facebook = new Facebook("你的Application ID");

若是Facebook出現錯誤,表示第一步驟並沒有完成,Eclipse不知道Facebook是什麼。

三、取得與Facebook的連結,並說明程式需要什麼權限
一般在玩facebook的小遊戲時,最一開始會出現"是否可以張貼資訊"、"是否可以讀取個人資料"等等的詢問頁面,而在手機上開發的程式也不例外,必須要先定義需要使用什麼樣的權限。

facebook.authorize(this, new String[] { "email","publish_stream", "read_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() {}
}
);

上面程式碼有兩個重點,第一個是authorize後面所接的各項字串,每一項都代表著一種權限,比如publish_stream為是否可以貼資訊到塗鴉牆上,read_stream為是否可以讀取塗鴉牆。(官方文件的詳細權限列表)

第二個重點是onComplete、onFacebookError、onError、onCancel可以讓我們增加facebook有問題時的各項回應。

四、利用複寫onActivityResult方法,取得facebook頁面的回傳資訊

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
facebook.authorizeCallback(requestCode, resultCode, data);
}


五、發出訊息到塗鴉牆
以上步驟都完成以後,如果直接執行專案,就可以看到facebook的一個權限詢問介面,接著出現帳號確認的頁面,然後轉回一個空的Activity。接下來依照自己的方式增加各項控制項到Activity當中,並且加入以下程式碼。

Bundle params = new Bundle();
params.putString("message", message);
facebook.request("/me/feed", params, "POST");

重點只有三句:
1. 建立一個Bundle
2. 放入要傳遞的資訊,並且指定key為"message"
3. 對facebook發出POST的request,Eclipsec會提醒必須加入適當的try catch。

*message表示我們要發布的為文字訊息。(官方詳細參數說明)
**可以注意第一個參數為"/me/feed",me對於facebook就是自己的意思,而feed代表著塗鴉牆。(官方詳細說明)

六、執行程式發送訊息後,連上facebook並說"Yes,有訊息了"。

*所以整個概念其實就是利用POST發出facebook已定義的各項參數,完成與其的各項溝通,講是這樣講想要發個建個相簿、發個照片、指定相簿名稱也是卡我一整個假日。XD


------------------------------------------------
2011年08月15日補充,貼上全部原始碼,效果:
1. 登入後就將"open"貼上塗鴉牆
2. 按鈕後將"I want to sent message"貼上塗鴉牆

package ola.OlaTeach_facebook_feed;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.FacebookError;
import com.facebook.android.Facebook.DialogListener;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class OlaTeach_facebook_feed extends Activity {

private Facebook facebook = new Facebook("你的Application ID");
private Button btn_send;
String message = "I want to sent message";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

findview();

//publish_stream
facebook.authorize(this, new String[] { "email","publish_stream", "read_stream","user_photos" },
new DialogListener() {
@Override
public void onComplete(Bundle values) {
postToWall("Open");
}

@Override
public void onFacebookError(FacebookError error) {}

@Override
public void onError(DialogError e) {}

@Override
public void onCancel() {}
}
);

//按鈕
btn_send.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
postToWall(message);
}
});
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
facebook.authorizeCallback(requestCode, resultCode, data);
}

public void findview()
{
btn_send = (Button) this.findViewById(R.id.btn_send);
}

public void postToWall(String messageString) {
Bundle params = new Bundle();
params.putString("message", messageString );
try {
facebook.request("/me/feed", params, "POST");
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

124 則留言:

  1. OLA大大,不知道你有沒有遇過invaid key的問題呢?

    回覆刪除
  2. 你是說貼到塗鴉牆結果返回invalid key'嗎?

    "/me/feed"這是官方提供的,應該是不會才對。

    但是如果你貼到相簿,那就必須要先找到對應的相簿編碼才可以。

    回覆刪除
  3. 不好意思,我照著您上面所說的步驟做了但還是無法將訊息貼上Facebook塗鴉牆,不知道您是否能夠幫我解決這個問題
    (我有寄信給您,標題為:Eclipse無法將訊息貼到Facebook塗鴉牆‏
    ,上面有我的程式碼) 就麻煩您了,謝謝!

    回覆刪除
  4. 初步看起來是Application ID與應用程式密鑰搞混了,

    Application ID應該是一組15碼的數字。

    回覆刪除
  5. 我已經改成Application ID了,執行時跳出FB對話方塊問我是否要接受此應用程式,我按接受後FB對話方塊就消失了,而我的塗鴉牆上面也沒有我想要顯示的文字,麻煩您幫我解決一下此問題,謝謝您!

    回覆刪除
  6. 還是不行....
    又要麻煩您了不好意思

    回覆刪除
  7. 補上第四點的程式碼[onActivityResult部分],

    若是要一進入就貼上塗鴉牆,就將facebook.request的部分寫在onComplete內。

    回覆刪除
  8. 不好意思最近都沒有開Email,所以到現在才回覆您
    後來我去試了之後已經可以將文字貼上塗鴉牆了,真的是非常的感謝您!
    不知道您是否有將圖片貼上塗鴉牆的方法,我們不太清楚如何將圖片貼上塗鴉牆(網路上有人說要先把圖片轉成binary再上傳到Facebook,也不太清楚要上傳的圖片是要依照檔名或是路徑)
    不知道您是否能夠幫我們解決這個問題,真的非常感謝您!!!

    回覆刪除
  9. 之前傳字串是用params.putString("message", messageString );這個方式收集字串內容,如果要傳照片就必須用params.putByteArray("picture", buffer);來收集圖片內容。

    而上面的buffer變數是一個byte[],所以你必須先將你要上傳的圖檔轉為byte[];至於要傳到哪一個相簿,就必須要先取得facebook上相簿的ID,當然你也可以自己建一個。

    回覆刪除
  10. 已經可以貼上文字和圖片了 真的很感謝您!!

    回覆刪除
  11. 想請問如果在模擬器上測試都可以使用
    但是輸出專案後卻無法使用FB功能
    (會有FB的框框出現,但是授權或發布訊息的功能都不會跑出來)
    是因為我沒有把facebook的key含進專案裡嗎?
    c19900202@yahoo.com.tw

    回覆刪除
  12. 要裝上手機的apk必須要使用註冊在facebook的keystore匯出才可以喔,不然他會不知道你的程式是誰。

    回覆刪除
  13. {要裝上手機的apk必須要使用註冊在facebook的keystore匯出才可以喔,不然他會不知道你的程式是誰。}

    好像是這樣XD...
    晚點測試看看
    另外想請教你
    有辦法在取得使用者資訊的時候
    只抓他的ID碼呢?
    facebook.request("me");會抓到使用者的全部資料
    我只需要他ID的部分(我現在是用切割的方式把ID碼切出來)
    有試過
    facebook.request("me/id")
    facebook.request("me/uid")
    等等寫法~但是語法好像不是這樣寫
    有專門抓ID的寫法嗎?
    c19900202@yahoo.com.tw

    回覆刪除
  14. 感謝你~!
    目前實機運作正常︿︿

    回覆刪除
  15. 請問~如果
    facebook.request("me")
    讀出來的中文變成utf-8編碼...該怎麼轉成中文呢QQ?

    回覆刪除
  16. 我有自己使用自己的keystore

    也有利用Eclipse中Export signed的方式安裝

    還是一直出現invalid_key的問題

    可是模擬機上測試卻是完全OK

    感謝大大

    回覆刪除
  17. 我最近比較沒有在測facebook sdk了,我猜應該不能單獨只取id吧,應該還是要拆解一下回來的json字串。

    回覆刪除
  18. 我沒有特別去注意取得的編碼,但是我記得好像沒有做過相關的編碼轉換。

    如果你確定是utf8編碼,那可能要查一下轉BIG5的語法。詳細的語法我就沒有記了。

    回覆刪除
  19. 如果模擬器執行OK,那應該facebook的key沒有錯誤;所以我猜錯誤還是在keystore的部分,你在申請Hash Key所用的keystore必須要與匯出專案時的相同。

    我猜可能你用模擬器測試完以後,雖然使用自己的keystore匯出專案,但是在facebook那邊沒有重新去以這個去註冊來取得對應的Application ID。

    可以搭配前篇的文章來看確認每一個步驟都是使用手機用的keystore。

    回覆刪除
  20. 請問一下我執行

    String request = facebook.request("me/feed", params, "POST");

    回傳
    message : an active access token must be used to query information about the current user

    type: OAthException

    請問這個是哪個地方漏掉沒有設設定的問題

    回覆刪除
  21. 看訊息像是沒有取得access token,可能你要確認一下程式裡面的facebook.authorize是否有正確的執行;並且onActivityResult的部份是否有正確完成facebook.authorizeCallback的部份。

    感覺起來是你的程式並沒有完成上述的步驟,導致沒有合法的權限讀取。(我猜的)

    回覆刪除
  22. 您好請問一下最近是不是有個BUG

    就是在Util.java中更改成
    if (params.get(key) instanceof byte[])

    我已經改過了~可以解除Bundle的問題

    可是卻一直出現


    Facebook-Example(7283): JSON Error in response

    這個問題不知道是如何@@

    可以幫助我嗎

    謝謝板大

    回覆刪除
  23. 我沒有碰過"JSON Error in response"這個錯誤訊息過耶,你確定這是由facebook那邊發出來的錯誤嗎?還是你自己寫在try catch的訊息?

    回覆刪除
  24. 是try catch裡面出現的訊息~

    所以都一直無法成功上傳照片@@

    不知道原因出在哪邊~

    我下載了完整的範例之後

    只有改過這個
    Util.java
    if (params.get(key) instanceof byte[])

    可是其他都沒有改過~

    卻都無法上傳圖片@@版大會有這個問題嗎?

    還是Facebook 那邊會有權限的問題嗎?

    回覆刪除
  25. 意思是JSON Error in response是你自己打的錯誤訊息囉?如果是這樣,那就沒辦法從你的描述"猜"錯誤在哪裡了。

    你可能要先清楚"真正"導致程式跳到catch的錯誤是什麼,再去找解決方法。

    回覆刪除
  26. 我是直接從範例做的

    版大直接從範例做是可以成功的嗎?

    您可以提供一個成功的範例 借我參考嗎?

    只需要有上傳圖片的功能就好~

    我的信箱是peter7953@hotmail.com

    (還是跟Java 的版本還是Android的版本有關嗎?)

    回覆刪除
  27. 想請問如果要取得好友名單,要怎麼取呢??

    Bundle params = new Bundle();
    params.putString("message", message);
    facebook.request("/me/feed", params, "POST");

    大概是在這段做修改吧??
    看不太懂官方的列表要怎麼使用,麻煩幫解答~

    回覆刪除
  28. 我是看文件跟參考網路文章寫的,不太清楚你說的範例內容。剛找了一下,我沒有留下當初測試照片上傳的專案,大多參雜了其他測試的內容。如果你已經可以正常送"文字"到塗鴉牆,那你可以參考這篇第9個留言改變傳遞的項目即可傳送照片;如果還不能送"文字"到塗鴉牆,那先完成文字的部分比較好。

    至於好友名單我沒有進行測試,當初僅取得相簿列表,但方式應該是類似的,比如說取得相簿的語法是facebook.request("me/albums"),置換"me/albums"的部分即可獲得其他相關的資訊,但前提是facebook.authorize的部分要先註冊相關的權限。

    回覆刪除
  29. 感謝ola大的回覆^^"
    照著你的講解一步步都完成了,只是好友名單我還是出不來欸><,把feed改成friend,如下:

    Bundle params = new Bundle();
    params.putString("message", message);
    facebook.request("/me/friend", params, "POST");

    這樣子應該是把取得的好友名單po到塗鴉牆,可是我都沒有值,我是想在手機內取得名單做其他應用。麻煩了~

    回覆刪除
  30. 板大您好:

    我參考了您的範例

    改成這樣

    Bitmap bmp = BitmapFactory.decodeFile("/sdcard/4.jpg");
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
    byte[] data = baos.toByteArray();
    Bundle params = new Bundle();
    params.putByteArray("picture", data);

    可是上傳的圖片卻沒有辦法顯示@@而是一個星星的圖案@@

    這是為何?

    回覆刪除
  31. 版大你好~
    請問這範例的FB帳號登入,有辦法把輸入的FB帳號另外存成字串嗎? 當作會員機制使用~感謝!

    回覆刪除
  32. 星星? ㄜ........你是說有圖出來,但是是星星?那應該是你上傳的圖就是星星吧。

    回覆刪除
  33. 這方式是利用facebook所提供的單一登入來進行,所以在登入時會先跳到fb的activity,完成驗證後才帶類似token的資訊回你的程式;所以你想要用程式的方式輸入帳號,應該要找一下他有沒有提供相關的api。

    但是通常手機都為一個人使用,這種方式會以手機內預設的fb帳號去進行登入,應該是沒有需要把'FB帳號另外存成字串'的需求。

    另外,如果你說的是在登入後取得帳號,那應該就是去查帳號id如何取得的程式碼,取得後再存成你需要的格式。所以可能的流程是登入進入你的activity後,再做一次Query取得帳號id,再儲存到你需要的地方。

    回覆刪除
  34. 不是耶上傳後

    會出現類似http://www.facebook.com/DoSaChild

    這種星星@@

    不知道是什麼問題?

    回覆刪除
  35. 謝謝板大的細心解答,想請問一下~

    params.putString("message", message);
    facebook.request("/me/feed", params, "POST");

    這是板大的範例,第一行的兩個message,請問各代表什麼意思? 如果不是po到塗鴉牆,而是要讀取資料還需要這行嗎?

    另外第二行如果要取好友名單是這樣嗎...facebook.request("/me/friends,params,"GET"");
    麻煩囉~謝謝

    回覆刪除
  36. 我將板大的範例修改了@@卻還是沒有辦法上傳圖片@@

    請問這樣哪裡有問題嗎@@

    我可以PO文字沒有問題!!!
    public void postToWall(String messageString) {
    Bitmap bmp = BitmapFactory.decodeFile("/sdcard/2.png");
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
    byte[] data = baos.toByteArray();
    Bundle params = new Bundle();
    params.putByteArray("message", data);

    try {

    facebook.request("me/feed", params, "POST");

    } catch (FileNotFoundException e1) {

    // TODO Auto-generated catch block

    e1.printStackTrace();

    } catch (MalformedURLException e1) {

    // TODO Auto-generated catch block

    e1.printStackTrace();

    } catch (IOException e1) {

    // TODO Auto-generated catch block

    e1.printStackTrace();

    }

    }

    回覆刪除
  37. 您好,我想請問一下他的Intent事件要在哪裡定義,因為我還有其他的Intent事件,所以利用onActivityResult將資訊帶回來時有衝突,所以我想要將這個回傳事件的requestCode定義成3,麻煩您教我一下(我有寄E-Mail給您,a9967920@hotmail.com)

    回覆刪除
  38. 板大你好~照著板大的步驟讓我收穫很多~
    目前碰到的問題是AVD可以,實機不行~
    我做的是取得好友ID及Name,以下:

    Bundle params = new Bundle();
    params.putString("fields", "name,id");

    try {
    JSONObject json = new JSONObject(facebook.request("me/Friends",params));
    JSONArray array = json.getJSONArray("data");

    if(array != null)
    {
    for(int i=0;i<array.length();i++)
    {
    String id = array.getJSONObject(i).getString("id");
    String name = array.getJSONObject(i).getString("name");

    TextView txt_id= (TextView) findViewById(R.id.txt_id);
    TextView txt_name= (TextView) findViewById(R.id.txt_name);

    txt_id.setText(id);
    txt_name.setText(name);
    }
    }

    } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    好像是JSONArray array = json.getJSONArray("data");
    取不到值,請問這該怎辦??
    感謝板大~~

    回覆刪除
  39. 取得好友用facebook.request("me/Friends"),不是facebook.request("me/Friends",params)。

    回覆刪除
  40. for a9967920

    我猜測應該是不行將facebook所回傳的requestCode定義成你要的數值;但其實你不用去變更,只需要看他傳送多少,利用那個值去進行判斷就可以了。

    Log.v("ola_log", String.valueOf(requestCode));
    可以看到requestCode是"32665"。

    回覆刪除
  41. 我寫了一篇上傳圖片的文章,如果你還有圖片上傳的問題可以參考那一篇。http://wangshifuola.blogspot.com/2011/09/androidfacebook-sdkpart3.html

    回覆刪除
  42. 目前在模擬器上測試可以,但是手機卻無法使用(會有FB的框框出現,但是授權或取得好友名單的功能都抓不到值),查了一下前例,好像是說"要裝上手機的apk必須要使用註冊在facebook的keystore匯出才可以喔,不然他會不知道你的程式是誰。 "

    請問要使用註冊的facebook keystore是指,private Facebook facebook = new Facebook("你的Application ID");這邊要改成android key hash(ex:bOUMQ9WhRJCwnGHSKOU=),再匯出apk安裝嗎???? 感謝板大~

    回覆刪除
  43. 當你去取得facebook的Application ID時,你必須輸入一個用keystore轉換的Hash Key來取得;所以當你要安裝到實機時,你必須用當初的keystore來匯出你的專案為apk檔。

    匯出方法:該篇第五項(http://wangshifuola.blogspot.com/2011/06/androidgoogle-map-api-key.html)

    安裝apk的方法:http://wangshifuola.blogspot.com/2011/06/androidadbapk.html

    回覆刪除
  44. 實機終於可以運作了~!!(雖然重複同樣動作幾次..)
    感謝板大ㄛ^^Y

    回覆刪除
  45. 你好
    想請教一下
    我之前做facebook發佈訊息都沒有問題
    但是今天卻出現
    "發佈時出現錯誤
    你提供的訊息裡發生錯誤無法顯示你的活動記錄。"
    這是什麼原因呢?

    以下是ddms的訊息
    09-28 16:25:43.170: DEBUG/Facebook-WebView(597): Redirect URL: fbconnect://success#_=_
    09-28 16:25:47.911: DEBUG/Facebook-WebView(597): Webview loading URL: https://m.facebook.com/dialog/oauth?display=touch&client_id=144632882296371&scope=email%2Cread_stream%2Cpublish_stream%2Ccreate_event&type=user_agent&redirect_uri=fbconnect%3A%2F%2Fsuccess&access_token=AAACDiveSdjMBAFTmQsLHBkdDYZBXM9EsBxM4ZCdLQSnaRQa4n98xAZAgGcNqjcGU3WuDLqOGotfsZAfar7tvPqT7EsGZB5ZBXR3X8EL3lRVblM12anDzx4
    09-28 16:25:48.011: DEBUG/Facebook-WebView(597): Webview loading URL: https://m.facebook.com/dialog/feed?message=%3Cmessage_you_want_to_send%3E&app_id=144632882296371&display=touch&redirect_uri=fbconnect%3A%2F%2Fsuccess&access_token=AAACDiveSdjMBAFTmQsLHBkdDYZBXM9EsBxM4ZCdLQSnaRQa4n98xAZAgGcNqjcGU3WuDLqOGotfsZAfar7tvPqT7EsGZB5ZBXR3X8EL3lRVblM12anDzx4
    09-28 16:25:48.311: DEBUG/Facebook-WebView(597): Webview loading URL: https://www.facebook.com/dialog/permissions.request?app_id=144632882296371&display=touch&next=fbconnect%3A%2F%2Fsuccess&type=user_agent&fbconnect=1&perms=email%2Cread_stream%2Cpublish_stream%2Ccreate_event
    09-28 16:25:48.340: DEBUG/Facebook-WebView(597): Redirect URL: https://www.facebook.com/dialog/permissions.request?app_id=144632882296371&display=touch&next=fbconnect%3A%2F%2Fsuccess&type=user_agent&fbconnect=1&perms=email%2Cread_stream%2Cpublish_stream%2Ccreate_event
    09-28 16:25:49.671: DEBUG/dalvikvm(597): GC freed 6966 objects / 490224 bytes in 195ms
    09-28 16:25:52.421: DEBUG/Facebook-WebView(597): Redirect URL: fbconnect://success#access_token=AAACDiveSdjMBAFTmQsLHBkdDYZBXM9EsBxM4ZCdLQSnaRQa4n98xAZAgGcNqjcGU3WuDLqOGotfsZAfar7tvPqT7EsGZB5ZBXR3X8EL3lRVblM12anDzx4&expires_in=5650&code=AQC-BtB_-JN30zLxfSDk_zBvVNDvIfTX-JojtRuNlZYpLz8Y_nL24BIiv1jkGkcsM5OY0P21KcwxyhPe0k68BYSUitoguHeltuS1e8N6fDvAPYLmzdalIUk4qIbPr5GYe_KS4ujKOM2r0Pzz9TSmL6KneWUnmwAvUsKIupUkeqXUh0gY27uNaHPJgB6tAEqxHegBVZxrUeYov6mttRiJqloH
    09-28 16:25:52.441: DEBUG/Facebook-authorize(597): Login Success! access_token=AAACDiveSdjMBAFTmQsLHBkdDYZBXM9EsBxM4ZCdLQSnaRQa4n98xAZAgGcNqjcGU3WuDLqOGotfsZAfar7tvPqT7EsGZB5ZBXR3X8EL3lRVblM12anDzx4 expires=1317232802450
    09-28 16:25:53.201: WARN/InputManagerService(52): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43d9cad0

    回覆刪除
  46. 依照『發佈時出現錯誤,你提供的訊息裡發生錯誤無法顯示你的活動記錄。』這個訊息,看起來是facebook所發出來的錯誤訊息,所以應該是facebook提供的service有問題所致,你可能先到facebook的測試頁進行發布測試。從你所提供的資訊,我猜不出錯誤原因。

    回覆刪除
  47. 作者已經移除這則留言。

    回覆刪除
  48. 感謝你...今天測試的時候又可以了...
    可能昨天FB的API在做更新= =

    回覆刪除
  49. 我記得當初在測試的時候,好像有用過一個網頁,可以將request打上去,確認語法正確與否,但是剛剛找好久找不到。 XD

    ok~~就好 ^.<

    回覆刪除
  50. 我可以請問一下 為什麼我都照著打
    結果出現application requires permission to access the Internet.的問題
    但是我可以用模擬上網

    回覆刪除
  51. 你的AndroidManifest.xml必須加入網路連線的權限,才能使你製作的程式擁有連網路的能力。

    <uses-permission android:name="android.permission.INTERNET"/>

    回覆刪除
  52. 作者已經移除這則留言。

    回覆刪除
  53. 您好,我照了您的步驟一步一步做了,但是將APK放到實機上後無法將文字及圖片推上Facebook 一直重複出現允許不允許應用程式的畫面‏
    我有寄信給您(a9967920@hotmail.com)
    麻煩您幫我解答一下,真的是非常的感謝您!!

    回覆刪除
  54. 如果模擬器OK,但安裝到實機上時發生錯誤,猜測應該是匯出專案用的keystore與拿去申請facebook Application ID的並不相同,導致無法正確登入。

    可以搭配前篇的文章來看確認每一個步驟都是使用手機用的keystore。(http://wangshifuola.blogspot.com/2011/06/androidfacebook-sdkpart1.html)

    回覆刪除
  55. 板大你好~之前9月份的時候參考你的範例能成功取得朋友資訊,放到實機執行也OK。
    可是就在昨天,實機執行的時候facebook詢問存取權限的時候,樣板跟原本的不一樣(是facebook api有做更新嗎??),今天執行卻失敗,錯誤訊息如下:
    API Error Code:100
    API Error Description: Invalid parameter
    Error Message: Requires valid redirect URI.
    我有重新申請一組app id,還是不行說,麻煩解答~
    謝謝^^

    回覆刪除
  56. 我試著重新建立一個新的Facebook應用程式(也用了keystore),結果第一次實機執行會詢問權限,第二次以後就又跑出上面的錯誤訊息了...麻煩解答~
    謝謝!!

    回覆刪除
  57. "Requires valid redirect URI"這個錯誤訊息我沒有碰過,但看起來像是你對facebook進行request的時候指向了錯誤的網址。

    所以你有在程式中指向特定網址嗎?
    或者你可以先測試手機原有的facebook程式是否可正常執行,
    再者安裝到另一台手機上,確認不是手機的問題。

    這樣的訊息實在想不出錯誤的原因,真抱歉。

    回覆刪除
  58. 你好
    我可以請問一下,如果我成功po文後,要跳出訊息
    要加在那裡嗎?
    我有試過加在try內或加上finally
    但最後頁面都怪怪的 無法順利po文。

    回覆刪除
  59. 貼上塗鴉牆以後,要跳出訊息,應該是加在facebook.request之後,但理論上我們應該會用一個Thread去處理貼上塗鴉牆的這件事情,所以你可以加在Thread所對應的Handler內。

    回覆刪除
  60. 想要請問我想要抓sqlite裡面的文字資料PO到Facebook
    不知道要如何做???

    回覆刪除
  61. 只要將SQLite要貼上塗鴉牆的訊息讀出來,再置換本篇messageString字串就可以了。 @.@

    回覆刪除
  62. 請想問 ~ 最近是不是因為換新版的Facebook...
    之前我測試可以發部到塗鴉牆~今天全部都不行了><

    回覆刪除
  63. 我剛剛測試(2011/12/24 10:12),仍舊可以正常貼上塗鴉牆。

    回覆刪除
  64. 版大你好~~~

    目前在模擬器上測試可以,但是放到手機(已用keystore方式),卻無法使用(問題:會出現FB的載入畫面,一直轉轉轉...進不去程式)

    可以麻煩版大將程式放到實機上測試看看嗎??

    回覆刪除
  65. 我都是用實機測的。

    我猜你匯出專案的keystore應該與註冊facebook的不同,所以才導致這個問題。

    回覆刪除
  66. 版大你好~~

    我是利用fb login api結合我的android app,去年11月份都還可以在手機上跑,大概1月初再開啟就一直出現問題。我現在在模擬器上跑可以,export apk放到手機上面安裝,會卡在FB視窗"載入中.."的畫面。我已經照版大的方式重複做好幾次都是一樣的結果,facebook應用程式後台需要做什麼設定嗎? 還是可不可以麻煩版大幫我產生一個keystore和解出keyhash 再寄到我信箱 (louis10279@gmail.com )呢? 麻煩版大>O<""

    回覆刪除
  67. 作者已經移除這則留言。

    回覆刪除
  68. 請問ola大知道怎麼再設計一個按鈕是登出的功能嗎?
    登出的指令要去哪裡查詢呢?謝謝

    回覆刪除
  69. 登出的api,"印象中"官方文件裡面好像有提到,但我沒有實際操作過,所以沒辦法回答你。

    可是登出的這件事情是有點怪異的,因為目前登入的方法是使用facebook提供的單一簽入方式,若是登出表示手機內建的fb應該也是登出了。

    回覆刪除
  70. 作者已經移除這則留言。

    回覆刪除
  71. 請問我有給read_stream讀取的權限

    那我要如何把塗鴉牆的訊息讀取出來?

    回覆刪除
  72. 可以請大大解答一下
    關於
    btn_send =(Button)this.findViewById(R.id.btn_send);
    這個東西在R.java內找不到id
    意思是要新建一個id

    所以在main.xml內是要以怎樣的形態來表示??
    不太明白在此做這個的用意???

    回覆刪除
  73. 每一個有介面的程式,都會對應至少一個xml檔案,xml檔案負責編排使用者介面的呈現。

    在編譯的時候,編譯器會將你所建立的xml檔案含有id屬性的tag,編排至R.java檔案內,程式碼再對R.java進行對應。

    如果你xml這塊不熟,可以直接用eclipse的拖拉介面來建立,或是找本基礎的書把他的程式碼貼上。

    最後,一個按鈕在xml的表示方式是:
    <Button android:id="@+id/btn_search_Back" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    ></Button>

    回覆刪除
  74. 謝謝大大
    其實大概在四點的時候
    我才想起來 然後拉了按鈕
    程式碼都有照大大說的一個一個打進去
    可是他說應用程式異常中止
    Debug是表示: Sourcr not found
    所以想問說模擬機有需要再載入apk嘛?
    還事是因為其他什麼原因呢?

    回覆刪除
  75. 如果模擬器可以跑但實機不行,應該就是代表你所使用的keystore、Key Hash到最後的Application ID不對應,照你說的不管換哪一個hash key都是模擬器可以跑,那你可能一直都使用到debug的keystore。

    最後安裝到實機,一定要用匯出的方式,以註冊fb用的keystore匯出apk,再以安裝apk的方式來裝入實機。

    回覆刪除
  76. 你好,請問模擬器可以跑但手機跑 點完發送會Crash 會是什麼原因呢?

    回覆刪除
  77. 這樣很難猜測原因,至少要先log之類的方式判斷出是哪一句。

    回覆刪除
  78. 您好:

    目前我用API-2.3.3在AVD(2.3.3)上跑沒問題,可以張貼在WALL上;可是我用自己匯出的keystore,生成hash key後,與FB APP做認證儲存,有再用自己的keystore來簽署成為.apk,安裝在4.0.4的實機上,登入完帳號後卻無法將訊息張貼在WALL上...。

    後來不死心,換用AVD(4.0.3)的來測試,發現在4.x的環境上跑就與在4.x的實機一樣都會發生錯誤,無法順利張貼;不過如果又換回2.x的環境(AVD)就可以順利張貼。

    不知您是否有遇到類似情形呢?
    謝謝您!

    回覆刪除
  79. 我剛剛用api-2.3.3然後裝在4.0.3的實機上,可以正常張貼訊息到塗鴉牆,我沒有碰過這個問題。

    回覆刪除
  80. 板大 有個問題想請教一下

    FB登入後把access token放在SharedPreferences
    但要寫登出的時候是否可以直接清掉sharedPreferences就好?
    不過我寫完他跑都無法清掉耶?
    然後上FB的API文件看他有一個method是logout的
    String logout(Context context) throws MalformedURLException, IOException :

    想請問他所需要的變數context是指?
    是要把sharedpreferences轉乘context嗎?

    謝謝~~

    回覆刪除
  81. 我沒有測試過登出,但以文件來看,
    facebook.logout(你的Activity);(或是你可以寫facebook.logout(this);)
    ↑這句應該就可以做到登出。

    回覆刪除
  82. 想請問一下,發文我的手機已經可以了
    但是要怎麼取得FB上的個人資料下來 使用呢?

    回覆刪除
  83. 如果已經可以發佈到塗鴉牆,取個人資訊也是類似的方式,實際的語法查官方的文件最詳盡。每一種資訊都有不同的參數。

    回覆刪除
  84. ola版主您好,我想要先在layout裡拉一個按鈕,按下此按鈕後才會開始FB登入介面,而不是一進入程式點就開始FB介面,但是FB的facebook.authorize這個方法寫在OnClick裡就會變成錯誤訊息,請問該如何解決呢?

    回覆刪除
  85. 我沒有把該語法寫在按鈕中,不知道會有這個情況;但是最單純的想法就是,activity1上有按鈕跟相關說明,activity2就是fb相關程式,按activity1後進入activity2。

    如此也是相同的流程,又不需要更改程式碼。

    回覆刪除
  86. 我照著版主的code
    打開程式之後會自動LOGIN FB,接著詢問權限
    按下接受之後,也點惹button
    但是我到我自己FB的塗鴉牆上 
    沒有看到"open"跟"I want to sent message"的訊息耶...

    回覆刪除
  87. 這樣很難判斷是哪裡出錯,但是我猜測應該是在keystore的部分,你在申請Hash Key所用的keystore必須要與匯出專案時的相同,並且在程式中用對應的Application ID。

    回覆刪除
  88. 終於看到 OPEN 跟I want to sent message
    原來是我忘記在AndroidManifest.xml 加入INTERNET權限

    謝謝ola大大^^

    回覆刪除
  89. 板大你好,如果我現在只是要在登入之後並取得登入者資訊(名稱)來供app使用
    那我應該看哪個部份呢?

    回覆刪除
  90. 版大你好,我想起問一下 如果我只是要在登入facebook之後,取得登入者資訊(名稱)供app後續使用 這樣我該看哪個部份呢?? 謝謝!

    回覆刪除
  91. 版大你好:
    我模擬器測試OK,但用到實機
    會顯示500 internal server error
    為何會這樣??

    回覆刪除
  92. 500 internal server error,是伺服器端的錯誤。 @.@

    回覆刪除
  93. 伺服器錯誤??是手機部分還是facebook的伺服器呢?

    回覆刪除
  94. 你跟他送了某個要求,他傳回伺服器錯誤,是一個很難看出問題的錯誤訊息,我想不出有什麼建議可以說。

    回覆刪除
  95. 請問使用Facebook SDK範例stream讀取的訊息(posts)不多,而我的APP卻讀取很多的訊息,如更改設定或Icon?[authorize和AsyncFacebookRunner(Fb).request是一樣的]

    回覆刪除
  96. 不好意思,我不是很懂問題的描述。

    回覆刪除
  97. Facebook SDK範例stream使用JavaScript去讀取訊息,Facebook不會將更改設定的訊息傳給stream,如"OOO正在使用中文(台灣) 版的 Facebook"或"OOO正在使用 English (US) 版的 Facebook".如何加參數,讓AsyncFacebookRunner(Fb).request()不會將更改設定的訊息傳回來?
    謝謝

    回覆刪除
  98. 你好,可以發一份demo給我學習學習嗎,剛開始學習,沒有一點頭緒

    回覆刪除
  99. 目前沒有準備類似的專案可以直接分享,抱歉。

    回覆刪除
  100. 版大您好:

    我照著您的程式碼
    也更改過APP ID 的部分
    但是我出現的結果會是
    "the application login has stopped unexpectedly"
    想請問 是否是執行序或是其他的問題 謝謝

    回覆刪除
  101. 看詳細的錯誤訊息才抓的到原因,要看log的部分。

    回覆刪除
  102. 版大,請教下如何獲取當前使用APP的好有,不知道該如何實現

    回覆刪除
  103. 版大,請教下如何獲取當前使用APP的好友,不知道該如何實現

    回覆刪除
  104. 請問版大,我有 import FB 的 SDK 進來,可是在 import com.facebook.*; 時顯示錯誤。 無法 import,所有 com.facebook 的 class 都無法使用,請問是哪裡設定錯了嗎?

    回覆刪除
  105. 如果import那句出現問題,應該是專案沒有參考成功。

    回覆刪除
  106. 版大您好!
    我想跟您請教一下
    程式執行後,
    當輸入完帳號密碼之後,
    會出現這個問題
    "登入時發生問題 請稍後再試"
    請問您有遇過這種問題嗎?

    回覆刪除
  107. 我當時沒有發生過這個問題,這看起來像是fb有收到你的請求,但是登入的api沒有正確回應,但也可能就是錯誤了,只是他返回一個沒辦法判斷的原因。

    不好意思,沒辦法給甚麼有用的意見。 Q.Q

    回覆刪除
  108. 當我丟進去參考的時候,它顯示是正常的
    但是從開那邊之後,他就顯示錯誤了說 ...
    所以就變成import facebook那邊就有問題了 ... 請問版大是哪邊出了問題呢 ??

    回覆刪除
  109. 您好:
    我後來寫了關於標記地點的程式,
    權限部分程式碼為:
    private static final List PERMISSIONS = new ArrayList() {
    {
    add("publish_action");
    }
    };
    標記完好友以及地點後
    會出現連線錯誤如下:http://ppt.cc/c3OF
    (#200)Updated the extended permissions to "publish_actions"

    但是我將全限部分改成
    private static final List PERMISSIONS = new ArrayList() {
    {
    add("publish_stream");
    }
    };
    發生錯誤的時候,會沒有出現錯誤代碼http://ppt.cc/nKTM

    想請問您是否有碰過類似的問題,謝謝

    回覆刪除
  110. 程式碼照貼 還是有錯誤...
    AndroidManifest 的網路權限也加了
    APPID 也有貼上去了
    請問還有什麼地方要改嗎 ...?

    沒有發現那個什麼 OPEN等等的訊息上去捏

    回覆刪除
  111. 請問一下 我貼文到塗鴉板 利用上面那三行
    Bundle params = new Bundle();

    params.putString("message", message);

    facebook.request("/me/feed", params, "POST");

    編譯時沒有出問題 但是在執行時會出錯直接跳出
    然後找到問題是指向這行有問題
    facebook.request("/me/feed", params, "POST");

    然後也有跳到Facebook.java裡這行
    return requestImpl(graphPath, params, httpMethod);

    請問一下這是哪裡需要修改嗎?

    回覆刪除
  112. 您好 請問能提供舊版的fb sdk嗎? 謝謝~
    新版的好像寫法都改變了
    p810706j@yahoo.com.tw

    回覆刪除
  113. 我自己也沒有特別去保存,建議都使用新的版本會比較好。

    回覆刪除
  114. 請問一下這個專案裡面只有一個MainActivity與他的layout而已嗎?
    因為我btn_send應該不是在main的xml裡面
    但是我不知道該新增到哪裡
    謝謝

    回覆刪除
  115. 您好,我想請問您
    {要裝上手機的apk必須要使用註冊在facebook的keystore匯出才可以喔,不然他會不知道你的程式是誰。}
    的意思是??

    是指我用eclipse匯出apk時,的android.keystore檔案要重FB抓嗎?

    謝謝您~~~~

    回覆刪除
  116. 我想問我燈第一次的時候可以 但登入第二次就會出現錯誤訊息

    Invalid android_key parameter. The key tucy2GitT8XKTy7LKi30kswwfee does not match any allowed key. 到底是為什麼 登第一次時候他會問我要取得我的部分權限 第二次就出錯 專案重開也是

    回覆刪除
  117. "要裝上手機的apk必須要使用註冊在facebook的keystore匯出才可以喔,不然他會不知道你的程式是誰。"的意思是要驅動fb的api你的程式必須要先跟fb註冊(註冊方法請見http://wangshifuola.blogspot.tw/2011/06/androidfacebook-sdkpart1.html),註冊時必須給fb一個keystore的Hash Key,所以你匯出開發的APP時,必須使用當初註冊在fb的keystore,這樣api才會正常運作。

    回覆刪除
  118. 理論上這個錯應該是key沒有對應到,但是應該就連第一次都無法登入才對,我無法確認是怎樣的錯誤。 :'(

    回覆刪除
  119. 作者已經移除這則留言。

    回覆刪除
  120. 作者已經移除這則留言。

    回覆刪除
  121. 請問一下,如果在Android Tools→Export Signed Application Package按下完成後出現Conversion to Dalvik format failed with error 1,是甚麼問題呢...我試過:
    1.到Project->Clean->Clean all projects
    2.到Project->Proties->Java Build Path->Order and Export勾選所有lib
    3.到ProGuard官網下載4.10,lib跟bin都覆蓋了。
    無法會出apk....

    回覆刪除