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

125 則留言:

bapoo 提到...

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

ola的家 提到...

你是說貼到塗鴉牆結果返回invalid key'嗎?

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

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

a9967920 提到...

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

ola的家 提到...

初步看起來是Application ID與應用程式密鑰搞混了,

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

a9967920 提到...

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

a9967920 提到...

還是不行....
又要麻煩您了不好意思

ola的家 提到...

補上第四點的程式碼[onActivityResult部分],

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

a9967920 提到...

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

ola的家 提到...

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

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

a9967920 提到...

已經可以貼上文字和圖片了 真的很感謝您!!

匿名 提到...

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

ola的家 提到...

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

匿名 提到...

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

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

匿名 提到...

感謝你~!
目前實機運作正常︿︿

匿名 提到...

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

匿名 提到...

我有自己使用自己的keystore

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

還是一直出現invalid_key的問題

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

感謝大大

ola的家 提到...

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

ola的家 提到...

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

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

ola的家 提到...

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

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

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

Lawrence 提到...

請問一下我執行

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

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

ola的家 提到...

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

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

匿名 提到...

您好請問一下最近是不是有個BUG

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

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

可是卻一直出現


Facebook-Example(7283): JSON Error in response

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

可以幫助我嗎

謝謝板大

ola的家 提到...

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

匿名 提到...

是try catch裡面出現的訊息~

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

不知道原因出在哪邊~

我下載了完整的範例之後

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

可是其他都沒有改過~

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

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

ola的家 提到...

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

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

匿名 提到...

我是直接從範例做的

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

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

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

我的信箱是peter7953@hotmail.com

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

匿名 提到...

想請問如果要取得好友名單,要怎麼取呢??

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

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

ola的家 提到...

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

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

匿名 提到...

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

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

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

匿名 提到...

板大您好:

我參考了您的範例

改成這樣

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

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

這是為何?

匿名 提到...

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

ola的家 提到...

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

ola的家 提到...

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

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

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

匿名 提到...

不是耶上傳後

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

這種星星@@

不知道是什麼問題?

匿名 提到...

謝謝板大的細心解答,想請問一下~

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

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

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

匿名 提到...

我將板大的範例修改了@@卻還是沒有辦法上傳圖片@@

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

我可以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();

}

}

a9967920 提到...

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

匿名 提到...

板大你好~照著板大的步驟讓我收穫很多~
目前碰到的問題是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");
取不到值,請問這該怎辦??
感謝板大~~

ola的家 提到...

取得好友用facebook.request("me/Friends"),不是facebook.request("me/Friends",params)。

ola的家 提到...

for a9967920

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

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

ola的家 提到...

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

louis 提到...

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

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

ola的家 提到...

當你去取得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

louis 提到...

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

c19900202 提到...

你好
想請教一下
我之前做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

ola的家 提到...

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

c19900202 提到...
作者已經移除這則留言。
c19900202 提到...

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

ola的家 提到...

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

ok~~就好 ^.<

烏托邦 提到...

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

ola的家 提到...

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

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

烏托邦 提到...
作者已經移除這則留言。
匿名 提到...

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

ola的家 提到...

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

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

Louis 提到...

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

Louis 提到...

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

ola的家 提到...

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

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

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

烏托邦 提到...

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

ola的家 提到...

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

匿名 提到...

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

ola的家 提到...

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

匿名 提到...

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

ola的家 提到...

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

匿名 提到...

版大你好~~~

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

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

ola的家 提到...

我都是用實機測的。

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

Louis 提到...

版大你好~~

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

ola的家 提到...

已回信,請測試。

蹦蹦 提到...
作者已經移除這則留言。
匿名 提到...

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

ola的家 提到...

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

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

蔡臻平 提到...
作者已經移除這則留言。
匿名 提到...

請問我有給read_stream讀取的權限

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

Raycao 提到...

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

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

ola的家 提到...

每一個有介面的程式,都會對應至少一個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>

匿名 提到...

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

mimo 提到...

版大你好~

我現在一樣在模擬器上跑可以,匯出apk在手機上面執行,讀取畫面讀完後就消失了。
我已經照版大的方式重複做好幾次都是一樣的結果,另外我在fb上的hash key是用自己的keystore去產生的,但是不管換哪個hash key結果都是在模擬器上可跑,實機就不行,版大是否有什麼建議??

另外可不可以麻煩版大幫我產生一個keystore和解出keyhash 再寄到我信箱讓我測試看是否產製的問題 (tsaomimo@gmail.com )呢? 麻煩版大了 ^^

ola的家 提到...

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

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

匿名 提到...

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

ola的家 提到...

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

Unknown 提到...

您好:

目前我用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)就可以順利張貼。

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

ola的家 提到...

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

jenny6932003 提到...

板大 有個問題想請教一下

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

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

謝謝~~

ola的家 提到...

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

q90016200 提到...

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

ola的家 提到...

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

匿名 提到...

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

ola的家 提到...

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

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

匿名 提到...

感謝ola版主^^

黃郁瑋 提到...

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

ola的家 提到...

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

黃郁瑋 提到...

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

謝謝ola大大^^

ola的家 提到...

恭喜你! :D

匿名 提到...

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

匿名 提到...

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

匿名 提到...

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

ola的家 提到...

500 internal server error,是伺服器端的錯誤。 @.@

匿名 提到...

伺服器錯誤??是手機部分還是facebook的伺服器呢?

ola的家 提到...

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

匿名 提到...

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

ola的家 提到...

不好意思,我不是很懂問題的描述。

匿名 提到...

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

Fenh Zhong 提到...

你好,可以發一份demo給我學習學習嗎,剛開始學習,沒有一點頭緒

ola的家 提到...

目前沒有準備類似的專案可以直接分享,抱歉。

陳萱翰 提到...

版大您好:

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

ola的家 提到...

看詳細的錯誤訊息才抓的到原因,要看log的部分。

Fenh Zhong 提到...

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

Fenh Zhong 提到...

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

mong 提到...

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

ola的家 提到...

如果import那句出現問題,應該是專案沒有參考成功。

薛乃榮 提到...

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

ola的家 提到...

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

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

池宗輝 提到...

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

陳萱翰 提到...

您好:
我後來寫了關於標記地點的程式,
權限部分程式碼為:
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

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

池宗輝 提到...

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

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

匿名 提到...

請問一下 我貼文到塗鴉板 利用上面那三行
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);

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

匿名 提到...

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

ola的家 提到...

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

TsaiG9 提到...

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

Reeny Chiang 提到...

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

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

謝謝您~~~~

匿名 提到...

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

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

ola的家 提到...

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

ola的家 提到...

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

徐偉哲 提到...
作者已經移除這則留言。
徐偉哲 提到...
作者已經移除這則留言。
徐偉哲 提到...

請問一下,如果在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....

張貼留言