次のメッセージが画面に表示されました。
はい、電話の設定にはロシア語があります。 しかし、ドーナツ(1.6)以降のAndroidの使用と開発の記憶では、そのようなものを見たことはありません。 ユーザーがスマートフォンのシステム設定を変更するまで、ユーザーにアプリケーションを実行する機会を与えたくない理由がまだわかりません。
- 英語(カナダ)の言語が選択されている場合でも、Amazon Musicが起動しないのは不思議です。
- きちんとしたUI(アルファベット順の言語リスト)によると、これはバグではないと感じていますが、意図的に行われています。
- 私はAmazonの友人に手紙を書きましたが、これまでのところ、彼はこの機能が何であるかを管理者から知ることができませんでした。
そのような禁止がどのように指示される可能性があるかについて、誰にもアイデアがありますか?
PS Androidで使用可能な翻訳と言語が一致しない場合、 res 。 / values フォルダーからstrings.xmlが自動的に選択されるという開発者の無知を信じていません。
05/02更新:
kolipassのアドバイスで、電話からapkを引き出しました(Es File Explorerを使用)。 次に、 オンラインの逆コンパイラを使用して、ソースをかなりうまく解凍しました(プロガードをまったく使用していないようです)。 しかし、 strings.xmlを使用すると、彼は賢く、ほとんどの場合、 compatライブラリとgoogle playサービスからの翻訳を含めました 。したがって、古き良きapktoolデコンパイラーを起動する必要がありましたが、 res / valuesフォルダーに独自のstrings.xmlがあり、すべての英語のローカライズがそこにあることが判明しました。 この場合、 values-ru dadにはロシア語も含まれています!
しかし、その後、 BaseActivity.javaファイルとMarket.javaファイルからすべてが明らかになりました。
class BaseActivity { ... if (!Market.isCountrySupported(getResources())) { String s = TAG; Object aobj[] = new Object[1]; aobj[0] = getClass().getName(); Log.warning(s, "Finishing %s due to unsupported locale", aobj); startActivity(InvalidLocaleActivity.getIntent(this)); finish(); } } class Market { static { US = new Market("US", 0, "ATVPDKIKX0DER", "ATVPDKIKX0DER", new String[] { "US" }); UK = new Market("UK", 1, "A1F83G8C2ARO7P", "A1F83G8C2ARO7P", new String[] { "UK", "GB" }); GERMANY = new Market("GERMANY", 2, "A1PA6795UKMFR9", "A1PA6795UKMFR9", new String[] { "DE", "AT", "CH" }); FRANCE = new Market("FRANCE", 3, "A13V1IB3VIYZZH", "A13V1IB3VIYZZH", new String[] { "FR" }); SPAIN = new Market("SPAIN", 4, "A1RKKUPIHCS9HS", "AJZF8LZ1EJVJN", new String[] { "ES" }); ITALY = new Market("ITALY", 5, "APJ6JRA9NG5V4", "A3HOBANJMCMD83", new String[] { "IT" }); JAPAN = new Market("JAPAN", 6, "A1VC38T7YXB528", "A1VC38T7YXB528", new String[] { "JP" }); CANADA = new Market("CANADA", 7, "A2EUQ1WTGCTBG2", "A2EUQ1WTGCTBG2", new String[] { "ZH" }); CHINA = new Market("CHINA", 8, "AAHKV2X7AFYLW", "AAHKV2X7AFYLW", new String[] { "CN" }); BRAZIL = new Market("BRAZIL", 9, "A2Q3Y263D00KWC", "A2Q3Y263D00KWC", new String[] { "BR" }); INDIA = new Market("INDIA", 10, "A21TJRUUN4KGV", "A2XZLSVIQ0F4JT", new String[] { "IN" }); MEXICO = new Market("MEXICO", 11, "A1AM78C64UM0Y8", "A3P3J5A7D2ZVXI", new String[] { "MX" }); AUSTRALIA = new Market("AUSTRALIA", 12, "A39IBJ37TRP1C6", "A1RNPCQ4K8U27I", new String[] { "AU" }); RUSSIA = new Market("RUSSIA", 13, "AD2EMQ3L3PG8S", "A38NPJYVS5YHNH", new String[] { "RU" }); NETHERLANDS = new Market("NETHERLANDS", 14, "A1805IZSGTT6HS", "A1M3WC0SJ3A38T", new String[] { "NL" }); Market amarket[] = new Market[15]; amarket[0] = US; amarket[1] = UK; amarket[2] = GERMANY; amarket[3] = FRANCE; amarket[4] = SPAIN; amarket[5] = ITALY; amarket[6] = JAPAN; amarket[7] = CANADA; amarket[8] = CHINA; amarket[9] = BRAZIL; amarket[10] = INDIA; amarket[11] = MEXICO; amarket[12] = AUSTRALIA; amarket[13] = RUSSIA; amarket[14] = NETHERLANDS; $VALUES = amarket; DEFAULT_MARKET = US; Market market = US; Market amarket1[] = new Market[6]; amarket1[0] = UK; amarket1[1] = GERMANY; amarket1[2] = FRANCE; amarket1[3] = SPAIN; amarket1[4] = ITALY; amarket1[5] = JAPAN; SUPPORTED_MARKETS = EnumSet.of(market, amarket1); LANGUAGE_TO_MARKET = new HashMap(16); LANGUAGE_TO_MARKET.put("en", US); LANGUAGE_TO_MARKET.put("de", GERMANY); LANGUAGE_TO_MARKET.put("fr", FRANCE); LANGUAGE_TO_MARKET.put("es", SPAIN); LANGUAGE_TO_MARKET.put("it", ITALY); LANGUAGE_TO_MARKET.put("ja", JAPAN); LANGUAGE_TO_MARKET.put("zh", CHINA); LANGUAGE_TO_MARKET.put("ru", RUSSIA); LANGUAGE_TO_MARKET.put("nl", NETHERLANDS); Market amarket2[] = values(); int i = (int)(0.5F + (float)(2 * amarket2.length) / 0.75F); int j = (int)(0.5F + (float)amarket2.length / 0.75F); OBFUSCATED_MARKET_TO_MARKET = new HashMap(i); COUNTRY_TO_MARKET = new HashMap(j); int k = amarket2.length; for (int l = 0; l < k; l++) { Market market1 = amarket2[l]; OBFUSCATED_MARKET_TO_MARKET.put(market1.mProdObfuscatedMarket, market1); OBFUSCATED_MARKET_TO_MARKET.put(market1.mDevoObfuscatedMarket, market1); String as[] = market1.mCountryCodes; int i1 = as.length; for (int j1 = 0; j1 < i1; j1++) { String s = as[j1]; COUNTRY_TO_MARKET.put(s.toUpperCase(Locale.ROOT), market1); } } } ... public static boolean isCountrySupported(Resources resources) { Locale locale = resources.getConfiguration().locale; Market market = (Market)COUNTRY_TO_MARKET.get(locale.getCountry().toUpperCase(Locale.ROOT)); return SUPPORTED_MARKETS.contains(market); } }
一般に、私のマーケットでは、彼らはアプリケーションをロシア語ロケールで実行させないことに決めました。 しかし、私はまだ理由を理解していませんか?