国コードを取得するための最良の方法は何ですか?
今のところ、私は2つの方法を知っています。1つはTelephonyManagerで取得し、もう1つはロケールで取得します。Androidで国コードを見つけるためのもう1つの最良かつユニークな方法はどれですか?
国コードを取得するための最良の方法は何ですか?
今のところ、私は2つの方法を知っています。1つはTelephonyManagerで取得し、もう1つはロケールで取得します。Androidで国コードを見つけるためのもう1つの最良かつユニークな方法はどれですか?
これを試して:
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();
これについては常に大きな議論があり、開発者や企業が複雑な方法をとる理由がわかりません。ユーザーが選択した言語とは、ユーザーが自分の携帯電話で常に見たい言語を意味します。他の人やシステムとは異なる言語のアプリを用意するつもりはありません。
選択は非常に簡単です。ロケールを使用するか(ユーザーが優先として選択した言語を取得するため)、または、ユーザーが見たくないと既に言っている言語で情報を表示することを怒らせるために最善を尽くします。
国コードを取得するには、次を使用します。
Locale.getDefault().getCountry();
使用する:
TelephonyManager tm = (TelephonyManager)getSystemService(getApplicationContext().TELEPHONY_SERVICE);
String countryCode = tm.getNetworkCountryIso();
国のISOをSIMに書き込むのはオペレーターに依存し、CDMAネットワークもサポートしているgetSimCountryIso
ためよりも優れています。getSimCountryIso
IPアドレスで解決しました。お使いの携帯電話のIPアドレスを取得できます。Wi-Fiを使用している場合は、Wi-FiホットスポットのIPアドレスまたはモバイルサービスプロバイダーサーバーのIPアドレスになります。そのため、そのIPアドレスから、Webサービスなどに送信してその国を追跡できます。 IPアドレス。
IPアドレスの国を提供するインターネットの場合に利用可能ないくつかのソース(データベース)があります。
IPアドレスは、現在電話をかけている国を教えてくれるので、最善の方法だと思います。
あなたがそれをするなら
Locale.getDefault().getCountry();
ユーザーが国を選択した国を取得するので、イギリスを選択できます。スペインにいることもできます。おそらく、ユーザーが現在どこにいるかを知る必要があります。
例:アプリがイギリスでのみ何かを購入できると想像してください。ユーザーはスペイン出身ですが、彼/彼女はイギリスで休暇を取っているので、あなたの製品を購入したいと思っています...あなたが使用する場合
Locale.getDefault().getCountry();
そのユーザーはあなたの製品を購入することができないので、IPアドレスが私が考える最良の方法です。
Reto Meierによる優れた記事があります:http: //android-developers.blogspot.com/2011/06/deep-dive-into-location.html
ソースコードなど、Androidデバイスの場所を取得するためのさまざまな手法について説明します。
次に、場所がわかれば、その国を簡単に取得できます。オンラインWebサービスまたはオフラインデータベースを使用できます。
GPSとGoogleサービス(中国)なしで国を見つけることは非常に難しいです。TelephonyManager
お使いの携帯電話にSIMカードがない場合は機能しません。
またLocale
、中国のユーザーが自分の言語を英語に設定した場合は機能しません(取得する国は米国または英国になります)。
アプリにインターネット接続が必要な場合は、オプションがあります。ip-apiと呼ばれるこのAPIを使用できます。これを使用する予定がある場合は、最初にドキュメントを確認してください。
このfreegeoipAPIのような他のAPIがあります。
これが完全な例です。TelephonyManagerから(SIMカードまたはCDMAデバイスから)国コードを取得してみてください。利用できない場合は、ローカル構成から取得してみてください。
private static String getDeviceCountryCode(Context context) {
String countryCode;
// Try to get the country code from the TelephonyManager service
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if(tm != null) {
// Query first getSimCountryIso()
countryCode = tm.getSimCountryIso();
if (countryCode != null && countryCode.length() == 2)
return countryCode.toLowerCase();
if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
// Special case for CDMA devices
countryCode = getCDMACountryIso();
} else {
// For 3G devices (with a SIM card), query getNetworkCountryIso()
countryCode = tm.getNetworkCountryIso();
}
if (countryCode != null && countryCode.length() == 2)
return countryCode.toLowerCase();
}
// If the network country is not available (tablets maybe), get the country code from the Locale class
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
countryCode = context.getResources().getConfiguration().getLocales().get(0).getCountry();
} else {
countryCode = context.getResources().getConfiguration().locale.getCountry();
}
if (countryCode != null && countryCode.length() == 2)
return countryCode.toLowerCase();
// General fallback to "us"
return "us";
}
@SuppressLint("PrivateApi")
private static String getCDMACountryIso() {
try {
// Try to get country code from SystemProperties private class
Class<?> systemProperties = Class.forName("android.os.SystemProperties");
Method get = systemProperties.getMethod("get", String.class);
// Get homeOperator that contain MCC + MNC
String homeOperator = ((String) get.invoke(systemProperties,
"ro.cdma.home.operator.numeric"));
// First three characters (MCC) from homeOperator represents the country code
int mcc = Integer.parseInt(homeOperator.substring(0, 3));
// Mapping just countries that actually use CDMA networks
switch (mcc) {
case 330: return "PR";
case 310: return "US";
case 311: return "US";
case 312: return "US";
case 316: return "US";
case 283: return "AM";
case 460: return "CN";
case 455: return "MO";
case 414: return "MM";
case 619: return "SL";
case 450: return "KR";
case 634: return "SD";
case 434: return "UZ";
case 232: return "AT";
case 204: return "NL";
case 262: return "DE";
case 247: return "LV";
case 255: return "UA";
}
}
catch (ClassNotFoundException ignored) {
}
catch (NoSuchMethodException ignored) {
}
catch (IllegalAccessException ignored) {
}
catch (InvocationTargetException ignored) {
}
catch (NullPointerException ignored) {
}
return null;
}
また、別のアイデアは、この回答のようにAPIリクエストを試すか、細かい場所を使用することです。