Facebook SDK集成之准备篇

2024-04-05 18:40:33 146点热度 0人点赞 0条评论
前情概要 Facebook SDK集成之纲要篇 集成环境 github上的环境说明有点瑕疵, 在Wosao/readme上做了更正。本地集成环境如下: 1. AndroidStudio 1.4.1 2. Facebook […]

前情概要 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值

命令行生成

Debug Key Hash

C:UsersAdministrator>keytool -exportcert -keystore C:UsersAdministrator.androiddebug.keystore | openssl sha1 -binary | openssl base64输入密钥库口令: androidbxxxxxxNM5QmqJ8WcFpQR6cys40=

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

Release Key Hash

C:UsersAdministrator>keytool -exportcert -keystore C:UsersAdministrator.android.keystoreelease-key.jks | openssl sha1 -binary | openssl base64输入密钥库口令: Your_Passwordbxxxxxx....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, " 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 versioncompile '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: main12-10 21:56:01.570 E/AndroidRuntime(12307): Process: com.shrimpcolo.wosao, PID: 1230712-10 21:56:01.570 E/AndroidRuntime(12307): java.lang.NullPointerException12-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.java: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: 912-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,也可以分享图库中的图片。

PC400

这个人很懒,什么都没留下