如果我們要在Android上使用Facebook SDK 該怎麼用呢?
Facebook SDK 有分舊版(3.0以前) 與新版(3.0 & 之後)
用法有點差異 且老實說沒那麼好用
網路上有一個lib 可以讓你簡單使用Facebook SDK
那就是Easy Facebook Android SDK (網站)
不管是用Facebook SDk 還是 EasyFacebook SDK
都必須為你的APP去Facebook developers 上註冊
在Facebook Developers上註冊APP
網址 : https://developers.facebook.com/apps
進去了後
1.建立新的應用程式
2.建立後之後會出現如下圖
Key Hash 的部分請參考這網站
http://stackoverflow.com/questions/4388992/key-hash-for-android-facebook-app
把裡面第二個解答的程式碼 開個專案讓他跑出Key Hash 再填上去
欄位都填好後 把 APP ID 記好 (在程式碼內會用到)
現在先來介紹EasyFacebook的用法
(目前EasyFacebook還不能做到取得社團貼文的部分 所以在後面會介紹Facebook SDK的用法)
EasyFacebook
其實他的網站內都有簡單範例
首先我們到裡面下載他的SDK (jar) 網站
然後匯入到專案裡
然後下面是簡單的範例
//登入 //設定登入要那些權限 String permissions[] = { "read_stream", "user_relationship_details", "user_religion_politics", "user_work_history", "user_relationships", "user_interests", "user_likes", "user_location", "user_hometown", "user_education_history", "user_activities","offline_access"}; //宣告一個FBLoginManager變數 FacebookApplicationID就是剛剛上面申請的ID //R.layout.black 裡面為一個 LinearLayout(寬高都是fill_parent) //包著一個 FrameLayout(寬高都是fill_parent) fbManager = new FBLoginManager(this,R.layout.black,"FacebookApplicationID",permissions); if (fbManager.existsSavedFacebook()) {//如果之前有登入過 fbManager.loadFacebook(); } else {//反之 登入 fbManager.login(); }
登入成功後他會回傳資料到onActivityResult
所以需要在onActivityResult裡接收資料
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { fbManager.loginSuccess(data); } public void loginSuccess(Facebook facebook) { GraphApi graphApi = new GraphApi(facebook); User user = new User(); try { user = graphApi.getMyAccountInfo(); //除了以下還有很多 set get的方法 user.getEmail();//取得Email user.getName();//取得名字 user.getId();//取得ID user.setFirst_name("first_name");//設定first name //還有很多用法 List l = graphApi.getAlbumsMy(limitAlbum);//取得自己相簿 List p = graphApi.getAllFriends();//取得朋友列表p p.get(0).getName();//取得列表p內的第一個朋友的名字 } catch (EasyFacebookError e) { e.toString(); } }
Facebook SDK 3.0
跟前面一樣都要到Facebook developers上註冊
取得 APP ID
然後需要到 https://developers.facebook.com/docs/android/
下載Facebook SDK
並import到workspace裡
然後透過下圖加到專案內
匯入後如果發現有錯誤的話有可能是因為
android-support-v4.jar 這個 lib衝突到(android SDK 本來就有 Facebook SDK也有 所以衝到)
只要把專案內libs資料夾下的 android-support-v4.jar刪除即可
看看程式碼吧!!
記得在AndroidManifest.xml裡要加入網路權限及
==============================
<activity android:name="com.facebook.LoginActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="@string/app_name" />
//appID記得加進string裡
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
==============================
public class MainActivity extends Activity { private Session.StatusCallback statusCallback = new SessionStatusCallback(); private static final String debugTag = "MainActivity"; private static final boolean debug = true; private static final String GROUP_ID = "565604230167153"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* 取得Hash Key PackageInfo info; try { info = getPackageManager().getPackageInfo("ntcu.barriersmap", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md; md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String something = new String(Base64.encode(md.digest(), 0)); //String something = new String(Base64.encodeBytes(md.digest())); Log.e("hash key", something); } } catch (NameNotFoundException e1) { Log.e("name not found", e1.toString()); } catch (NoSuchAlgorithmException e) { Log.e("no such an algorithm", e.toString()); } catch (Exception e) { Log.e("exception", e.toString()); }*/ //檢查是否已登入過 if(checkLogin(savedInstanceState)){//已經登入 fbLogin(); }else{//還沒登入 fbLogout(); } } //檢查是否已登入過 private boolean checkLogin(Bundle savedInstanceState){ Session session = Session.getActiveSession(); if (session == null) { Log.e(debugTag,"session == null"); if (savedInstanceState != null) { Log.e(debugTag,"savedInstanceState != null"); session = Session.restoreSession(this, null, statusCallback, savedInstanceState); } if (session == null) { session = new Session(this); Log.e(debugTag,"session == null"); } Session.setActiveSession(session); if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { Log.e(debugTag,"session.getState().equals(SessionState.CREATED_TOKEN_LOADED"); } } if (session.isOpened()) { Log.e(debugTag, "已經登入"); return true; }else{ Log.e(debugTag, "還沒登入"); return false; } } //登入 private void fbLogin() { Session session = Session.getActiveSession(); if (session != null) { if (!session.isOpened() && !session.isClosed()) { //設定權限 from Graph API Explorer ArrayList permissions = new ArrayList(); permissions.add("photo_upload"); permissions.add("user_groups"); permissions.add("user_friends"); permissions.add("user_likes"); permissions.add("publish_actions"); //需要權限 session.openForPublish(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(permissions)); //可以不需要權限 //session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); } else { Session.openActiveSession(this, true, statusCallback); } } } //登出 private void fbLogout() { Session session = Session.getActiveSession(); if (!session.isClosed()) { session.closeAndClearTokenInformation(); } session.closeAndClearTokenInformation(); } //Session 回傳 private class SessionStatusCallback implements Session.StatusCallback { @Override public void call(Session session, SessionState state, Exception exception) { Log.e("MainActivity", "SessionStatusCallback"); //在此撈資料 } } @Override public void onStart() { super.onStart(); Session.getActiveSession().addCallback(statusCallback); } @Override public void onStop() { super.onStop(); Session.getActiveSession().removeCallback(statusCallback); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Session session = Session.getActiveSession(); Session.saveSession(session, outState); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); Log.d("MainActivity", "onActivityResult"); } }