Saturday, July 30, 2011

分享才是王道︰從你的APK發佈Facebook訊息!

這個部落格的存在,
主要是因為小鰻本人記憶力非常不好,
我必須要有一個工具記住我以前學過的東西,
哈,離題。
今天要講如何讓你的APK
擁有發佈Facebook訊息的功能


底下列了大概要做哪些事的步驟︰

一、Facebook網站端
1.在Facebook註冊開發者身份
2.在Facebook開發者頁面新增應用程式
3.輸入Key Hash


二、Eclipse端
1.下載Facebook源碼
2.創建Facebook的基本SDK


三、Code端
1.將Facebook Library套入到自己的專案
2.將manifest.xml加上Internet permission
3.攢寫並使用Facebook Code




==========正文開始===============


一、Facebook網站端


1.在Facebook註冊開發者身份
我們必須跟 Facebook註冊成為開發者的身份,
之後才有權利跟Facebook伺服器做溝通。


2.在Facebook開發者頁面新增應用程式
要利用Facebook API跟Facebook伺服器溝通前,
我們必須先創立專屬的應用程式
因為等等我們寫Code呼叫API時,
會需要我們這裡申請到的應用程式ID




3.輸入Key Hash
官方文件這麼說明︰
We now need to export the signature for your app so that Facebook can use to ensure users are only communicating with your app on the Android. This is done by running the keytool.
原來Key Hash是Facebook和我們的應用程式做溝通的橋樑。



怎麼生成這個Key Hash呢?
首先,我們必須搞懂Android Signature這個東西,
由於篇幅問題,這裡跳過,
你可以去參考Android Guide裡的資料
但我可以跟你說,
一般我們的開發過程,
會有2種Signature,
一種是Debug用的Signature,
另一種是真正要發佈程式至Android Market用的正式Signature。

在這裡,我先示範抓出Debug Signature的方法,
如果之後要用發佈的Signature,
記得底下這步要做啊!


(1)開啟Terminal終端機,輸入


註︰如果你是用Windows,請在Mysgit產生的Git Bash視窗裡輸入上面這行指令

要怎麼查你的debug.keystore在哪裡呢?
在Eclipse中,點選[Windows]-->[Preferences]
出現底下的視窗
沒有Keytool指令?
Keytools在C:\Program Files\Java\jdk1.6.0_26\bin\裡
拜託環境變數設好再來。


沒有openssl?
我在Ubuntu和Mac下,因為是Linux環境,
只要apt install openssl就好了,很快
但Windows下openssl要怎麼匯入,
 請知道的人提供一下,謝謝
註︰Android真的不適合在Windows環境開發,
你會發現很多東西都要用到Linux


總之,剛才那段keytool指令,
在terminal裡應該要能生成出Key Hash。
示意圖如下︰




(2)將生成的值複製並貼入Facebook的Key Hash



二、Eclipse端

1.下載Facebook源碼
請使用Git的方式,將Facebook源碼下載下來
Windows用msygit
指令為
git clone http://github.com/facebook/facebook-android-sdk.git


2.創建Facebook的基本SDK
我們現在要將剛才git clone下來的源碼新增進Eclipse裡。

在Eclipse工具列[File]-->[New]-->[Android Project]裡,
從一個已存在的目錄去新建專案,
而路徑請導到剛才clone下來的目錄底下的facebook目錄


 此外,你可以按照官方文件的教學,
同樣方式導入另一個資料夾的Sample Application,
去看看官方教你的API使用方式。
當然,我接下來的教學裡也會說明。
This library includes two sample applications to guide you in development.
  • simple: A bare-bones app that demonstrates authorization, making API calls, and invoking a dialog.
  • stream: This slightly beefier application lets you view your news feed.
To install a sample application into Eclipse (3.5):
  • Create the sample application in your workspace:
  • Select File -> New -> Project, choose Android Project, and then click Next.
    1. Select "Create project from existing source".
    2. Choose either examples/simple or examples/stream. You should see the project properties populated.
    3. Click Finish to continue.
  • Build the project: from the Project menu, select "Build Project".    

三、Code端
    1. 將Facebook Library套入到自己的專案
    (1)點擊[Project]-->[Propertites]


    底下那裡應該有打勾

    (2)看一下Package Explore,Facebook是不是順利匯進來了呢?




    2.將manifest.xml加上Internet permission


    耶!可以開始寫Code了


    3.攢寫並使用Facebook Code
    將FB專案成功的匯入我們的正在開發的專案夾後,
    剩下的就是如何攢寫Code去呼叫Facebook API了。
    Facebook的API有新(Graph API )舊(Legacy REST API:)兩種版本,
    官方已經不建議我們用舊的了。


    底下會以Graph API做示範。


    因為Facebok支援Single-Sign-On(SSO),
    所以如果使用者在用我們APK的當下有登入Facebok的話,
    基本上就不需要重複登入了。


    在攢寫程式碼的一開始,
    還記得我們教學一開始要求在Facebook Developer裡新增應用程式裡的應用程式ID嗎?
    這裡就要開始用到了。
    package com.greatap;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import com.facebook.android.*;
    import com.facebook.android.Facebook.*;
    
    public class MyGreatActivity extends Activity {
    
        Facebook facebook = new Facebook("你的應用程式ID");
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
               //跟Facebook伺服器要求User可以透過我們的程式跟Facebook做
               //發文的動作。
            facebook.authorize(this, new String[] { "email", "publish_stream" },
               //跟伺服器申請我們要能發文和用e-mail,
               //這裡可以任我們新增修改
            new DialogListener() {
                 @Override
                  public void onComplete(Bundle values) {
             //當認證成功後我們當然是要發文,
             //發文有2種模式,
             //一種用post或get,
             //另一種用Dialog的模式,
             //Dialog模式會呼叫"即將會發什麼文章至Facebook"的視窗給使用者預覽
              try {     
                   Bundle parameters = new Bundle();
    
                  //使用者想說的話 
                   parameters.putString("message", "可以預寫使用者要發的黑體文字");
                   //連結所想呈現的文字
                   parameters.putString("name", "連結裡所以呈現的文字");
                   //連結網址
                   parameters.putString("link","https://market.android.com/details?id=com.hardworking.managingdecision_lite&feature=search_result");
                  //灰色註解
                   parameters.putString("description","在灰色註解區塊想寫些什麼?");
                //使用Dialog的方式發文
               facebook.dialog(Result.this, "feed", parameters, new DialogListener(){
    
           @Override
           public void onComplete(Bundle values) {
            // TODO Auto-generated method stub
            
           }
    
           @Override
           public void onFacebookError(FacebookError e) {
            // TODO Auto-generated method stub
            
           }
    
           @Override
           public void onError(DialogError e) {
            // TODO Auto-generated method stub
            
           }
    
           @Override
           public void onCancel() {
            // TODO Auto-generated method stub
            
           }
                    
                   });
                  
    }
    
               @Override
               public void onFacebookError(FacebookError error) {}
    
               @Override
               public void onError(DialogError e) {}
    
               @Override
               public void onCancel() {}
          }
    );
          
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            facebook.authorizeCallback(requestCode, resultCode, data);
        }
    }
     


    認證那段的程式碼facebook.authorize會讓使用者出現底下的畫面


    寫到這裡,這樣子你會了嗎?
    對了,更多的Facebook API指令,
    都可以在這裡查到哦!

    4 comments:

    Anonymous said...

    小鰻,想請問一下,如果要藉由DIALOG 發送訊息到好友塗鴉牆要怎麼做... 因為只能PO到自己塗鴉牆上

    這是我的Mail : a12125s.norman@hotmail.com

    Anonymous said...

    Here you are :
    http://gnuwin32.sourceforge.net/packages/openssl.htm

    Anonymous said...

    小鰻你好
    真的很謝謝你的文章
    冒昧請問一下
    如果發文不想有視窗跳出來
    自動就po好 能否給點建議? Thanks
    //使用Dialog的方式發文
    facebook.dialog(Result.this, "feed", parameters, new DialogListener

    chen19570713 said...

    一個不錯的 android 教學網
    https://www.facebook.com/groups/588162597963349/