Android
Users
Интеграция Facebook входа в Android с Parse SDK
21 мин
как добавить вход через facebook в ваше android приложение введение в этом руководстве вы узнаете, как войти с помощью входа через facebook и parse user parse user класса через back4app этот учебник использует базовое приложение, созданное в android studio 4 1 1 с buildtoolsversion=30 0 3 buildtoolsversion=30 0 3 , compile sdk version = 30 compile sdk version = 30 и targetsdkversion 30 targetsdkversion 30 в любое время вы можете получить доступ к полному android проекту, созданному с помощью этого учебника, в наших репозиториях на github репозиторий примера на kotlin репозиторий примера на java цель создайте функцию входа через facebook в ваше android приложение с использованием parse и back4app предварительные требования чтобы завершить этот учебник, нам нужно android studio приложение, созданное на back4app примечание следуйте учебнику по созданию нового parse app чтобы узнать, как создать parse app на back4app android приложение, подключенное к back4app примечание следуйте учебнику по установке parse sdk чтобы создать проект android studio, подключенный к back4app устройство (или виртуальное устройство ) с android 4 1 (jelly bean) или новее 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 для android до последней вы можете узнать, какая версия последняя, на сайте jitpack , следуя этим шагам на сайте jitpack вставьте parse community\ parsefacebookutils android parse community\ parsefacebookutils android в поле url репозитория git url репозитория git после этого нажмите на посмотреть посмотреть кнопку затем вы должны увидеть доступные версии parse sdk для android, как показано на следующем изображении на шаге 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 — это уникальный ключ, сгенерированный для вашего пк, который можно использовать для подписи он в основном используется для отправки при использовании некоторых api (например, api facebook, который мы будем использовать в этом руководстве) если вы хотите узнать больше деталей, вы можете посетить страницу sha 1 в википедии вы должны следовать другим шагам, описанным в быстром руководстве facebook, которые здесь не упомянуты 2 свяжите ваше приложение facebook с back4app перейдите на панель управления вашего приложения по адресу сайт back4app и нажмите на настройки сервера настройки сервера найдите блок “facebook login” и нажмите на настройки настройки блок “facebook login” выглядит так 3\ нам нужно добавить наш facebook id, который мы получили из руководства facebook, в string xml (вы должны были следовать руководству facebook и сделать это ранее) перейдите в ваш проект android studio, откройте файл строк /app/src/main/res/values/strings xml /app/src/main/res/values/strings xml , скопируйте ваш facebook app id facebook app id и вставьте его в поле facebook appid facebook appid последней страницы back4app, которую вы открыли наконец, нажмите кнопку + + 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 app id в код выше 4 инициализация parse facebook util sdks в вашем проекте android studio, в java файле под названием app app который расширяет application, который вы создали для инициализации parse sdk, в его oncreate oncreate методе, сразу после parse initialize() parse initialize() вызова, используйте следующий код для инициализации parse facebook utils sdk если у вас нет app java app java файла, как описано в этом шаге, перейдите к установите parse sdk для 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() метода вашего loginactivity loginactivity для передачи результатов входа в 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 аргументы готово! на этом этапе вы можете войти, зарегистрироваться и выйти из вашего приложения с помощью facebook, используя основные функции parse server через back4app!