Как интегрировать игровые сервисы Google в Kotlin Android и получить таблицу лидеров и достижения

Я новичок в kotlin и хочу попробовать игровые сервисы Google. Я застрял в функции входа в Google. Я нажал кнопку входа, и она показывает, что ее нажали, но пользовательский интерфейс не изменился на окно входа в учетную запись Google. Что делает эта строка? и как я могу показать окно входа в систему при запуске игры?

Основная деятельность:


package com.example.spotifygame

import android.os.Bundle
import android.widget.Button
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isInvisible
import com.google.android.gms.games.*
import com.google.android.gms.tasks.Task
import com.google.android.gms.games.PlayGamesSdk;


class MainActivity : AppCompatActivity() {
    //UI Buttons
    private lateinit var signInButton: Button
    private lateinit var achievementButton: Button
    private lateinit var leaderBoardButton: Button
    //Game service Clients
    private lateinit var gamesSignInClient: GamesSignInClient
    private lateinit var achievementsClient: AchievementsClient
    private lateinit var leaderboardsClient: LeaderboardsClient



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //google game services
        PlayGamesSdk.initialize(this);

        // Buttons wire
        signInButton = findViewById(R.id.signIn)
        achievementButton = findViewById(R.id.achievements)
        leaderBoardButton = findViewById(R.id.leader_board)

        //verify user authentication
        initGoogleServiceClients()

        //default Buttons invisible
        signInButton.isInvisible = true
        achievementButton.isInvisible = true
        leaderBoardButton.isInvisible = true

        // setup button functions
        signInButton.setOnClickListener() {
            println("debug: sign btn clicked")
            gamesSignInClient.signIn()
        }
        achievementButton.setOnClickListener() {
            println("debug: achievement btn clicked")

            showAchievements()
        }
        leaderBoardButton.setOnClickListener() {
            println("debug: leader board btn clicked")
            showTopPlayers()
        }
    }

    private fun initGoogleServiceClients() {
        gamesSignInClient = PlayGames.getGamesSignInClient(this)
        gamesSignInClient.isAuthenticated.addOnCompleteListener { isAuthenticatedTask: Task<AuthenticationResult> ->

            // boolean = successfully authenticated
            val isAuthenticated = isAuthenticatedTask.isSuccessful &&
                    isAuthenticatedTask.result.isAuthenticated
            if (isAuthenticated) {
                // Continue with Play Games Services
                // get two clients
                achievementsClient = PlayGames.getAchievementsClient(this)
                leaderboardsClient = PlayGames.getLeaderboardsClient(this)

                // make buttons visible
                achievementButton.isInvisible = false
                leaderBoardButton.isInvisible = false

                //show current player ID
                PlayGames.getPlayersClient(this).currentPlayer.addOnCompleteListener { mTask: Task<Player?>? ->
                    val iD = mTask?.result?.playerId
                    println("debug: id is $iD")
                }
                //debug
                println("debug: successfully authenticated")

            } else {
                // Disable your integration with Play Games Services or show a
                // login button to ask  players to sign-in. Clicking it should
                // call GamesSignInClient.signIn().
                gamesSignInClient.signIn()

                //make sign in button visible
                signInButton.isInvisible = false

                //debug
                println("debug: failed authenticated")
            }
        }

    }

    // Button Functions
    fun showTopPlayers() {
        leaderboardsClient.allLeaderboardsIntent.addOnSuccessListener {
            //deprecated
            startActivityForResult(intent,0)

            //new way
//            val previewRequest =
//                registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
//                    if (it.resultCode == RESULT_OK) {
//                        val list = it.data
//                        // do whatever with the data in the callback
//                        println("debug: data list have $list")
//
//                    }
//                }
        }

    }
    fun showAchievements() {
        achievementsClient.achievementsIntent.addOnSuccessListener {
            startActivityForResult(intent,0)

        }
    }

    // Feature Functions

    fun unlockAchievements(achievementID: String) {
        // unlock the achievement
        achievementsClient.unlock(achievementID)
    }

    fun updateScore(leaderboardID: String, score: Long) {
        leaderboardsClient.submitScore(leaderboardID, score)

    }


}

Я также не уверен, как вызвать отображение таблицы лидеров и достижений в функциях. Я использую устаревший код startActivityForResults.

Грейдл (: приложение)

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'

}

android {
    namespace 'com.example.spotifygame'
    compileSdk 32

    defaultConfig {
        applicationId "com.example.spotifygame"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildscript {
        repositories {
            google()
            mavenCentral()
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.5.1'
    implementation 'com.google.android.material:material:1.7.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    //google play games
    implementation "com.google.android.gms:play-services-games-v2:+"
    implementation 'com.google.android.gms:play-services-location:21.0.1'
    implementation 'com.google.android.gms:play-services-auth:20.3.0'


}

Захват терминала и пользовательского интерфейса:

---------------------------- PROCESS STARTED (10405) for package com.example.spotifygame ----------------------------
2022-11-11 00:15:52.449 10405-10405 System.out              com.example.spotifygame              I  debug: failed authenticated
2022-11-11 00:15:54.992 10405-10405 System.out              com.example.spotifygame              I  debug: sign btn clicked

Я следил за документом Android службы игр Google Play. Я настроил проект в игровой консоли Google. для моего файла gradle я не включал всю область проекта, так как это дает мне ошибку.

allprojects {
    repositories {
      google()
      mavenCentral()
    }
  }

Связь: https://developers.google.com/games/services/android/quickstart

Я жду: При запуске приложения будет окно входа в игровой аккаунт Google.

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я чувствую вашу боль, Google не предоставил код, как использовать implementation "com.google.android.gms:play-services-games-v2:+". Это на Java (с лямбда-выражениями), поэтому просто скопируйте/вставьте в Android Studio в файл Kotlin, и он переведет его.

Я проведу вас на полпути, так как мой код настолько отличается, что я не хочу пытаться превратить его в то, что у вас есть. Это показывает достижения, уже достигнутые игроком. Мы предполагаем, что PlayGamesSdk.initialize(this); загружается без ошибок (в логарифме нет **** APP NOT CORRECTLY CONFIGURED TO USE GOOGLE PLAY GAME SERVICES **** DEVELOPER_ERROR и т. д.) и

    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
    gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
      if (isAuthenticatedTask.isSuccessful() && isAuthenticatedTask.getResult().isAuthenticated())

Правда! (Нужно ли упоминать, что нужно знать, где вы используете this? Если это в бегуне, это может не быть контекстом, необходимым для переданного параметра.)

Вот мое шоу достижений, подпрограмма вызывается при нажатии кнопки UI Achievements: -

private void showAchievements() {
    try {
        AchievementsClient ac = PlayGames.getAchievementsClient(this);
        Task<Intent> ti = ac.getAchievementsIntent();
        ti.addOnSuccessListener(intent -> startActivityForResult(intent, 0));
    } catch (Exception | Error e) {
        //log error / whatever
    }
}

Это может быть однострочник, я просто разбил его на переменные для удобства чтения. Обратите внимание, что Task — это асинхронный метод, который возвращает намерение, которое вы хотите запустить, а не само намерение. Поэтому поставьте слушателя на завершение задачи, чтобы получить намерение начать действие.

Используйте этот подход для всех этих процедур, которые возвращают Task<Intent>.

Надеюсь это поможет!

Другие вопросы по теме