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