android Locale.getDefault (). getCountry () ничего не возвращает [дубликат]

Рассмотрим следующее:

  1. Переменные - указатели для значений в памяти.
  2. Переназначение переменной просто указывает, что указатель на новое значение .
  3. Переназначение переменной никогда не повлияет на другие переменные, указывающие на тот же объект

Итак, забудьте о «pass by reference / value» не зацикливаться на «pass by reference / value», потому что:

  1. Термины используются только для описания поведения языка языка, не обязательно фактическая базовая реализация. В результате этой абстракции теряются критические детали, которые необходимы для достойного объяснения, что неизбежно приводит к текущей ситуации, когда один термин не описывает адекватное описание фактического поведения и дополнительной информации
  2. Эти понятия изначально не были определены с целью описания javascript в частности, и поэтому я не чувствую себя вынужденным использовать их, когда они только добавляют к путанице.

Чтобы ответить на ваш вопрос : указатели переданы.

// code
var obj = {
    name: 'Fred',
    num: 1
};

// illustration
               'Fred'
              /
             /
(obj) ---- {}
             \
              \
               1

// code
obj.name = 'George';


// illustration
                 'Fred'


(obj) ---- {} ----- 'George'
             \
              \
               1

// code
obj = {};

// illustration
                 'Fred'


(obj)      {} ----- 'George'
  |          \
  |           \
 { }            1

// code
var obj = {
    text: 'Hello world!'
};

/* function parameters get their own pointer to 
 * the arguments that are passed in, just like any other variable */
someFunc(obj);


// illustration
(caller scope)        (someFunc scope)
           \             /
            \           /
             \         /
              \       /
               \     /
                 { }
                  |
                  |
                  |
            'Hello world'

Некоторые окончательные комментарии:

  • Заманчиво думать, что примитивы применяются специальными правилами, а объекты - нет, но примитивы просто конец цепочки указателей.
  • В качестве окончательного примера рассмотрим, почему общая попытка очистить массив работает не так, как ожидалось.

var a = [1,2];
var b = a;

a = [];
console.log(b); // [1,2]
// doesn't work because `b` is still pointing at the original array
108
задан DonGru 7 September 2010 в 15:57
поделиться

11 ответов

Это получит код страны :

 String locale = context.getResources().getConfiguration().locale.getCountry(); 

также может заменить getCountry () на getISO3Country () , чтобы получить 3-х буквенный ISO код для страны. Это получит имя страны :

 String locale = context.getResources().getConfiguration().locale.getDisplayCountry();

Это кажется более простым, чем другие методы, и полагаться на параметры локализации на телефоне, поэтому, если пользователь США находится за границей, они, вероятно, все еще хочу Фаренгейта, и это сработает :)

84
ответ дан stealthcopter 22 August 2018 в 06:58
поделиться
  • 1
    Это не будет работать в странах, для которых Android не имеет локали. Например, в Швейцарии язык, вероятно, будет установлен на немецкий или французский. Этот метод даст вам Германию или Францию, а не Швейцарию. Лучше использовать подход LocationManager или TelephonyManager. – MathewI 21 November 2011 в 18:53
  • 2
    Не работает. Я должен различать страну пользователей для всех латиноамериканских стран, все тестирующие телефоны вернули США, даже когда телефон находится на английском или испанском языке. – htafoya 26 June 2012 в 21:59
  • 3
    Этот не отвечает заголовком вопроса. Возможно, у меня есть телефон на английском языке и где-нибудь в мире (мой родной язык not Английский, но я do установил свой телефон на (английский) английский. Тем не менее, действительно отвечает на фактический вопрос , поскольку пользователь хочет, чтобы американские подразделения были американцами, где бы он ни находился на данный момент. – Jan Hudec 1 August 2013 в 13:40
  • 4
    Невозможное решение получить название страны – Aamirkhan 27 January 2014 в 12:26
  • 5
    context.getResources (). getConfiguration (). locale устарела – Mike6679 29 March 2017 в 15:19
String locale = context.getResources().getConfiguration().locale.getCountry(); 

Устаревший. Используйте это вместо:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = context.getResources().getConfiguration().getLocales().get(0);
} else {
    locale = context.getResources().getConfiguration().locale;
}
1
ответ дан 4gus71n 22 August 2018 в 06:58
поделиться

Я использовал GEOIP db и создал функцию. Вы можете использовать эту ссылку прямо http://jamhubsoftware.com/geoip/getcountry.php

{"country":["India"],"isoCode":["IN"],"names":[{"de":"Indien","en":"India","es":"India","fr":"Inde","ja":"\u30a4\u30f3\u30c9","pt-BR":"\u00cdndia","ru":"\u0418\u043d\u0434\u0438\u044f","zh-CN":"\u5370\u5ea6"}]}

вы можете скачать файлы autoload.php и .mmdb из https://dev.maxmind.com/geoip/geoip2/geolite2/
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$ip_address = $_SERVER['REMOTE_ADDR'];
//$ip_address = '3.255.255.255';

require_once 'vendor/autoload.php';

use GeoIp2\Database\Reader;

// This creates the Reader object, which should be reused across
// lookups.
$reader = new Reader('/var/www/html/geoip/GeoLite2-City.mmdb');

// Replace "city" with the appropriate method for your database, e.g.,
// "country".
$record = $reader->city($ip_address);

//print($record->country->isoCode . "\n"); // 'US'
//print($record->country->name . "\n"); // 'United States'
$rows['country'][] = $record->country->name;
$rows['isoCode'][] = $record->country->isoCode;
$rows['names'][] = $record->country->names;
print json_encode($rows);
//print($record->country->names['zh-CN'] . "\n"); // '美国'
//
//print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
//print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
//
//print($record->city->name . "\n"); // 'Minneapolis'
//
//print($record->postal->code . "\n"); // '55455'
//
//print($record->location->latitude . "\n"); // 44.9733
//print($record->location->longitude . "\n"); // -93.2323
?>
0
ответ дан arun-r 22 August 2018 в 06:58
поделиться
/**
 * Get ISO 3166-1 alpha-2 country code for this device (or null if not available)
 * @param context Context reference to get the TelephonyManager instance from
 * @return country code or null
 */
public static String getUserCountry(Context context) {
    try {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        final String simCountry = tm.getSimCountryIso();
        if (simCountry != null && simCountry.length() == 2) { // SIM country code is available
            return simCountry.toLowerCase(Locale.US);
        }
        else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { // device is not 3G (would be unreliable)
            String networkCountry = tm.getNetworkCountryIso();
            if (networkCountry != null && networkCountry.length() == 2) { // network country code is available
                return networkCountry.toLowerCase(Locale.US);
            }
        }
    }
    catch (Exception e) { }
    return null;
}
116
ответ дан caw 22 August 2018 в 06:58
поделиться
  • 1
    Идеально .. спасибо за обмен – Noman 24 November 2013 в 14:00
  • 2
    Работает только на телефонах или других устройствах с SIM-картой. При использовании на планшете WIFI вы получите нуль. Поэтому его полезность ограничена. – Bram 31 August 2015 в 19:38
  • 3
    @Bram Это все, что вы можете получить. Поэтому на самом деле это очень полезно, проблема в том, что у вас нет других надежных источников данных, если у вас есть планшет WiFi. – caw 26 October 2015 в 23:33
  • 4
    Обратите внимание: если пользователь из США находится в отпуске во Франции, getSimCountryIso скажет, что us и getNetworkCountryIso скажут fr – Tim Castelijns 6 April 2016 в 09:05
  • 5
    Вы можете изменить вызов toLowerCase() на toUpperCase(). – toobsco42 19 May 2016 в 08:07

На самом деле я только выяснил, что есть еще один способ получить код страны, используя метод getSimCountryIso () для TelephoneManager:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();

Так как это сим-код, он также не должны меняться при поездках в другие страны.

55
ответ дан DonGru 22 August 2018 в 06:58
поделиться
  • 1
    Это может не работать, если на устройстве нет SIM-карты, например, планшета – thomasdao 15 March 2013 в 05:22
  • 2
    Nexus также не работает без SIM-карты – Naruto 12 August 2016 в 08:20

Используя GPS с широтой и долготой, мы можем получить код страны.

Если мы используем телефонию, это не сработает, если мы не используем сим-карту и в локали, на основе языка, это неверный код страны.

MainActivity.java:

    GPSTracker gpsTrack;
    public static double latitude = 0;
    public static double longitude = 0;

    gpsTrack = new GPSTracker(TabHomeActivity.this);

        if (gpsTrack.canGetLocation()) {
            latitude = gpsParty.getLatitude();
            longitude = gpsParty.getLongitude();

            Log.e("GPSLat", "" + latitude);
            Log.e("GPSLong", "" + longitude);

        } else {
            gpsTrack.showSettingsAlert();

            Log.e("ShowAlert", "ShowAlert");

        }

        countryCode = getAddress(TabHomeActivity.this, latitude, longitude);

        Log.e("countryCode", ""+countryCode);

   public String getAddress(Context ctx, double latitude, double longitude) {
    String region_code = null;
    try {
        Geocoder geocoder = new Geocoder(ctx, Locale.getDefault());
        List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
        if (addresses.size() > 0) {
            Address address = addresses.get(0);


            region_code = address.getCountryCode();


        }
    } catch (IOException e) {
        Log.e("tag", e.getMessage());
    }

    return region_code;
}

GPSTracker.java:

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // flag for GPS status
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    /**
     * Function to get latitude
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * Function to check GPS/wifi enabled
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }



    public void showSettingsAlert() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        mContext.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        dialog.cancel();
                    }
                });
        final AlertDialog alert = builder.create();
        alert.show();
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}

Журнал:

E / countryCode: IN

Изменить: использовать Fused Location Provider , чтобы получить обновление широты и долготы для лучшего результата.

1
ответ дан Naruto 22 August 2018 в 06:58
поделиться
12
ответ дан Nativ 22 August 2018 в 06:58
поделиться

Вы можете использовать getNetworkCountryIso() из TelephonyManager , чтобы получить страну, в которой находится телефон (хотя, по-видимому, это ненадежно в сетях CDMA).

12
ответ дан Pedro Loureiro 22 August 2018 в 06:58
поделиться
  • 1
    это звучит довольно прямо и хорошо работает на эмуляторе в первом случае - не могли бы вы просто объяснить, почему он ненадежен в сетях CDMA? – DonGru 7 September 2010 в 16:33
  • 2
    ах ладно, я понял - потому что документация говорит так :) – DonGru 7 September 2010 в 16:50
  • 3
    Из-за применения это не будет лучшим решением, так как когда пользователь выезжает за границу, их блок по умолчанию будет меняться. Было бы разумнее иметь статический блок по умолчанию, основанный на настройках локали телефонов, который затем, конечно, может быть изменен в настройке где-нибудь. – stealthcopter 7 September 2010 в 16:51

Сначала запустите LocationManager. Затем вызовите LocationManager.getLastKnownPosition. Затем создайте GeoCoder и вызовите GeoCoder.getFromLocation. Сделайте это в отдельном потоке! Это даст вам список объектов Address. Вызовите Address.getCountryName, и вы его получили.

Имейте в виду, что последняя известная позиция может быть немного устаревшей, поэтому, если пользователь просто пересек границу, вы можете не знать об этом какое-то время.

32
ответ дан Sharp Edge 22 August 2018 в 06:58
поделиться
  • 1
    Для этого приложения изменение единицы по умолчанию было бы нежелательным при перемещении стран, поскольку предпочтение пользователя по Цельсию или Фаренгейту не изменится, поскольку он рискует новыми землями. – stealthcopter 7 September 2010 в 16:53
  • 2
    Мне нужно знать, в какой стране мой пользователь для вызова API. Вызов возвращает местоположения в окрестностях. Поэтому меня интересует только реальный код страны, в котором пользователь находится прямо сейчас. Просто для того, чтобы дать представление о том, что может потребоваться для вышеупомянутого подхода. – vinzenzweber 7 March 2011 в 08:58
  • 3
    Это очень высоко оценивается, но факт в том, что это самое надежное решение. Большинство вышеперечисленных выше не работают для Wi-Fi сети. Тот, который предоставляется @shine_joseph, выглядит хорошо, но api предоставлен не для коммерческого использования. – Gem 4 July 2016 в 06:27

Используйте эту ссылку http://ip-api.com/json , это предоставит всю информацию как json. Из этого json вы можете легко получить страну. Этот сайт работает с использованием вашего текущего IP-адреса, он автоматически обнаруживает информацию о IP-адресе и передаче.

Docs http://ip-api.com/docs/api:json Надеюсь, что это поможет .

Пример json

{
  "status": "success",
  "country": "United States",
  "countryCode": "US",
  "region": "CA",
  "regionName": "California",
  "city": "San Francisco",
  "zip": "94105",
  "lat": "37.7898",
  "lon": "-122.3942",
  "timezone": "America/Los_Angeles",
  "isp": "Wikimedia Foundation",
  "org": "Wikimedia Foundation",
  "as": "AS14907 Wikimedia US network",
  "query": "208.80.152.201"
}

note: Поскольку это стороннее решение, используйте его только в том случае, если другие не работают.

52
ответ дан shine_joseph 22 August 2018 в 06:58
поделиться
  • 1
    – JohnnyLambada 16 January 2015 в 01:06
  • 2
    – Manish Kataria 22 April 2015 в 15:00
  • 3
    Несмотря на то, что, как вы указали, это не может быть лучшим подходом к проблеме, он фактически обеспечивает правильное решение. +1 от меня и спасибо! – Matteo 28 April 2016 в 06:29
  • 4
    Всегда полезно использовать третьи стороны, вы никогда не знаете, насколько они стабильны. например, Parse. – Nativ 22 May 2016 в 10:57
  • 5
    Да. Вот почему это не рекомендуемое решение. Но это простой подход. – shine_joseph 23 May 2016 в 06:36

Для некоторых устройств, если язык по умолчанию установлен разным (индиец может установить английский (США)), тогда

#include <iostream>
#include <math.h>
#include <vector>
#include <ostream>

using namespace std;

struct Point {
    int x,y;
};

int distance (const Point& a,const Point& b){
    int k= sqrt(((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));
}

int main(){
    return 0;
}

выдаст неверное значение. Так что этот метод ненадежен

[g2] Кроме того, метод getNetworkCountryIso () в TelephonyManager не будет работать на устройствах без SIM-карты (планшеты WIFI). [/g2] [g3] Если на устройстве нет SIM-карты, мы можем использовать часовой пояс для получить страну. Для таких стран, как Индия, этот метод будет работать с примером кода [/g3] [g4], который используется для проверки того, является ли страна Индией или нет (идентификатор часового пояса: asia / calcutta) [/g4]
1>------ Build started: Project: distance, Configuration: Debug Win32 ------
1>  distance.cpp
1>d:\...\distance.cpp(13): error C2668: 'sqrt' : ambiguous call to overloaded function
1>          c:\...\vc\include\math.h(589): could be 'long double sqrt(long double)'
1>          c:\...\vc\include\math.h(541): or       'float sqrt(float)'
1>          c:\...\vc\include\math.h(127): or       'double sqrt(double)'
1>          while trying to match the argument list '(const int)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
ответ дан MarGin 5 November 2018 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: