Yellow Rabbit

Google Play Games Services

Подключение Google Play Games Services вручную

Если в точности следовать указаниям Google по интеграции с GPGS (Google Play Games Services), то гарантированы дикие глюки при попытке откомпилировать получившегося монстра. И дело тут не в том, что вы не найдёте в Android Studio пункта File > Import Module, проблема в том, что модуль BaseGameUtils рассчитан на старые версии GPGS и SDK.

Итак имеем:

Клонируем android basic samples и копируем оттуда содержимое android-basic-samples/BasicSamples/libraries/BaseGameUtils/src/main/java/ к себе в main/java для того чтобы сохранить иерархию com/google/example/games/basegameutils/.

Также забираем android-basic-samples/BasicSamples/libraries/BaseGameUtils/src/main/res/values/gamehelper_strings.xml, потом добавляем содержимое strings.xml ко своим строковым ресурсам.

Пробуем make project и исправляем мелочи, вроде не найденного модуля R, это легко.

Main Activity

Несколько импортов:


import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.games.Games;

import com.google.example.games.basegameutils.BaseGameUtils;
import com.google.example.games.basegameutils.GameHelper;

Кроме упомянутых в инструкции переменных нам понадобится ещё одна:


private GameHelper gameHelper;

Она нужна чтобы задать количество запросов об авторизации. В onCreate:


        // init game services
        gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES);
        gameHelper.enableDebugLog(true);
        gameHelper.setMaxAutoSignInAttempts(1);
        gameHelper.setup(this);


Ключи

Неизбежной частью добавления GPGS являются проблемы с ключами. Этому немало способствует несоответствующая реальности документация от Google. На самом деле всё просто, если действовать аккуратно. Итак у нас должно быть следующее состояние:

  1. Опубликована полностью работающая версия без GPGS.
  2. Создана игра в Google Play Console до состояния “Готова к тестированию”.
  3. Опубликована альфа-версия с GPGS.

Пункт 2 предусматривает перечисление адресов тестеров в “Тестировании” и разрешении тестирования альфа версии, тех же, что и в описании альфа-версии (пункт 3).

Далее нужно проверить, что все ключи нашего приложения (конечный и отладочный) отражены в пункте “Связанные приложения”. Для этого запускаем Консоль разработчика и просматриваем все ключи с типом “Андроид”, для каждого ключа должно быть связанное приложение.

Как просто!

Кстати, если ключ не отражен, то нужно просто добавить наше приложение ещё раз, оно подхватит первый свободный ключ.

Отказ от login

Как требует Google не нужно предлагать авторизироваться в GPGS если пользователь когда-то отказался.

Хранить этот флажок в настройках не составляет труда, осталось только поймать сам факт отказа. Для этого нужен обработчик:


    public void onActivityResult(int requestCode, int responseCode,
                                 Intent intent) {
        gameHelper.onActivityResult(requestCode, responseCode, intent);

        Settings.autoLoginGPGSOn = (responseCode != Activity.RESULT_CANCELED);
    }

Класс настроек, просто так:


public class Settings {
    public static boolean soundOn = true;
    public static boolean musicOn = true;
    public static boolean introOn = true;
    public static boolean autoLoginGPGSOn = true;


    public final static String file = ".my_cool_settings";

    private static SharedPreferences prefs ;

    public static void load(GLGame game) {
        prefs = game.getSharedPreferences(file, 0);
        soundOn = prefs.getBoolean("soundOn", true);
        musicOn = prefs.getBoolean("musicOn", true);
        introOn = prefs.getBoolean("introOn", true);
        autoLoginGPGSOn = prefs.getBoolean("autoLoginGPGSOn", true);
    }

    public static void save(GLGame game) {
        prefs = game.getSharedPreferences(file, 0);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putBoolean("soundOn", soundOn);
        editor.putBoolean("musicOn", musicOn);
        editor.putBoolean("introOn", introOn);
        editor.putBoolean("autoLoginGPGSOn", autoLoginGPGSOn);
        editor.apply();
    }
}