Я новичок в 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.
Я чувствую вашу боль, 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>.
Надеюсь это поможет!