2014年7月2日 星期三

Android 開發 (五十) 使用facebook SDK po 塗鴉牆 以及tag好友

該如何使用facebook sdk post 自己的塗鴨牆呢?
我們可以利用Request.newPostRequest以下是範例

public class FacebookPostMyWall {
 public static class ObjectBuilder{
  private GraphObject statusUpdate ;
  public ObjectBuilder(){
   statusUpdate = GraphObject.Factory.create();
  }
  public ObjectBuilder setMessage(String msg){
   statusUpdate.setProperty("message", msg);
   return this;
  }
  public ObjectBuilder setLink(String link){
   statusUpdate.setProperty("link", link);
   return this;
  }
  public ObjectBuilder setPicture(String url){
   statusUpdate.setProperty("picture", url);
   return this;
  }
  public ObjectBuilder setName(String name){
   statusUpdate.setProperty("name", name);
   return this;
  }
  public ObjectBuilder setDescription(String des){
   statusUpdate.setProperty("description", des);
   return this;
  }
  public GraphObject build(){
   return statusUpdate;
  }
 }
 public void post(ObjectBuilder builder,Callback callback) {
  Request request = Request.newPostRequest(Session.getActiveSession(), "me/feed",
    builder.build(), callback);
  request.executeAsync();
 }
}
利用上面的方法,我可以直接將我們需要的資料直接填入我們的塗鴉牆,注意到這裡,facebook禁止我們在使用者輸入message的地方輸入字串,也就是message的地方不應該預填任何資料,這部分的資料必須由使用者填入,否則facebook的演算法會將我們的app ban掉。

上面的方法不需要跳出dialog就可以將訊息傳遞出去,是個非常方便的api

注意到上面的方法只能post在自己的塗鴉牆,如果我們希望post在好友的塗鴉牆,那該怎麼做呢? 上面的方法並無法達到我們希望的功能,所以必須利用別的方法來完成我們希望的功能,
可以利用下方的方式。


FeedDialogBuilder builder = new WebDialog.FeedDialogBuilder(getActivity());
builder.setName(name)
.setCaption(caption)
.setLink(link)    
.setTo(id)
.setDescription(Description)
.setPicture(FBshareHelper.createPicture());

builder.build().show();


這個方法其實是用來分享資料的預設是share到自己的塗鴉牆,但是當我們將setTo的Id帶成別人的塗鴉牆時,就會貼到朋友的塗鴉牆上,不過這個api有個非常大的壞處,當需要分享給多個好友時,就必須一個一個設,而且每次都會跳出dialog要使用者按下分享,應該說他本來的功能就是在分享文章的時候使用的api。

接著如果我們希望tag好友,我們可以使用下面的方法
首先我們必須先做setup
private UiLifecycleHelper uiHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    uiHelper = new UiLifecycleHelper(this, null);
    uiHelper.onCreate(savedInstanceState);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {
        @Override
        public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
            Log.e("Activity", String.format("Error: %s", error.toString()));
        }

        @Override
        public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
            Log.i("Activity", "Success!");
        }
    });
}
@Override
protected void onResume() {
    super.onResume();
    uiHelper.onResume();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}

@Override
public void onPause() {
    super.onPause();
    uiHelper.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}
在設定時,很重要的一點要特別注意,如果你是在Nest Fragment(TabHost + viewPager) 裡面使用這種api 要非常注意,onActivityResult可能不會被呼叫到,這可能會造成功能異常。

在設定完成後接著只需要呼叫下面的code就行了
FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(this)
        .setLink("https://developers.facebook.com/android")
        .build();
uiHelper.trackPendingDialogCall(shareDialog.present());
不過這樣並沒有tag到我們的好友所以必須加上一行  setFriends(List)
例如 setFriends(Arrays.asList("id1","id2");
這樣就可以將好友tag在我們的文章中

這個api的缺點也是在傳送的時候會跳出dialog,無法使用背景傳送。
facebook sdk有很多東西可以學習,不過也有很多坑啊,小弟真的花了很多時間在跳坑XDD



沒有留言:

張貼留言