Как обновить профиль пользователя после входа через GitHub с помощью Firebase в Android?
В этой статье мы научимся обновлять профили пользователей, вошедших в приложение через GitHub. Профиль будет обновляться с помощью информации GitHub пользователя, такой как идентификатор GitHub, имя, подписчики, подписки и т. д. Начнем!
Шаг 1. Сначала настройте приложение, чтобы пользователи могли входить в него через GitHub. Итак, вам нужно аутентифицировать пользователя с помощью GitHub с помощью firebase. Для этого выполните все шаги, описанные в статье: Аутентификация пользователя с помощью Github в Android.
Шаг 2. Обновите профиль
Для этого объявите переменную, скажем, «пользователь» типа map<String, Any> в другой части метода signInWithGithubProvider(), как показано ниже, используйте AdditionalUserInfo для извлечения информации о профиле пользователя Github.
private fun signInWithGithubProvider(){
. . .
if{
. . . }
else {
. . .
val user: Map<String, Any> = it.additionalUserInfo!!.profile as Map<String, Any> // it refers to AuthResult!
. . .
}
}
Используя AdditionalUserInfo, вся необходимая информация будет отправлена из MainActivity в HomePageActivity (с использованием Intent), которая содержит информацию о профиле пользователя. Весь код остается таким же, как и в этой статье, найдите отличия и добавьте те строки кода, которые необходимы для обновления профиля пользователя. Ниже приведен код файла MainActivity.kt . Комментарии добавляются внутри кода, чтобы понять код более подробно.
Kotlin
import android.content.Intent import android.os.Bundle import android.text.TextUtils import android.widget.Button import android.widget.EditText import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.tasks.OnFailureListener import com.google.android.gms.tasks.OnSuccessListener import com.google.android.gms.tasks.Task import com.google.firebase.auth.AuthResult import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.OAuthProvider import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase class MainActivity : AppCompatActivity() { private lateinit var firebaseUser: FirebaseUser private lateinit var loginBtn: Button private lateinit var githubEdit: EditText // firebaseAuth variable to be initialized later private lateinit var auth: FirebaseAuth // an instance of an OAuthProvider using its // Builder with the provider ID github.com private var provider = OAuthProvider.newBuilder( "github.com" ) override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Initialize Firebase Auth auth = Firebase.auth loginBtn = findViewById(R.id.github_login_btn) githubEdit = findViewById(R.id.githubId) // Target specific email with login hint. provider.addCustomParameter( "login" , githubEdit.text.toString()) // Request read access to a user"s email addresses. // This must be preconfigured in the app"s API permissions. val scopes: ArrayList<String?> = object : ArrayList<String?>() { init { add( "user:email" ) } } provider.scopes = scopes // call signInWithGithubProvider() method // after clicking login Button loginBtn.setOnClickListener { if (TextUtils.isEmpty(githubEdit.text.toString())) { Toast.makeText( this , "Enter email associated to github" , Toast.LENGTH_LONG).show() } else { signInWithGithubProvider() } } } // To check if there is a pending // result, call pendingAuthResult private fun signInWithGithubProvider() { // There"s something already here! Finish the sign-in for your user. val pendingResultTask: Task<AuthResult>? = auth.pendingAuthResult if (pendingResultTask != null ) { pendingResultTask .addOnSuccessListener { // User is signed in. Toast.makeText( this , "User exist" , Toast.LENGTH_LONG).show() } .addOnFailureListener { // Handle failure. Toast.makeText( this , "Error1 : $it" , Toast.LENGTH_LONG).show() } } else { auth.startActivityForSignInWithProvider( this , provider.build()) .addOnSuccessListener( OnSuccessListener<AuthResult?> { // User is signed in. // retrieve the current user firebaseUser = auth.currentUser!! val user: Map<String, Any> = // contains additional user information as // a result of a successful sign-in it.additionalUserInfo!!.profile as Map<String, Any> // // navigate to HomePageActivity after successful login val intent = Intent( this , HomePageActivity:: class .java) // send github user name from MainActivity to HomePageActivity intent.putExtra( "githubUserName" , firebaseUser.displayName) intent.putExtra( "twitterHandle" , user[ "twitter_username" ].toString()) intent.putExtra( "githubBio" , user[ "bio" ].toString()) intent.putExtra( "linkedInLink" , user[ "blog" ].toString()) intent.putExtra( "id" , user[ "login" ].toString()) intent.putExtra( "follower" , user[ "followers" ].toString()) intent.putExtra( "following" , user[ "following" ].toString()) intent.putExtra( "publicRepos" , user[ "public_repos" ].toString()) intent.putExtra( "location" , user[ "location" ].toString()) intent.putExtra( "profilePic" , user[ "avatar_url" ].toString()) this .startActivity(intent) Toast.makeText( this , "Login Successfully" , Toast.LENGTH_LONG).show() }) .addOnFailureListener( OnFailureListener { // Handle failure. Toast.makeText( this , "Error2 : $it" , Toast.LENGTH_LONG).show() }) } } } |
Шаг 3: Создайте новую пустую активность
Обратитесь к этой статье Как создать новую активность в Android Studio и создать новую активность. Назовите активность как HomePageActivity. Перейдите в приложение > res > layout > activity_home_page.xml и добавьте приведенный ниже код в этот файл. Ниже приведен код файла activity_home_page.xml .
XML
<? xml version = "1.0" encoding = "utf-8" ?> < androidx.constraintlayout.widget.ConstraintLayout android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".HomePageActivity" > < ImageView android:id = "@+id/profilePic" android:layout_width = "120dp" android:layout_height = "100dp" android:layout_marginStart = "10dp" android:layout_marginTop = "10dp" android:layout_marginEnd = "10dp" android:contentDescription = "profile image" android:scaleType = "centerCrop" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" app:layout_constraintTop_toTopOf = "parent" tools:srcCompat = "@tools:sample/avatars[3]" /> < LinearLayout android:id = "@+id/linearLayout2" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_margin = "8dp" android:layout_marginTop = "20dp" android:orientation = "vertical" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" app:layout_constraintTop_toBottomOf = "@+id/profilePic" > < LinearLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginTop = "8dp" android:orientation = "horizontal" android:weightSum = "2" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" app:layout_constraintTop_toTopOf = "parent" > < TextView android:id = "@+id/idHeader" android:layout_width = "0dp" android:layout_height = "wrap_content" android:layout_weight = "0.5" android:text = "GitHub Id:" android:textColor = "#06590A" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" app:layout_constraintTop_toTopOf = "parent" /> < TextView android:id = "@+id/githubId" android:layout_width = "0dp" android:layout_height = "wrap_content" android:layout_weight = "1.5" android:hint = "github id" android:textAlignment = "center" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" app:layout_constraintTop_toTopOf = "parent" /> </ LinearLayout > < LinearLayout android:id = "@+id/linearLayout" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginTop = "8dp" android:orientation = "horizontal" android:weightSum = "2" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" > < TextView android:id = "@+id/headerId" android:layout_width = "0dp" android:layout_height = "wrap_content" android:layout_weight = "0.5" android:text = "User Name :" android:textColor = "#06590A" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" app:layout_constraintTop_toTopOf = "parent" /> < TextView android:id = "@+id/id" android:layout_width = "0dp" android:layout_height = "wrap_content" android:layout_weight = "1.5" android:hint = "user name" android:textAlignment = "center" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" app:layout_constraintTop_toTopOf = "parent" /> </ LinearLayout > < LinearLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginTop = "8dp" android:orientation = "horizontal" android:weightSum = "2" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" > < TextView android:id = "@+id/followerHeader" android:layout_width = "0dp" android:layout_height = "wrap_content" android:layout_weight = "0.5" android:text = "Follower:" android:textColor = "#06590A" app:layout_constraintEnd_toEndOf = "parent" app:layout_constraintStart_toStartOf = "parent" app:layout_constraintTop_toTopOf = "parent" /> < TextView android:id = "@+id/follower" android:layout_width =
|