Android
Users
如何在Android应用中实现Facebook登录功能
20 分
如何将facebook登录添加到您的android应用程序 介绍 在本指南中,您将学习如何使用facebook登录和 解析用户 解析用户 类通过back4app进行登录。此教程使用在android studio 4 1 1中创建的基本应用程序,使用 buildtoolsversion=30 0 3 buildtoolsversion=30 0 3 , 编译sdk版本=30 编译sdk版本=30 和 targetsdkversion 30 targetsdkversion 30 在任何时候,您都可以在我们的github仓库中访问使用此教程构建的完整android项目 kotlin示例仓库 java示例仓库 目标 使用parse和back4app为您的android应用程序创建facebook登录功能。 先决条件 要完成本教程,我们需要: android studio 在 back4app 上创建的应用程序。 注意: 请遵循 新 parse 应用程序教程 ,了解如何在 back4app 上创建 parse 应用程序。 一个连接到 back4app 的安卓应用。 注意: 请遵循 安装 parse sdk 教程 ,以创建一个连接到 back4app 的 android studio 项目。 一台运行 android 4 1(果冻豆)或更高版本的设备(或 虚拟设备 )。 1 facebook 设置 要开始使用 facebook 功能,您需要: 访问 facebook 开发者网站 并创建一个帐户和一个应用。 通过 点击这里 遵循 facebook 的快速入门指南,并注意以下建议: 以下是 facebook 快速入门指南中包含的步骤,您需要仔细遵循,因为您不会完全按照 facebook 的建议进行操作: 在步骤3中,代替添加 在 dependencies{} dependencies{} 部分在 build gradle (module\ app) build gradle (module\ app) , 在 dependencies{} dependencies{} 部分在 build gradle (module\ app) build gradle (module\ app) 请记得将parse facebook utils sdk for android的版本更新到最新版本。您可以在 jitpack网站 , 按照以下步骤进行操作 在 jitpack 网站粘贴 parse community\ parsefacebookutils android parse community\ parsefacebookutils android 在 git 仓库 url git 仓库 url 框中。 完成后,点击 查找 查找 按钮。然后您应该看到可用的 android 版 parse sdk 版本,如下图所示。 在第4步中,您将被要求在 应用程序 应用程序 元素中添加互联网权限 /app/manifest/androidmanifest xml /app/manifest/androidmanifest xml 文件,但您在遵循 安装parse sdk 教程时已经添加了它,因此您不需要这样做。 在第6步中,您需要提供密钥哈希,因此您必须安装 open ssl 。facebook的指南没有提供在linux中生成密钥哈希的命令行,但这很简单,因为您只需打开一个终端窗口并运行以下命令: 不要在之后立即遵循facebook的快速入门指南的步骤 步骤 6 。 什么是sha 1 (安全哈希算法) sha 1,称为安全哈希算法,是最常见的加密算法。sha 1由美国国家安全局设计。sha 1指纹是为您的pc生成的唯一密钥,可用于签名。它主要用于提交某些api(例如我们将在本指南中使用的facebook api)。如果您想了解更多详细信息,可以访问sha 1维基百科页面。 您应该遵循facebook快速入门指南中描述的其他步骤,而不是在这里提到的步骤。 2 将您的 facebook 应用与 back4app 连接 前往您的应用仪表板,点击 back4app 网站 并点击 服务器设置 服务器设置 找到“facebook 登录”块并点击 设置 设置 “facebook 登录”块看起来是这样的 3\ 我们需要添加我们的 facebook id,这个 id 是从 facebook 指南中获得的,应该在之前的步骤中完成。前往您的 android studio 项目,打开您的字符串文件 /app/src/main/res/values/strings xml /app/src/main/res/values/strings xml , 复制您的 facebook app id facebook app id 并将其粘贴到您打开的 back4app 最后一页的 facebook appid facebook appid 字段中。最后,按下 + + 按钮 3 在 manifest 文件中添加提供者元素 返回到您的 android studio 项目,在 application application 元素中,在 /app/manifest/androidmanifest xml /app/manifest/androidmanifest xml 文件中,紧接着 meta data meta data 元素,添加以下代码 1 \<provider 2 android\ name="com facebook facebookcontentprovider" 3 \<! don't forget to put your facebook app id in the following link > 4 android\ authorities="com facebook app facebookcontentprovideryour facebook app id" 5 android\ exported="true" /> 不要忘记在上面的代码中放入您的 facebook 应用 id。 4 初始化 parse facebook util sdks 在您的 android studio 项目中,在您创建的名为 app app 的 java 文件中,该文件扩展了 application 以初始化 parse sdk,在其 oncreate oncreate 方法中,在 parse initialize() parse initialize() 调用之后,使用以下代码初始化 parse facebook utils sdk。 如果您没有如本步骤所述的 app java app java 文件,请访问 安装 parse sdk for android https //www back4app com/docs/android/parse android sdk 文档,并确保您已按照所有步骤正确安装 parse sdk。如果您没有正确安装 parse sdk,您的 facebook 登录将无法与 parse 一起工作。 5 设置 在每个 parse 活动开始时,导入以下内容: 6 登录 要实现您的登录活动,请执行以下操作: 导入到你的 loginactivity loginactivity , 除了在 第 4 步 2\ 要实现 facebook 登录,只需使用以下代码: 1 final progressdialog dialog = new progressdialog(this); 2 dialog settitle("please, wait a moment "); 3 dialog setmessage("logging in "); 4 dialog show(); 5 collection\<string> permissions = arrays aslist("public profile", "email"); 6 parsefacebookutils loginwithreadpermissionsinbackground(this, permissions, (user, err) > { 7 dialog dismiss(); 8 if (err != null) { 9 log e("facebookloginexample", "done ", err); 10 toast maketext(this, err getmessage(), toast length long) show(); 11 } else if (user == null) { 12 toast maketext(this, "the user cancelled the facebook login ", toast length long) show(); 13 log d("facebookloginexample", "uh oh the user cancelled the facebook login "); 14 } else if (user isnew()) { 15 toast maketext(this, "user signed up and logged in through facebook ", toast length long) show(); 16 log d("facebookloginexample", "user signed up and logged in through facebook!"); 17 getuserdetailfromfb(); 18 } else { 19 toast maketext(this, "user logged in through facebook ", toast length long) show(); 20 log d("facebookloginexample", "user logged in through facebook!"); 21 showalert("oh, you!", "welcome back!"); 22 } 23 });1 val dlg = progressdialog(this) 2 dlg settitle("please, wait a moment ") 3 dlg setmessage("logging in ") 4 dlg show() 5 val permissions collection\<string> = listof("public profile", "email") 6 parsefacebookutils loginwithreadpermissionsinbackground(this, permissions) { user parseuser?, err parseexception? > 7 dlg dismiss() 8 when { 9 err != null > { 10 log e("facebookloginexample", "done ", err) 11 toast maketext(this, err message, toast length long) show() 12 } 13 user == null > { 14 toast maketext(this, "the user cancelled the facebook login ", toast length long) show() 15 log d("facebookloginexample", "uh oh the user cancelled the facebook login ") 16 } 17 user isnew > { 18 toast maketext(this, "user signed up and logged in through facebook ", toast length long) show() 19 log d("facebookloginexample", "user signed up and logged in through facebook!") 20 getuserdetailfromfb() 21 } 22 else > { 23 toast maketext(this, "user logged in through facebook ", toast length long) show() 24 log d("facebookloginexample", "user logged in through facebook!") 25 showalert("oh, you!", "welcome back!") 26 } 27 } 28 } 在示例项目中,这段代码放置在一个 通过 facebook 登录 通过 facebook 登录 按钮的回调中。 3\ 通过 facebook 成功登录到我们的应用后,我们现在可以获取一些基本的登录用户信息。正如你所看到的,上面的代码中包含了许多其他方法。 getuserdetailfromfb getuserdetailfromfb 方法负责获取用户详细信息。以下是该方法的代码: 1 private void getuserdetailfromfb() { 2 graphrequest request = graphrequest newmerequest(accesstoken getcurrentaccesstoken(), (object, response) > { 3 parseuser user = parseuser getcurrentuser(); 4 try { 5 if (object has("name")) 6 user setusername(object getstring("name")); 7 if (object has("email")) 8 user setemail(object getstring("email")); 9 } catch (jsonexception e) { 10 e printstacktrace(); 11 } 12 user saveinbackground(e > { 13 if (e == null) { 14 showalert("first time login!", "welcome!"); 15 } else 16 showalert("error", e getmessage()); 17 }); 18 }); 19 20 bundle parameters = new bundle(); 21 parameters putstring("fields", "name,email"); 22 request setparameters(parameters); 23 request executeasync(); 24 }1 private fun getuserdetailfromfb() { 2 val request = 3 graphrequest newmerequest(accesstoken getcurrentaccesstoken()) { `object` jsonobject, graphresponse? > 4 val user = parseuser getcurrentuser() 5 try { 6 user username = `object` getstring("name") 7 } catch (e jsonexception) { 8 e printstacktrace() 9 } 10 try { 11 user email = `object` getstring("email") 12 } catch (e jsonexception) { 13 e printstacktrace() 14 } 15 user saveinbackground { 16 if (it == null) 17 showalert("first time login!", "welcome!") 18 else 19 showalert("error", it message) 20 } 21 } 22 val parameters = bundle() 23 parameters putstring("fields", "name,email") 24 request parameters = parameters 25 request executeasync() 26 } 4\ 添加一个方法来显示警告对话框并使过程看起来更专业是很有趣的。在这个函数中,我们还获取一个用户参数。当进入 mainactivity 页面时,我们在意图中发送这个用户参数,在 mainactivity 中,我们提取这个用户的信息并将其打印在屏幕上。下面的方法实现了这一点: 1 private void showalert(string title, string message) { 2 alertdialog builder builder = new alertdialog builder(this) 3 settitle(title) 4 setmessage(message) 5 setpositivebutton("ok", (dialog, which) > { 6 dialog cancel(); 7 intent intent = new intent(this, mainactivity class); 8 intent addflags(intent flag activity clear task | intent flag activity new task); 9 startactivity(intent); 10 }); 11 alertdialog ok = builder create(); 12 ok show(); 13 }1 private fun showalert(title string, message string?) { 2 val builder = alertdialog builder(this) 3 settitle(title) 4 setmessage(message) 5 setpositivebutton("ok") { dialog dialoginterface, which int > 6 dialog cancel() 7 val intent = intent(this\@loginactivity, mainactivity class java) 8 intent addflags(intent flag activity clear task or intent flag activity new task) 9 startactivity(intent) 10 } 11 val ok = builder create() 12 ok show() 13 } 5\ 如果您想将现有的 parseuser 关联到 facebook 帐户,可以这样链接: 1 collection\<string> permissions = arrays aslist("public profile", "email"); 2 if (!parsefacebookutils islinked(parseuser getcurrentuser())) { 3 parsefacebookutils linkwithreadpermissionsinbackground(parseuser getcurrentuser(), this, permissions, ex > { 4 if (parsefacebookutils islinked(parseuser getcurrentuser())) { 5 toast maketext(this, "woohoo, user logged in with facebook ", toast length long) show(); 6 log d("facebookloginexample", "woohoo, user logged in with facebook!"); 7 } 8 }); 9 } else { 10 toast maketext(this, "you have already linked your account with facebook ", toast length long) show(); 11 }1 val permissions= listof("public profile","email") 2 if (!parsefacebookutils islinked(parseuser getcurrentuser())){ 3 parsefacebookutils linkwithreadpermissionsinbackground(parseuser getcurrentuser(),this,permissions) { 4 if (parsefacebookutils islinked(parseuser getcurrentuser())){ 5 toast maketext(this, "woohoo, user logged in with facebook ", toast length long) show() 6 log d("facebookloginexample", "woohoo, user logged in with facebook!") 7 } 8 } 9 } else { 10 toast maketext(this, "you have already linked your account with facebook ", toast length long) show() 11 } 12 } 在示例项目中,这段代码放置在一个 将您的帐户链接到 facebook 将您的帐户链接到 facebook 按钮回调中。 6\ 如果您想解除 facebook 与用户的链接,只需执行以下操作: 1 parsefacebookutils unlinkinbackground(parseuser getcurrentuser(), ex > { 2 if (ex == null) { 3 toast maketext(this, "the user is no longer associated with their facebook account ", toast length long) show(); 4 log d("myapp", "the user is no longer associated with their facebook account "); 5 } else { 6 toast maketext(this, ex getmessage(), toast length long) show(); 7 } 8 });1 parsefacebookutils unlinkinbackground(parseuser getcurrentuser()) { 2 if (it == null) { 3 toast maketext(this,"the user is no longer associated with their facebook account ",toast length long) show() 4 log d("myapp", "the user is no longer associated with their facebook account ") 5 } else { 6 toast maketext(this, it message, toast length long) show() 7 } 8 } 在示例项目中,这段代码放置在一个 从 facebook 解除您的帐户链接 从 facebook 解除您的帐户链接 按钮回调中。 7\ 使用以下方法在 非常重要 的 oncreate() oncreate() 方法之外,向 loginmanager 传递登录结果,通过 callbackmanager 避免错误。 1 @override 2 protected void onactivityresult(int requestcode, int resultcode, intent data) { 3 super onactivityresult(requestcode, resultcode, data); 4 parsefacebookutils onactivityresult(requestcode, resultcode, data); 5 }1 override fun onactivityresult(requestcode int, resultcode int, data intent?) { 2 super onactivityresult(requestcode, resultcode, data) 3 parsefacebookutils onactivityresult(requestcode, resultcode, data) 4 } 7 登出 要实现 facebook 登出,只需使用下面提到的代码: 1 final progressdialog dialog = new progressdialog(this); 2 dialog settitle("please, wait a moment "); 3 dialog setmessage("logging out "); 4 dialog show(); 5 loginmanager getinstance() logout(); 6 parseuser logoutinbackground(e > { 7 if (e == null) 8 showalert("so, you're going ", "ok bye bye then", true); 9 else 10 showalert("error ", e getmessage(), false); 11 });1 val dlg = progressdialog(this) 2 dlg settitle("please, wait a moment ") 3 dlg setmessage("logging out ") 4 dlg show() 5 loginmanager getinstance() logout() 6 parseuser logoutinbackground { e > 7 if (e == null) 8 showalert("so, you're going ", "ok bye bye then", true) 9 else 10 showalert("error ", e message, false) 11 } 在示例项目中,这段代码放置在一个 登出 登出 按钮回调中。 该方法 alertdisplayer alertdisplayer 与您在 loginactivity loginactivity 中添加的相同,别忘了更改它的 intent intent 参数。 完成了! 在这个阶段,您可以使用 parse server 核心功能通过 back4app 登录、注册和登出您的应用!