Код Android работает в разработке, но не работает в магазине игр - PullRequest
0 голосов
/ 28 марта 2019

Извините за плохой английский.

Я пишу (или нахожу, копирую) некоторые коды для изменения языка приложения. Это работает, когда я строю через Android Studio. Но после того, как я нажал на Google Play Store, коды не удалось!

Я зарегистрировал его полностью, и 95% уверены, что в моем коде нет ошибок.

Первая часть скопирована из stackoverflow.

package com.my.package;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.util.Log;

import java.util.Locale;

/**
 * Created by devdeeds.com on 18/4/17.
 * by Jayakrishnan P.M
 */

public class LocaleHelper {
    private static final String DEFAULT_LANGUAGE = "en";
    private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";

    public static String getLanguage(Context context) {
        Log.i("lang", "getLanguage");

        String lang = getPersistedData(context);
        Log.i("lang", "getLanguage, lang = "+lang);
        return lang;
    }

    public static Context setPrevLanguage(Context context) {
        Log.i("lang", "setPrevLanguage");

        String lang = getLanguage(context);
        Log.i("lang", "setPrevLanguage, prev lang = "+lang);
        return _setLang(context, lang);
    }

    public static Context setLanguage(Context context, String language) {
        Log.i("lang", "setLanguage");
        getPersistedData(context);
        persist(context, language);
        getPersistedData(context);
        return _setLang(context, language);
    }

    private static Context _setLang(Context context, String lang) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, lang);
        }
        return updateResourcesLegacy(context, lang);
    }

    private static String getPersistedData(Context context) {
        Log.i("lang", "getPersistedData");
        Log.i("lang", "getPersistedData, applic ID = "+BuildConfig.APPLICATION_ID);
        SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Activity.MODE_PRIVATE);
        String lang = prefs.getString(SELECTED_LANGUAGE, DEFAULT_LANGUAGE);
        Log.i("lang", "getPersistedData, lang = "+lang);
        return lang;
    }

    private static void persist(Context context, String language) {
        SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Activity.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(SELECTED_LANGUAGE, language);
        editor.apply();
    }

    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language) {
        Resources resources = context.getResources();
        Configuration activityConf = resources.getConfiguration();
        Locale newLocale = new Locale(language);
        activityConf.setLocale(newLocale);
        resources.updateConfiguration(activityConf, resources.getDisplayMetrics());

        Resources applicationRes = context.getApplicationContext().getResources();
        Configuration applicationConf = applicationRes.getConfiguration();
        applicationConf.setLocale(newLocale);
        applicationRes.updateConfiguration(applicationConf, applicationRes.getDisplayMetrics());

        return context.createConfigurationContext(activityConf);

    }

    @SuppressWarnings("deprecation")
    private static Context updateResourcesLegacy(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Resources resources = context.getResources();

        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;

        resources.updateConfiguration(configuration, resources.getDisplayMetrics());

        return context;

    }
}

Вторая часть - как я их использую.

//when changing app language based on previous setting
LocaleHelper.setPrevLanguage(StartActivity.this);
LocaleHelper.setPrevLanguage((HomeActivity)this); 

//when setting app language through Setting/Language
String lang = "fil";  //its an app for fillipino
LocaleHelper.setLanguage(getContext(), lang);

при работе

LocaleHelper.setPrevLanguage(StartActivity.this);

, он корректно регистрируется как в режиме отладки (сборка через android studio), так и в версии play-store. Но только версия отладки хорошо изменит версию приложения, а версия play-store - нет.

Кто-то тоже сталкивался с этим, те же самые коды делают разные работы в отладочной и игровой версии?

1 Ответ

0 голосов
/ 29 марта 2019

Это всего лишь предположение. Если вы используете Android App Bundle , тогда ваше приложение будет разделено для уменьшения размера загрузки. Один из способов сделать это - доставить только локали, используемые на телефоне. Он определяет, когда пользователь меняет локаль через ОС, и загружает дополнительные строки. Но когда вы используете свой код, это, вероятно, не произойдет.

Чтобы увидеть, является ли это проблемой, вы можете попробовать использовать APK, а не пакет, или нет enable split .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...