Tôi đang ở đâu - Lấy nước


126

Một điện thoại di động Android thực sự biết khá rõ nó ở đâu - nhưng có cách nào lấy lại đất nước bằng một thứ giống như mã quốc gia không?

Không cần biết vị trí GPS chính xác - quốc gia là đủ

Đầu tiên tôi nghĩ đến việc sử dụng múi giờ, nhưng thực sự tôi cần nhiều thông tin hơn vì nó tạo ra sự khác biệt nếu địa điểm là New York hoặc Lima.

Bối cảnh của câu hỏi: Tôi có một ứng dụng sử dụng các giá trị nhiệt độ và tôi muốn đặt đơn vị mặc định thành Celsius hoặc Fahrenheit, tùy thuộc vào vị trí đó là Hoa Kỳ hay bên ngoài


14
-1: Bạn chắc chắn không muốn biết người dùng đang ở đâu . Bạn muốn biết cài đặt ngôn ngữ của người dùng. Câu trả lời được chấp nhận chỉ trả lời như vậy, nhưng ở đây hoàn toàn không phù hợp, bởi vì tìm kiếm sẽ chỉ ra những người ở đây thực sự muốn biết người dùng thực sự ở đâu.
Jan Hudec

Câu trả lời:


96

Điều này sẽ lấy mã quốc gia được đặt cho điện thoại (ngôn ngữ điện thoại, KHÔNG phải vị trí người dùng):

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

cũng có thể thay thế getCountry () bằng getISO3Country () để lấy mã ISO 3 chữ cái cho quốc gia. Điều này sẽ có được tên quốc gia :

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

Điều này có vẻ dễ dàng hơn các phương pháp khác và dựa vào cài đặt nội địa hóa trên điện thoại, vì vậy nếu người dùng ở Mỹ ở nước ngoài, họ có thể vẫn muốn Fahrenheit và điều này sẽ hoạt động :)

Biên tập viên lưu ý : Giải pháp này không liên quan gì đến vị trí của điện thoại. Nó là không đổi. Khi bạn đi du lịch đến địa phương Đức sẽ KHÔNG thay đổi. Tóm lại: miền địa phương! = Vị trí.


83
Điều này sẽ không hoạt động ở các quốc gia mà Android không có Địa điểm. Ví dụ, ở Thụy Sĩ, ngôn ngữ có thể được đặt thành tiếng Đức hoặc tiếng Pháp. Phương pháp này sẽ cung cấp cho bạn Đức hoặc Pháp, không phải Thụy Sĩ. Tốt hơn nên sử dụng phương pháp LocationManager hoặc TelephonyManager.
MathewI

5
Không hoạt động tốt. Tôi phải phân biệt quốc gia người dùng cho tất cả các quốc gia Mỹ Latinh, tất cả các điện thoại thử nghiệm đã quay trở lại Hoa Kỳ ngay cả khi điện thoại bằng tiếng Anh hoặc tiếng Tây Ban Nha.
htafoya

21
Đây không trả lời các tiêu đề của câu hỏi. Tôi có thể có các thiết lập điện thoại sang tiếng Anh và được về bất cứ nơi nào trên thế giới (ngôn ngữ mẹ đẻ của tôi là không bằng tiếng Anh, nhưng tôi làm có thiết lập điện thoại của tôi để (Anh) bằng tiếng Anh. Tuy nhiên nó không trả lời câu hỏi thực tế , bởi vì người dùng muốn đơn vị Hoa Kỳ nếu Anh ấy là người Mỹ, bất cứ nơi nào anh ấy thực sự đến vào lúc này.
Jan Hudec

2
Không phải là giải pháp khả thi để có được tên quốc gia
Aamirkhan

2
Đó là một câu trả lời tốt nói chung nhưng nó chỉ trả về đất nước của địa phương, không phải là quốc gia thực tế.
dst

138
/**
 * 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;
}

14
Chỉ hoạt động trên điện thoại hoặc các thiết bị khác có thẻ sim. Khi sử dụng trên máy tính bảng WIFI, bạn sẽ nhận được null. Vì vậy, tính hữu dụng của nó là hạn chế.
Bram

1
@Bram Đây là tất cả những gì bạn có thể nhận được. Vì vậy, nó thực sự khá hữu ích, vấn đề chỉ là bạn không có nguồn dữ liệu đáng tin cậy nào khác nếu bạn có máy tính bảng chỉ có WiFi.
caw

11
Lưu ý rằng nếu một người dùng từ Hoa Kỳ đang đi nghỉ ở Pháp, getSimCountryIsosẽ nói usgetNetworkCountryIsosẽ nóifr
Tim

1
Bạn có thể muốn thay đổi toLowerCase()cuộc gọi thành toUpperCase().
toobsco42

Tôi cần Mã không phải Mã Tên; Giống như cho usa +1 không phải Hoa Kỳ
Shihab Uddin

67

Sử dụng liên kết này http://ip-api.com/json , điều này sẽ cung cấp tất cả thông tin dưới dạng json. Từ json này, bạn có thể có được đất nước dễ dàng. Trang web này hoạt động bằng IP hiện tại của bạn, nó tự động phát hiện chi tiết IP và gửi lại.

Tài liệu http://ip-api.com/docs/api:json Hy vọng nó có ích.

Ví dụ 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"
}

lưu ý : Vì đây là giải pháp của bên thứ 3, chỉ sử dụng nếu những người khác không làm việc.


1
Tôi không chắc đây là chính xác những gì OP muốn, nhưng dù sao thì tôi cũng thực sự thích câu trả lời.
JohnnyLambada

1
Giống như câu trả lời vì điều này cũng sẽ hoạt động trên máy tính bảng (không có sim). Giải pháp điện thoại chỉ hoạt động trên điện thoại có sim hoạt động. Điện thoại hai sim là một kịch bản vấn đề khác vì chúng có thể đến từ các quốc gia khác nhau. Vì vậy, có lẽ nó có ý nghĩa hơn để dựa vào giải pháp IP được đề cập ở trên.
Manish Kataria

1
Mặc dù, như bạn đã chỉ ra, đây có thể không phải là cách tiếp cận tốt nhất cho vấn đề, nó thực sự cung cấp một giải pháp hợp lệ. +1 từ tôi và cảm ơn bạn!
Matteo

1
Việc sử dụng bên thứ ba luôn là điều tồi tệ, bạn không bao giờ có thể biết mức độ ổn định của nó. ví dụ - Phân tích cú pháp.
Nativ

1
nhưng nó có những hạn chế. hệ thống của họ sẽ tự động cấm mọi địa chỉ IP thực hiện hơn 150 yêu cầu mỗi phút.
Ram Mandal

62

Trên thực tế tôi chỉ phát hiện ra rằng thậm chí còn có một cách khác để lấy mã quốc gia, sử dụng phương thức getSimCountryIso () của TelephoneManager:

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

Vì là mã sim nên nó cũng không nên thay đổi khi đi du lịch các nước khác.


43
Điều này có thể không hoạt động khi thiết bị không có thẻ SIM, ví dụ: máy tính bảng
thomasdao 15/03/13

38

Đầu tiên, lấy LocationManager. Sau đó, gọi LocationManager.getLastKnownPosition. Sau đó tạo GeoCoder và gọi GeoCoder.getFromLocation. Làm điều này là trong một chủ đề riêng biệt !! Điều này sẽ cung cấp cho bạn một danh sách các Addressđối tượng. Gọi Address.getCountryNamevà bạn đã nhận nó.

Hãy nhớ rằng vị trí được biết đến cuối cùng có thể hơi cũ, vì vậy nếu người dùng chỉ vượt qua biên giới, bạn có thể không biết về nó trong một thời gian.


Đối với ứng dụng này, việc thay đổi đơn vị mặc định sẽ không được mong muốn khi di chuyển các quốc gia vì sở thích của người dùng là Celsius hoặc Fahrenheit sẽ không thay đổi khi anh ta mạo hiểm đến vùng đất mới.
tàng hình

Tôi cần biết người dùng của mình tham gia cuộc gọi API ở quốc gia nào. Cuộc gọi trả về các địa điểm trong khu vực xung quanh. Do đó, tôi chỉ quan tâm đến mã quốc gia thực sự mà người dùng đang sử dụng ngay bây giờ. Chỉ cần cung cấp một cái nhìn sâu sắc những gì cách tiếp cận trên có thể cần thiết cho.
vinzenzweber

Điều này được đánh giá rất cao, nhưng thực tế đây là giải pháp đáng tin cậy nhất. Hầu hết các ans ở trên không hoạt động cho mạng wifi. Cái được cung cấp bởi @light_joseph có vẻ tốt nhưng api được cung cấp không dành cho mục đích thương mại.
Đá quý

Sử dụng cẩn thận. Thiết bị của bạn sẽ cung cấp cho bạn một vị trí ngay cả khi không được nối mạng, nhưng Geocoder thường sẽ trả về null cho mảng địa chỉ nếu wifi bị tắt, đưa ra một ngoại lệ mà bạn sẽ cần thử / bắt.
Mike Critchley

17

Đây là một giải pháp hoàn chỉnh dựa trên Trình quản lý vị trí và khi dự phòng các vị trí của TelephonyManager và Nhà cung cấp mạng. Tôi đã sử dụng câu trả lời trên từ @Marco W. cho phần dự phòng (câu trả lời tuyệt vời như chính nó!).

Lưu ý: mã chứa PreferencesManager, đây là lớp trình trợ giúp lưu và tải dữ liệu từ SharedPrefrences. Tôi đang sử dụng nó để cứu đất nước thành S "P, tôi chỉ nhận được quốc gia nếu nó trống. Đối với sản phẩm của tôi, tôi không thực sự quan tâm đến tất cả các trường hợp cạnh (người dùng đi du lịch nước ngoài, v.v.).

public static String getCountry(Context context) {
    String country = PreferencesManager.getInstance(context).getString(COUNTRY);
    if (country != null) {
        return country;
    }

    LocationManager locationManager = (LocationManager) PiplApp.getInstance().getSystemService(Context.LOCATION_SERVICE);
    if (locationManager != null) {
        Location location = locationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location == null) {
            location = locationManager
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        }
        if (location == null) {
            log.w("Couldn't get location from network and gps providers")
            return
        }
        Geocoder gcd = new Geocoder(context, Locale.getDefault());
        List<Address> addresses;
        try {
            addresses = gcd.getFromLocation(location.getLatitude(),
                    location.getLongitude(), 1);

            if (addresses != null && !addresses.isEmpty()) {
                country = addresses.get(0).getCountryName();
                if (country != null) {
                    PreferencesManager.getInstance(context).putString(COUNTRY, country);
                    return country;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    country = getCountryBasedOnSimCardOrNetwork(context);
    if (country != null) {
        PreferencesManager.getInstance(context).putString(COUNTRY, country);
        return country;
    }
    return null;
}


/**
 * 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
 */
private static String getCountryBasedOnSimCardOrNetwork(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;
}

4
Xin lỗi, nhưng câu trả lời của bạn thực sự cần phải viết lại. Mã này chứa rất nhiều mã không sử dụng được.
ichalos

@ichalos hoặc bạn không hiểu logic. Vui lòng cho tôi 1 ví dụ về mã không được sử dụng trong đoạn trích này
Nativ

2
Tất nhiên tôi làm mất logic và làm ơn đừng hiểu sai. Tôi nghĩ rằng PipplApp, PrefernecesManager, vv có thể đã bị xóa và giải pháp được cung cấp có thể rõ ràng hơn một chút cho độc giả.
ichalos

@ichalos về PiplApp Tôi đồng ý 100% với bạn, tôi chỉ cần xóa nó
Nativ

country = addresses.get(0).getCountryName();trong mã của bạn, sẽ đặt tên đầy đủ của quốc gia thành biến country. Đồng thời trong phương thức getCountryBasedOnSimCardOrNetwork(Context context)bạn đang trả về mã ISO của quốc gia. Tôi tin rằng bạn muốn viết country = addresses.get(0).getCountryCode();:-)
Firzen

15

Bạn có thể sử dụng getNetworkCountryIso()từTelephonyManager để lấy quốc gia mà điện thoại hiện đang ở (mặc dù rõ ràng điều này không đáng tin cậy trên các mạng CDMA).


nghe có vẻ khá thẳng về phía trước và hoạt động tốt tại trình giả lập trong trường hợp đầu tiên - bạn có thể giải thích tại sao nó không đáng tin cậy trên các mạng CDMA không?
DonGru

ah được rồi, tôi hiểu rồi - vì tài liệu nói vậy :)
DonGru

Do ứng dụng này sẽ không phải là giải pháp tốt nhất vì khi người dùng đi ra nước ngoài, đơn vị mặc định của họ sẽ thay đổi. Sẽ có ý nghĩa hơn khi có một đơn vị mặc định tĩnh dựa trên cài đặt ngôn ngữ của điện thoại, sau đó tất nhiên có thể được thay đổi trong một cài đặt ở đâu đó.
tàng hình

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

Bị phản đối. Sử dụng cái này thay thế:

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
Nó có yêu cầu sự cho phép và những gì nó thể hiện?
CoolMind

4

Đối với một số thiết bị, nếu ngôn ngữ mặc định được đặt khác (tiếng Ấn Độ có thể đặt tiếng Anh (Hoa Kỳ)) thì

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

sẽ cho giá trị sai. Vì vậy, phương pháp này không đáng tin cậy

Ngoài ra, phương thức TelephonyManager của getNetworkCountryIso () sẽ không hoạt động trên các thiết bị không có thẻ SIM (máy tính bảng WIFI).

Nếu một thiết bị không có SIM thì chúng ta có thể sử dụng Múi giờ để lấy quốc gia. Đối với các nước như Ấn Độ, phương pháp này sẽ hiệu quả

mã mẫu được sử dụng để kiểm tra quốc gia có phải là Ấn Độ hay không (Id múi giờ: á / calcutta)

private void checkCountry() {


    TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    if (telMgr == null)
        return;

    int simState = telMgr.getSimState();

    switch (simState) {
        //if sim is not available then country is find out using timezone id
        case TelephonyManager.SIM_STATE_ABSENT:
            TimeZone tz = TimeZone.getDefault();
            String timeZoneId = tz.getID();
            if (timeZoneId.equalsIgnoreCase(Constants.INDIA_TIME_ZONE_ID)) {
               //do something
            } else {
               //do something
            }
            break;

            //if sim is available then telephony manager network country info is used
        case TelephonyManager.SIM_STATE_READY:

           TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
            if (tm != null) {
                String countryCodeValue = tm.getNetworkCountryIso();
                //check if the network country code is "in"
                if (countryCodeValue.equalsIgnoreCase(Constants.NETWORK_INDIA_CODE)) {
                   //do something
                }

                else {
                   //do something
                }

            }
            break;

    }
}

1
ý tưởng hay nhưng múi giờ không phải là một tính năng cụ thể của quốc gia mà bạn biết phải không? Cứ 15 độ kinh tuyến thì có một múi giờ khác, v.v.
Gunhan

3

Sử dụng GPS với vĩ độ và kinh độ, chúng ta có thể nhận được mã Quốc gia.

Nếu chúng tôi sử dụng điện thoại, nó sẽ không hoạt động nếu chúng tôi không sử dụng thẻ sim và tại địa phương, dựa trên ngôn ngữ, nó hiển thị mã quốc gia sai cách.

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;
    }

}

Nhật ký:

E / countryCode: IN

Chỉnh sửa: Sử dụng Nhà cung cấp vị trí hợp nhất để cập nhật vĩ độ và kinh độ để có kết quả tốt hơn.


GpsParty () là gì? Nó không được xác định
Nikola C

-2

Tôi đã sử dụng GEOIP db và tạo một hàm. Bạn có thể sử dụng liên kết này trực tiếp 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"}]}

bạn có thể tải xuống tệp autoload.php và .mmdb từ 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
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.