如果我們要在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.建立後之後會出現如下圖

facebook sdk  

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裡

然後透過下圖加到專案內

FB  

匯入後如果發現有錯誤的話有可能是因為

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


}

arrow
arrow

    cookiesp 發表在 痞客邦 留言(0) 人氣()