Как обновить профиль пользователя после входа через GitHub с помощью Firebase в Android?

Опубликовано: 1 Сентября, 2022

В этой статье мы научимся обновлять профили пользователей, вошедших в приложение через 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 
    xmlns:tools="http://schemas.android.com/tools"
    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"