您的位置:首页 > 移动开发 > Android开发

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

2012-03-21 21:40 465 查看

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)

[b]错误处理[/b]

处理错误

提示

疑难解答

[b]例子[/b]

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 )

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: