如果我們要在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");
}
}