前情概要
集成環境
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值
命令行生成
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文件。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,也可以分享圖庫中的圖片。