Как обновить профиль пользователя после входа через 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.Intentimport android.os.Bundleimport android.text.TextUtilsimport android.widget.Buttonimport android.widget.EditTextimport android.widget.Toastimport androidx.appcompat.app.AppCompatActivityimport com.google.android.gms.tasks.OnFailureListenerimport com.google.android.gms.tasks.OnSuccessListenerimport com.google.android.gms.tasks.Taskimport com.google.firebase.auth.AuthResultimport com.google.firebase.auth.FirebaseAuthimport com.google.firebase.auth.FirebaseUserimport com.google.firebase.auth.OAuthProviderimport com.google.firebase.auth.ktx.authimport 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=
|