FaceBook开放平台,移动篇android版 (指南)

Android指南

这篇文档将指导你通过Facebook平台与android集成。我们将通过一步步的关键步骤来构建一个android社交app。它将告诉你怎样允许单点登录(Single Sign-On)。我们也将围绕Facebook平台的整合,涵盖额外的主题。以下是本章目录

入门

1.使用facebook注册你的android App 

2.下载安装android SDK

准备你的工程(project)

3.创建新的facebook SDK工程

4.添加引用到facebook  SDK

5.设置添加你App的签名到facebook App中

单点登录Single Sign On

6.允许单点登录(Single Sign-On)

  6.1 修改AndroidManifest.xml文件来允许网络传输

  6.2 Single-Sign-On (SSO)

  6.3 安装facebook android app

  6.4 编译执行项目

  6.5 更多权限

  6.6 保存你的access token

7.允许用户注销你的App

8.扩展access token

添加社交 context

9. 使用 Graph API

10.社交频道 

11. Timeline 和社交图谱( Open Graph)

错误处理

处理错误

提示

疑难解答

例子

Hackbook for Android

Open Graph Wishlist


Step 1: 使用facebook注册你的android App

开始与Facebook平台相结合,在Facebook上创建一个新的应用程序,并输入你的应用程序的基本信息。(create a new app on Facebook此页面需要FQ)

  

注意你的App ID。当整合Facebook SDK到你的Android  App中时,你可以需要修改一些些的代码。当你的App设置好以后,就可以准备开始整合到facebook中了


Step 2: 下载安装android SDK

  • 首先请确保你安装了Eclipse
  • 设置你的 Java Compliance Level 为Java 1.6: Eclipse->Preferences->Java->Compiler->Compiler Compliance Level->1.6
  • 安装Android SDK 和 Eclipse 插件(ADT)
  • 安装Git: Win Setup, OSX Setup, Linux Setup
  • Clone the GitHub repository: git clone git://github.com/facebook/facebook-android-sdk.git
  • 创建模拟器,没有什么特殊的地方,大家都会

Step 3: 创建新的facebook SDK工程

第一次,你将需要为Facebook SDK源码创建一个新的Android 工程。这仅仅需要一次。因为后面你可以选择 Create project from existing source指定一下facebook目录就行了 


Step 4:添加引用到Facebook  SDK

关于引用facebook SDK你需要如下操作,在你的工程下点击properties ,按下Add 按钮然后导入Library


Step 5: 设置添加你App的签名到facebook App中

Facebook需要额外的一个安全层用来签名。你需要把你的Android App 签名 放到你Facebook App Setting中。你可以通过使用keytool 来生成一个签名。下面显示怎样为你的App导出Key。keytool 在你的jdk/bin目录下 ,例如我是XP系统,这个工具的位置在我打D:\Program Files\Java\jdk1.6\bin\keytool.exe。

以下内容请仔细阅读:keytool.exe会生成一个keyhash,尽管他找不到你的 debug.keystore。请确保您所提供debug.keystore的路径是正确的。. For Windows,通常在 C:\Users\<user>\.android\      for Mac 在 /Users/<user>/.android/ 

经 过验证我发现这个文件在我的C:\Documents and Settings\Administrator\.android\debug.keystore。但是我发现在 Eclipse->Window->Preferences->Android->Build

有一个Default debug keystore:D:\Documents\.android\debug.keystore   这里有2个路径,上网搜了后发现还是用Eclipse下的!

另外确保使用正确的密码 - 用于调试keystore默认密码为“android生成keyhash。如果工具不能用密码访问,就是你的路径没设置正确

在CMD下命令为:

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 //这是mac下的用"/", windowns下转为"\"

这里90%以上的人绝对会出问题,首先应该会报错,提示你openssl这个命令找不到,但是后面 | openssl sha1 -binary | openssl base64这个是不能删除的, 删除的话,我显示的就是乱码。这里我就baidu弄不出来,没办法就使用openssl关键字搜索电脑里的所有文件,原来在D:\Program Files\Git\bin中 有我们要的openssl

输入密码后,OK了,终于出来了那一串字符

此工具在Mobile 字段生成一个字符串必须在您的应用程序开发应用移动部分注册记得点击“Save Changes”来保存你的keyhash

 


Step 6: 允许单点登录(Enable Single Sign-On for your App)

Single Sign-On 允许用户授权你的App并在外部键入他们的用户名和密码。并通过你的App吧分享的内容发布到facebook上。如果用户已经安装并授权了这个 Facebook App,那么你的App能利用Facebook app来单点登录授权。官方强烈推荐我们使用SSO来授权。

Step 6.1:修改AndroidManifest.xml文件来允许网络传输

一旦Facebook SDK 被引用进来manifest文件就需要修改以允许app可以实现针对facebook的网络传输。实际上来说就是修改AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

Step 6.2: Single-Sign-On (SSO)


与ios SDK一样,Android SDK最引人注目的功能之一就是Single-Sign-On (SSO). SSO 让用户使用Facebook的身份登录到你的应用程序. 如果他们已经在自己的设备上签过名的话,他们就不需要在输入用户名和密码了。你的App就有权访问他们的在facebook上的个人资料和社交图谱

用Facebook SDK添加SSO到你的App其实很简单。下面的例子概述了写什么样的代码能启用此功能。现在假设你已经有一个MyGreatApp工程。打开 MyGreatApp project -> src -> com.greatapp -> MyGreatActivity.java。并用下面的代码替换,请注意YOUR_APP_ID需要你填写你的创建的App_ID。

package com.greatapp;

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("YOUR_APP_ID");

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

facebook.authorize(this, new DialogListener() {
@Override
public void onComplete(Bundle values) {}

@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);
}
}

 

Step 6.3: 安装Facebook Android App

启动一个2.2的模拟器。并使用adb工具安装 like this(安装方法有很多种,这里我选个不太常用的安装方法):

adb install ~/facebook-android-sdk/Facebook.apk

Step 6.4: 编译执行项目

编译执行'MyGreatApp' project。他将启动模拟器。你将会看到一个授权对话框,用来提示你授权


此对话框允许用户授予你的程序的权限访问他们的信息如果用户按下允许您的应用程序将被用户授权你将通过Facebook的实例可以访问到用户的个人资料社会图谱如果用户按下不允许,认可你的应用程序将不能访问用户的数据

Step 6.5: 更多权限

默认情况下,要求用户授权访问应用程序的基本信息是公开的是Facebook上的默认如果您的应用程序需要超过这个基本信息功能必须要求从用户具体权限这是通过传递的String[]权限授权方法下面的例子显示如何要求获得用户的电子邮件地址得到扩展access token

facebook.authorize(this, new String[] { "email", "publish_checkins" },

new DialogListener() {
@Override
public void onComplete(Bundle values) {}

@Override
public void onFacebookError(FacebookError error) {}

@Override
public void onError(DialogError e) {}

@Override
public void onCancel() {}
}
);

下面显示了一个额外的授权界面,用户可以允许访问 all或者none

更多用户权限请参考http://developers.facebook.com/docs/authentication/permissions/

Step 6.6: 保存你的access token

如果你再次运行你的工程(在用户已经授权之后),会出现以下提示信息

为了摆脱这个对话框,我们可以使用Shared Preferences.,让我们来再次修改以前的代码:

package com.greatapp;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import com.facebook.android.*;
import com.facebook.android.Facebook.*;

public class MyGreatActivity extends Activity {

Facebook facebook = new Facebook("YOUR_APP_ID");
String FILENAME = "AndroidSSO_data";
private SharedPreferences mPrefs;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*
* Get existing access_token if any
*/
mPrefs = getPreferences(MODE_PRIVATE);
String access_token = mPrefs.getString("access_token", null);
long expires = mPrefs.getLong("access_expires", 0);
if(access_token != null) {
facebook.setAccessToken(access_token);
}
if(expires != 0) {
facebook.setAccessExpires(expires);
}

/*
* Only call authorize if the access_token has expired.
*/
if(!facebook.isSessionValid()) {

facebook.authorize(this, new String[] {}, new DialogListener() {
@Override
public void onComplete(Bundle values) {
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("access_token", facebook.getAccessToken());
editor.putLong("access_expires", facebook.getAccessExpires());
editor.commit();
}

@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);
}
}

 access token 在onComplete()方法中使用SharedPreferences 保存

请注意下面:

if(!facebook.isSessionValid()) //facebook.authorize()才会被调用

有这么一种情况,用户修改了密码,但是他还是愿意访问你的App,如果我们程序没有看出这一点。那么access token是无效的,在onComplete()时,会返回如下错误:

User revoked access to your app:
{"error":{"type":"OAuthException","message":"Error validating access token: User 1053947411 has not authorized application 157111564357680."}}

OR when password changed:
{"error":{"type":"OAuthException","message":"Error validating access token: The session is invalid because the user logged out."}}

Step 7: 允许用户注销你的App

用户要停止使用Facebook的整合与您的应用程序你可以调用logout方法以清除应用程序状态,使服务器的请求当前access_token失效。
mAsyncRunner.logout(getContext(), new RequestListener() {
@Override
public void onComplete(String response, Object state) {}

@Override
public void onIOException(IOException e, Object state) {}

@Override
public void onFileNotFoundException(FileNotFoundException e,
Object state) {}

@Override
public void onMalformedURLException(MalformedURLException e,
Object state) {}

@Override
public void onFacebookError(FacebookError e, Object state) {}
});
注意注销不会撤销你的应用程序的权限,但只会清除你的应用程序的access_token

Step 8: 扩展access token

原文:

对于离线访问,用户每次打开你的App后,你需要扩展access_token。需要需要这样做你就可以在onResume()方法中调用fackbook SDK中的extendAccessTokenIfNeeded :

    public void onResume() {    
super.onResume();
facebook.extendAccessTokenIfNeeded(this, null);
}

注意:确保你的SDK是最新的https://github.com/facebook/facebook-android-sdk/


Step 9: 使用 Graph API

你可以理解为Graph 为图谱,Facebook graph 就是一个社交的图形界面(eg.人,照片,事件,)并与整个Facebook产生联系,尤其影响与你相关的人。

以下是一段例子

   // get information about the currently logged in user
mAsyncRunner.request("me", new meRequestListener());

// get the posts made by the "platform" page
mAsyncRunner.request("platform/posts", new pageRequestListener());

// get the logged-in user's friends
mAsyncRunner.request("me/friends", new friendsRequestListener());


更多细节请参考facebook上的android sdk 文档



 

Step 10: 社交频道

 Android SDK 提供一个方法来显示facebook平台对话框,只需要一行代码就能搞定,它并不需要你自己创建一个本地的对话框,并能处理响应。我稍微看了下源码就是面向接口编程的体现。

Feed Dialog - like this:

//调用feed 对话框的代码
//post on user's wall.
mFacebook.dialog(context, "feed", new PostDialogListener());

//post on friend's wall.
Bundle params = new Bundle();
params.putString("to", "");
mFacebook.dialog(context, "feed", params, new PostDialogListener());

Request Dialog-like this:

 

 //Send requests with no friend pre-selected and user
//selects friends on the dialog screen.
mFacebook.dialog(context, "apprequests", new AppRequestsListener());

//send request to a particular friend.
Bundle params = new Bundle();
params.putString("to", "");
mFacebook.dialog(context, "apprequests", new AppRequestsListener());

Step 11: Timeline 和社交图谱( Open Graph)

简而言之,Facebook就是要做大做强,面向全球化的用户体验,并继续扩大开放平台,使更多好的应用集成到facebook,给用户带来更好的体验

用户添加你的App到他们时间轴()你的应用程序通过Open Graph分享到Facebook。您的应用程序会成为用户体验的重要组成部分,然后连锁就会产生包括好友,新闻等。建议最好

自己多体验下facebook的功能和玩法。

Timeline 很快就要登录移动平台。马上做好整合的准备吧  ,更多内容请参阅 learn moreor the tutorial.


处理错误

下面是一些常见的错误和解决方案

  • Build error: "missing gen files".

    基本上就是常见的丢失R文件,Clean一下即可

  • Error: "invalid_key"

    这个错误说明Facebook服务器无法识别你的 Android key hash。 确保你的key hash是正确的,并在Facebook developer settings console保存了

  • Dialog won't load or shows a blank screen.

    如果日志没有显示错误。我们建议你安装tcpdump 来跟踪Tutorial: http://www.vbsteven.be/blog/android-debugging-inspectin-network-traffic-with-tcpdump/

    如果仍然无法确认是什么问题,请 include the HTTP trace.

  • I can't upload photos with photos.upload.

    Make sure the Bundle value for the photo parameter is a byte array.(字节组数)


Tips

  • 你需要有一个能测试你Facebook app的环境。 在实际设备上,你可以从Android Market应用程序下载最新版本在模拟器上将不得不自行安装

  • 注意请先安装sdk中的facebook.apk

  • 使用签名的版本,请注意debug key,确保是匹配的

  • 最后依旧是看原文吧guide to developing on a device.


故障排解

  • Key Hash Reference Doc: Signing Your Applications.

  • Keytool command not found error: Keytool标准android sdk会提供,并且jdk中也有,如果你还是提示命令没找到,请设置 环境变量的path并重启

  • Openssl: 如果你真找不到openssl,就下载一个吧,但最好还是设置path: Windows, MAC. For Mac说明here.

  • Invalid Key Hash:

    • 没有找到你本地的debug.keystore 。那么请检查你的路径。

    • 如果密码错误。请注意默认的android。我想你们大概也不会去修改它吧

    • 当添加keyhash后,在Setting 控制台上,记得点击 “保存改变”( 'Save Changes' )

    • 如果以上都失败,请使用cygwin或 linux box 来生成 hashkey.

  • Installation [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES] error:卸载干净点,在重新装一次

  • onActivityResult() function is not called: 确保'Intent.FLAG_ACTIVITY_NO_HISTORY'没有在AndroidManifest file中定义

  • App type Web vs Native/Desktop. Does it matter?: No, it does not matter. 但我们推荐使用 'Native/Desktop' for your app.


例子

Hackbook for Android


包含sso的实现,简单api的调用和像获得新权限这样的高级功能,Run FQL Query, Graph API Explorer.

Open Graph Wishlist

Wishlist 是在移动平台上使用自定义对象和动作。它允许用户创建一个自定义的wishlist,添加产品描述和图片。并还能附加本地位置(location ) 

 

posted @ 2012-03-21 21:40  jy02432443  阅读(26563)  评论(1编辑  收藏  举报