2011年11月5日 星期六

facebook sdk+phonegap+android

之前的文章有討論到如何在phonegap上plugin的方法
這一次我們來試著把facebook sdk 加進來~
Target:post to facebook wall on phonegap
step1. 
我們需要facebook sdk ,請到這裡下載 https://github.com/facebook/facebook-android-sdk
裡面會有一些目錄,有一個facebook的folder是主要的sdk(example是範例)




step2.
裝載facebook sdk的方法稍微有點不同,你得先把facebook這個folder(其實他就是一個project),建立成專案,用匯入專案的方式就好啦~ : ),匯入完專案就大功告成了!(我裝過2次他都會有找不到R 這個ERROR,放心 常遇到 CLEAN一下這個專案就好了~
step3.
把我們正在做的專案,就拿我們之前做ADMOB+PHONEGAP的專案來試好了~
點擊專案右鍵properties, 接著在左方列選擇android,會在右邊下方看見library,點選add...接著選擇剛剛建立好的facebook sdk的專案 就ok了~其實只是引用facebook那個project的資源的作法而已~(我相信也可以把facebook sdk包成jar,再用匯入lib的方式匯入~只是我沒試過)
step4.
再來講點facebook app for android的一些...有的沒的...
在facebook的app上 若是使用了facebook的canvas,不論是web site、mobile site,都會視為有一個實體的app存在,而若直接在app上只填上android的hash key而已,那就沒有實體app的存在,差別就在於 每個app都會有一個粉絲頁,android的app進去之後 是看不到 進入應用程式 這個button的(因為本來就沒有)。
再來講講那個hashkey...若你使用官網的範例,那你需要一組hashkey,因為會經過認證,而這個hash key的產生是使用java的keytool產生的。大家都知道 android要export出來需要一個storekey,就是拿這組storekey再轉成hash key,然後填入facebook的app中。而且你的apk也需要使用同一組storekeyexport出來,才能正常的登入facebook。
以下是gen出storekey的command,後面的10000代表有效時間,market需要至少50年的有效時間,所以是多少20000?
keytool -genkey -v -keystore androiddebug.keystore -alias androiddebug -keyalg RSA -keysize 2048 -validity 10000
接下來是haskkey的產生方法 有2個版本 都可以用,不過你要先有openssl,去http://git-scm.com 下載git裡面就會有所有你需要的相關檔案

ver.1
keytool -export -alias androiddebugkey -keystore androiddebug.keystore | openssl sha1 -binary | openssl enc -a -e
ver.2
keytool -exportcert -alias 

androiddebugkey 


-keystore 

androiddebugkey 
.keystore | openssl sha1 -binary | openssl base64

在這個教學裡 不用用到hashkey 因為我只是單純的發佈到塗鴨牆~(當然你要用官方的example就需要啦)

step5.
....啊 關於建立plugin...是一件很簡單的事 相信大家看完之前的文章就會了 我就不再描述...那我就直接貼facebook plugin的主要code了,其它就看之前的plugin教學吧(茶


package com.phonegapPlugin;
import android.widget.Toast;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.FacebookError;
import com.facebook.android.Facebook.DialogListener;
import android.os.Bundle;
import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import com.phonegap.api.PluginResult.Status;
import org.json.JSONArray;
public class FacebookPlugin extends Plugin {
 //facebook
 public static final String APP_ID = "Ur facebook app id";
 private Facebook facebook = new Facebook(APP_ID);
 private static final String POST_WALL_ACTION = "post_wall";
 @Override
 public PluginResult execute(String pluginAction, JSONArray data, String callbackId) {

  if (pluginAction.equals(POST_WALL_ACTION)) {

   this.ctx.runOnUiThread(new Runnable() {
    @Override
    public void run() {
     //mAsyncRunner.request("me", new SampleRequestListener());
     Bundle parameters = new Bundle();
     parameters.putString("message", "Test Photo ");
     parameters.putString("picture","http://fbrell.com/f8.jpg");
     parameters.putString(" name","JCPenney Dialogs");
     parameters.putString("caption", "test android and phonegap");
     parameters.putString("description","all good!");
     parameters.putString("redirect_uri","http://www.example.com/response");
     facebook.dialog(ctx, "feed", parameters, new WallPostDialogListener());
    }
   });
  } 
  return new PluginResult(Status.OK);
 }
 
 class WallPostDialogListener implements DialogListener {
  public void onComplete(Bundle values) {
   final String postId = values.getString("post_id");
   if (postId != null) {
    Toast.makeText(ctx, "Message posted to your facebook wall!!", 0);

   }else {
    Toast.makeText(ctx, "Wall post cancelled!!", 0);
   }
  }
  public void onFacebookError(FacebookError e) {
   Toast.makeText(ctx,"Failed to post to wall!",0);
   e.printStackTrace();
  }
  public void onError(DialogError e) {
   Toast.makeText(ctx, "Failed to post to wall!", 0);
   e.printStackTrace();
  }
  public void onCancel() {
   Toast.makeText(ctx, "Wall post cancelled!", 0);
  }

 } 
}

沒有留言:

張貼留言