Facebook SDK集成之准备篇

来源:互联网 发布:数据挖掘技术与算法 编辑:程序博客网 时间:2024/05/17 04:51

前情概要

  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输入密钥库口令:  androidbxxxxxxNM5QmqJ8WcFpQR6cys40=

    口令默认是 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_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, "\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 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,也可以分享图库中的图片。

0 0