Facebook SDK集成之準備篇

前情概要

  1. Facebook SDK集成之綱要篇

集成環境

github上的環境說明有點瑕疵, 在Wosao/readme上做了更正。本地集成環境如下:
1. AndroidStudio 1.4.1
2. Facebook SDK 4.6.0
3. Gradle 2.2
4. OS Win10

目標

本作代碼 使用 git checkout -f MyDev-Add-Facebook 獲得

本作是其中的第二篇,通過閱讀本作,您會知道集成SDK需要哪些東東:
1. Key Hash
2. Facebook App通行證 (app_id)
3. SDK依賴配置

至於,如何使用Android Studio創建工程,這個步驟忽略。

Key Hash

在申請App id過程中需要,分爲2中debug key hash值, release key hash值。
debug key hash的生成依賴於 文件 debug.keystore 而release key hash依賴於你自己的release keystore。如何生成release key,自行google。
這裏介紹2中方法生成facebook所需的key hash值

命令行生成

  1. Debug Key Hash

    C:\Users\Administrator>keytool -exportcert  -keystore C:\Users\Administrator\.android\debug.keystore  | openssl sha1 -binary | openssl base64
    輸入密鑰庫口令:  android
    bxxxxxxNM5QmqJ8WcFpQR6cys40=

    口令默認是 android, 生成Key Hash是28位字符!
    提示: 這裏可以使用facebok提供的key store來替代自有的keystore文件。

  2. Release Key Hash

    C:\Users\Administrator>keytool -exportcert  -keystore C:\Users\Administrator\.android\.keystore\release-key.jks  | openssl sha1 -binary | openssl base64
    輸入密鑰庫口令:  Your_Password
    bxxxxxx....xxxx=

    口令是自己App release key 密碼, 生成Key Hash是28位字符!

代碼生成

推薦使用代碼生成方法

public static String printKeyHash(Activity context) {
        PackageInfo packageInfo;
        String key = null;
        try {
            //getting application package name, as defined in manifest
            String packageName = context.getApplicationContext().getPackageName();

            //Retriving package info
            packageInfo = context.getPackageManager().getPackageInfo(packageName,
                    PackageManager.GET_SIGNATURES);

            Log.e(TAG, "\n\n Package Name = " + context.getApplicationContext().getPackageName());

            for (Signature signature : packageInfo.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                key = new String(Base64.encode(md.digest(), 0));

                // String key = new String(Base64.encodeBytes(md.digest()));
                Log.e(TAG, "Key Hash: " + key);
            }
        } catch (PackageManager.NameNotFoundException e1) {
            Log.e(TAG, "Name not found " +  e1.toString());
        }
        catch (NoSuchAlgorithmException e) {
            Log.e(TAG, "No such an algorithm " + e.toString());
        } catch (Exception e) {
            Log.e(TAG, "Exception " + e.toString());
        }
        return key;
    }

這種方法,不論哪種key hash都可獲得, 備用!

Facebook App通行證 (app_id)

如何申請Facebook App id 參考 前文Android Studio集成Facebook SDK
在申請過程中加入key hash值,然後就可以獲得App id串。備用!

SDK依賴配置

要將facebook SDK 配置到自己 App中,還需要做一些工作。

  • 創建Android Studio 工程, 按照facebook要求,Minimum SDK 需要在15以上(含).
    Select API 15: Android 4.0.3 or higher and create your new project.

  • 打開 your_app | build.gradle 文件,在其中添加

    //step_2 添加maven倉庫
    repositories{
    mavenCentral()
    }//end
    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'
    
    //step_3 facebook sdk version
    compile 'com.facebook.android:facebook-android-sdk:4.6.0'
    }
  • 將從facebook開發者網站獲取的該App的Id 存放在string.xml中。不知道如何獲取,參考
    Android Studio集成Facebook SDK

    <!--facebook app_id -->
    <string name="facebook_app_id">1640967989507233</string>
  • 以上完畢後,需要編譯工程,gradle自動下載facebook sdk 4.6.0版本。
    注意:本地測試 發現依賴4.8.0版本會出現錯誤, 改爲4.6.0版本依賴!

    12-10 21:56:01.570 E/AndroidRuntime(12307): FATAL EXCEPTION: main
    12-10 21:56:01.570 E/AndroidRuntime(12307): Process: com.shrimpcolo.wosao, PID: 12307
    12-10 21:56:01.570 E/AndroidRuntime(12307): java.lang.NullPointerException
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at com.facebook.FacebookButtonBase.getFragment(FacebookButtonBase.java:105)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at com.facebook.login.widget.LoginButton$LoginClickListener.onClick(LoginButton.ja
    va:736)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at com.facebook.FacebookButtonBase$1.onClick(FacebookButtonBase.java:383)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at android.view.View.performClick(View.java:4446)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at android.view.View$PerformClick.run(View.java:18485)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at android.os.Handler.handleCallback(Handler.java:733)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at android.os.Handler.dispatchMessage(Handler.java:95)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at android.os.Looper.loop(Looper.java:136)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at android.app.ActivityThread.main(ActivityThread.java:5290)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at java.lang.reflect.Method.invokeNative(Native Method)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at java.lang.reflect.Method.invoke(Method.java:515)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:859)
    
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:675)
    12-10 21:56:01.570 E/AndroidRuntime(12307):     at dalvik.system.NativeStart.main(Native Method)
    12-10 21:56:17.270 I/Process (12307): Sending signal. PID: 12307 SIG: 9
    12-10 21:56:17.290 I/ActivityManager(  660): Process com.shrimpcolo.wosao (pid 12307) has died.
  • 要使facebook sdk能正常使用,還需要使用網絡權限,以及mete-data聲明

        <!--step_4 網絡權限 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <!-- end step_4 -->
    <application android:label="@string/app_name" ...>
    ...
    <meta-data android:
    name="com.facebook.sdk.ApplicationId"
    android:value="@string/facebook_app_id"/>
    ...
    </application>
  • 使用Login 和 Share功能
    爲使用facebook的Login 或者 Share,還需要增加FacebookActivity到manifest文件:

    <activity android:name="com.facebook.FacebookActivity"
            android:configChanges=
                "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:label="@string/app_name" />
  • 發送圖片或視頻
    如果你需要分享 鏈接, 圖片, 視頻, 那麼你同樣需要聲明FacebookContentProvider 到manifest中。

    <provider android:authorities="com.facebook.app.FacebookContentProvider{APP_ID}"
          android:name="com.facebook.FacebookContentProvider"
          android:exported="true"/>

    詳細參考官方文檔: https://developers.facebook.com/docs/sharing/android
    在本作中,並沒有使用FacebookContentProvider,也可以分享圖庫中的圖片。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章