ฉันอยู่ที่ไหน? - รับประเทศ


126

มือถือ Android รู้ดีอยู่แล้วว่ามันอยู่ที่ไหน - แต่มีวิธีเรียกข้อมูลประเทศด้วยรหัสประเทศหรือไม่?

ไม่จำเป็นต้องรู้ตำแหน่ง GPS ที่แน่นอน - ประเทศก็เพียงพอแล้ว

ก่อนอื่นฉันคิดว่าจะใช้เขตเวลา แต่จริงๆแล้วฉันต้องการข้อมูลมากกว่านั้นเนื่องจากมันสร้างความแตกต่างหากสถานที่นั้นคือนิวยอร์กหรือลิมา

พื้นหลังของคำถาม:ฉันมีแอปพลิเคชันที่ใช้ค่าอุณหภูมิและฉันต้องการตั้งค่าหน่วยเริ่มต้นเป็นเซลเซียสหรือฟาเรนไฮต์ขึ้นอยู่กับว่าสถานที่นั้นอยู่ในสหรัฐอเมริกาหรือภายนอก


14
-1: คุณไม่ต้องการรู้แน่นอนว่าผู้ใช้อยู่ที่ไหน คุณต้องการทราบการตั้งค่าภาษาของผู้ใช้ คำตอบที่ได้รับการยอมรับจะตอบเพียงแค่นั้น แต่ก็ไม่เหมาะสมอย่างยิ่งที่นี่เพราะการค้นหาจะชี้ให้ผู้คนที่นี่ต้องการทราบว่าผู้ใช้อยู่ที่ไหน
ม.ค. Hudec

คำตอบ:


96

สิ่งนี้จะได้รับรหัสประเทศที่ตั้งไว้สำหรับโทรศัพท์ (ภาษาของโทรศัพท์ไม่ใช่ตำแหน่งของผู้ใช้):

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

ยังสามารถแทนที่ getCountry () ด้วยgetISO3Country ()เพื่อรับรหัส ISO 3 ตัวอักษรสำหรับประเทศ สิ่งนี้จะได้รับชื่อประเทศ :

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

วิธีนี้ดูเหมือนง่ายกว่าวิธีอื่น ๆ และอาศัยการตั้งค่าการแปลในโทรศัพท์ดังนั้นหากผู้ใช้ในสหรัฐอเมริกาอยู่ต่างประเทศพวกเขาอาจยังคงต้องการฟาเรนไฮต์และวิธีนี้จะได้ผล :)

หมายเหตุบรรณาธิการ : โซลูชันนี้ไม่เกี่ยวข้องกับตำแหน่งของโทรศัพท์ มันคงที่ เมื่อคุณเดินทางไปประเทศเยอรมนีจะไม่เปลี่ยนแปลง ในระยะสั้น: locale! = location


83
สิ่งนี้จะใช้ไม่ได้ในประเทศที่ Android ไม่มี Locale ตัวอย่างเช่นในสวิตเซอร์แลนด์ภาษามีแนวโน้มที่จะตั้งค่าเป็นเยอรมันหรือฝรั่งเศส วิธีนี้จะทำให้คุณได้เยอรมนีหรือฝรั่งเศสไม่ใช่สวิตเซอร์แลนด์ ควรใช้วิธี LocationManager หรือ TelephonyManager
MathewI

5
ทำงานได้ไม่ดี ฉันต้องแยกประเทศผู้ใช้สำหรับทุกประเทศในละตินอเมริกาโทรศัพท์ทดสอบทั้งหมดได้ส่งคืนสหรัฐอเมริกาแม้ว่าโทรศัพท์จะเป็นภาษาอังกฤษหรือภาษาสเปนก็ตาม
htafoya

21
สิ่งนี้ไม่ตอบโจทย์ในเรื่องของคำถาม ฉันอาจจะต้องตั้งค่าโทรศัพท์เป็นภาษาอังกฤษและจะเกี่ยวกับที่ใดก็ได้ในโลก (ภาษาพื้นเมืองของฉันคือไม่ได้ภาษาอังกฤษ แต่ผมทำมีชุดโทรศัพท์ของฉันไป (อังกฤษ) ภาษาอังกฤษ. แต่มันไม่ตอบคำถามที่เกิดขึ้นจริงเพราะผู้ใช้ต้องการสหรัฐอเมริกาหน่วยถ้า เขาเป็นชาวสหรัฐอเมริกาไม่ว่าเขาจะอยู่ที่ไหนในขณะนี้
Jan Hudec

2
ไม่ใช่ทางออกที่เป็นไปได้ในการรับชื่อประเทศ
Aamirkhan

2
เป็นคำตอบที่ดีโดยทั่วไป แต่จะส่งกลับเฉพาะประเทศของสถานที่นั้นไม่ใช่ประเทศจริง
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
ใช้งานได้กับโทรศัพท์หรืออุปกรณ์อื่น ๆ ที่มีซิมการ์ดเท่านั้น เมื่อใช้บนแท็บเล็ต WIFI คุณจะได้รับค่าว่าง ประโยชน์ของมันจึงมี จำกัด
Bram

1
@ แบรมนี่คือทั้งหมดที่คุณจะได้รับ ดังนั้นมันจึงมีประโยชน์มากปัญหาคือคุณไม่มีแหล่งข้อมูลที่เชื่อถือได้อื่น ๆ หากคุณมีแท็บเล็ต WiFi เท่านั้น
caw

11
โปรดทราบว่าหากผู้ใช้จากประเทศสหรัฐอเมริกาเป็นวันหยุดในประเทศฝรั่งเศสgetSimCountryIsoจะพูดusและgetNetworkCountryIsoจะพูดว่าfr
ทิม

1
คุณอาจต้องการที่จะเปลี่ยนการเรียกร้องให้toLowerCase() toUpperCase()
toobsco42

ฉันต้องการรหัสไม่ใช่ชื่อรหัส; Like for usa +1 ไม่ใช่ US
Shihab Uddin

67

ใช้ลิงค์นี้http://ip-api.com/json ซึ่งจะให้ข้อมูลทั้งหมดเป็น json จาก json นี้คุณสามารถรับประเทศได้อย่างง่ายดาย ไซต์นี้ทำงานโดยใช้ IP ปัจจุบันของคุณโดยจะตรวจจับ IP และรายละเอียดการส่งกลับโดยอัตโนมัติ

เอกสาร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"
}

หมายเหตุ : เนื่องจากนี่เป็นโซลูชันของบุคคลที่สามให้ใช้เฉพาะเมื่อผู้อื่นไม่ได้ผล


1
ฉันไม่แน่ใจว่านี่คือสิ่งที่ OP ต้องการ แต่ฉันก็ชอบคำตอบอยู่ดี
JohnnyLambada

1
เช่นเดียวกับคำตอบเนื่องจากสิ่งนี้จะใช้ได้กับแท็บเล็ต (ไม่มีซิม) เช่นกัน โซลูชันระบบโทรศัพท์ใช้งานได้กับโทรศัพท์ที่มีซิมที่ใช้งานอยู่ โทรศัพท์สองซิมเป็นอีกหนึ่งสถานการณ์ที่มีปัญหาเนื่องจากอาจมาจากประเทศต่างๆ ดังนั้นอาจเป็นเรื่องที่สมเหตุสมผลกว่าที่จะพึ่งพาโซลูชัน IP ที่กล่าวถึงข้างต้น
Manish Kataria

1
แม้ว่าตามที่คุณระบุไว้นี่อาจไม่ใช่แนวทางที่ดีที่สุดในการแก้ปัญหา แต่ก็เป็นวิธีแก้ปัญหาที่ถูกต้อง +1 จากฉันและขอขอบคุณ!
Matteo

1
การใช้บุคคลที่สามเป็นเรื่องไม่ดีเสมอไปคุณไม่มีทางรู้ได้เลยว่ามีความเสถียรเพียงใด ตัวอย่างเช่น - แยกวิเคราะห์
Nativ

1
แต่ก็มีข้อ จำกัด ระบบของพวกเขาจะแบนที่อยู่ IP ใด ๆ ที่มีคำขอมากกว่า 150 คำขอต่อนาทีโดยอัตโนมัติ
Ram Mandal

62

อันที่จริงฉันเพิ่งค้นพบว่ามีอีกวิธีหนึ่งในการรับรหัสประเทศโดยใช้เมธอด getSimCountryIso () ของTelephoneManager:

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

เนื่องจากเป็นรหัสซิมจึงไม่ควรเปลี่ยนเมื่อเดินทางไปยังประเทศอื่น


43
สิ่งนี้อาจใช้ไม่ได้เมื่ออุปกรณ์ไม่มีซิมการ์ดเช่นแท็บเล็ต
thomasdao

38

ขั้นแรกให้รับ LocationManager จากนั้นโทรLocationManager.getLastKnownPosition. แล้วสร้าง Geocoder GeoCoder.getFromLocationและโทร ทำแบบนี้แยกกระทู้ !! นี่จะให้รายการAddressวัตถุ โทรAddress.getCountryNameและคุณได้รับมัน

โปรดทราบว่าตำแหน่งที่ทราบล่าสุดอาจค่อนข้างเก่าดังนั้นหากผู้ใช้เพิ่งข้ามพรมแดนคุณอาจไม่ทราบเกี่ยวกับตำแหน่งนั้นไปชั่วขณะ


สำหรับแอปพลิเคชันนี้การเปลี่ยนหน่วยเริ่มต้นจะไม่เป็นที่ต้องการเมื่อย้ายประเทศเนื่องจากความชอบของผู้ใช้ที่เป็นเซลเซียสหรือฟาเรนไฮต์จะไม่เปลี่ยนแปลงเมื่อเขาเดินทางไปยังดินแดนใหม่
stealthcopter

ฉันต้องการทราบว่าผู้ใช้ของฉันใช้การเรียก API ในประเทศใด การโทรส่งคืนตำแหน่งในพื้นที่โดยรอบ ดังนั้นฉันจึงสนใจเฉพาะรหัสประเทศจริงที่ผู้ใช้อยู่ในขณะนี้ เพียงเพื่อให้เข้าใจถึงสิ่งที่จำเป็นสำหรับแนวทางข้างต้น
vinzenzweber

นี่อยู่ภายใต้การจัดอันดับ ans สูง แต่ความจริงแล้วนี่คือโซลูชันที่น่าเชื่อถือที่สุด Ans ส่วนใหญ่ข้างต้นใช้ไม่ได้กับเครือข่าย wifi อันนี้จัดทำโดย @shine_joseph ดูดี แต่ api ที่ให้มาไม่ได้ใช้เพื่อการค้า
อัญมณี

ใช้ด้วยความระมัดระวัง อุปกรณ์ของคุณจะระบุตำแหน่งให้คุณแม้ว่าจะไม่ได้เชื่อมต่อกับเครือข่าย แต่ Geocoder จะส่งคืนค่าว่างสำหรับอาร์เรย์ที่อยู่หากปิด wifi ซึ่งจะเพิ่มข้อยกเว้นที่คุณจะต้องลอง / จับ
Mike Critchley

17

นี่คือโซลูชันที่สมบูรณ์โดยอิงตาม LocationManager และเป็นทางเลือกแทน TelephonyManager และตำแหน่งของผู้ให้บริการเครือข่าย ฉันใช้คำตอบข้างต้นจาก @Marco W. สำหรับส่วนทางเลือก (คำตอบที่ยอดเยี่ยมสำหรับตัวมันเอง!)

หมายเหตุ: โค้ดนี้มี PreferencesManager ซึ่งเป็นคลาสตัวช่วยที่บันทึกและโหลดข้อมูลจาก SharedPrefrences ฉันกำลังใช้มันเพื่อช่วยประเทศเป็น S "P ฉันจะได้รับประเทศถ้ามันว่างเท่านั้นสำหรับผลิตภัณฑ์ของฉันฉันไม่ได้สนใจอะไรเลยสำหรับกรณี edge ทั้งหมด (ผู้ใช้เดินทางไปต่างประเทศเป็นต้น)

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
ขออภัยคำตอบของคุณจำเป็นต้องเขียนใหม่ รหัสนี้มีรหัสที่ใช้ไม่ได้จำนวนมาก
ichalos

@ichalos หรือคุณไม่เข้าใจตรรกะ โปรดยกตัวอย่างรหัสที่ไม่ได้ใช้ 1 ตัวอย่างในข้อมูลโค้ดนี้
Nativ

2
แน่นอนฉันเลิกปฏิเสธตรรกะนี้และโปรดอย่าใช้ในทางที่ผิด ฉันพูดถึงว่า PipplApp, PrefernecesManager และอื่น ๆ อาจถูกลบออกและโซลูชันที่นำเสนออาจชัดเจนสำหรับผู้อ่านมากขึ้น
ichalos

@ichalos เกี่ยวกับ PiplApp ฉันเห็นด้วยกับคุณ 100% ฉันเพิ่งลบออก
Nativ

นอกจากนี้ในรหัสของคุณซึ่งจะใส่ชื่อเต็มของประเทศลงในตัวแปรcountry = addresses.get(0).getCountryName(); countryในเวลาเดียวกันgetCountryBasedOnSimCardOrNetwork(Context context)คุณกำลังส่งคืนรหัส ISO ของประเทศ ฉันเชื่อว่าคุณต้องการเขียนcountry = addresses.get(0).getCountryCode();:-)
Firzen

15

คุณสามารถใช้getNetworkCountryIso()จากTelephonyManagerเพื่อรับประเทศที่โทรศัพท์อยู่ในขณะนี้ (แม้ว่าจะเห็นได้ชัดว่าสิ่งนี้ไม่น่าเชื่อถือในเครือข่าย CDMA)


ฟังดูตรงไปตรงมาและทำงานได้ดีที่ตัวจำลองในกรณีแรกคุณช่วยอธิบายได้ไหมว่าทำไมเครือข่าย CDMA จึงไม่น่าเชื่อถือ
DonGru

โอเคฉันเข้าใจแล้ว - เพราะเอกสารบอกอย่างนั้น :)
DonGru

เนื่องจากแอปพลิเคชันนี้จะไม่ใช่ทางออกที่ดีที่สุดเนื่องจากเมื่อผู้ใช้เดินทางไปต่างประเทศหน่วยเริ่มต้นจะเปลี่ยนไป มันจะสมเหตุสมผลกว่าที่จะมีหน่วยเริ่มต้นแบบคงที่ตามการตั้งค่าตำแหน่งที่ตั้งของโทรศัพท์ซึ่งแน่นอนว่าสามารถเปลี่ยนแปลงได้ในการตั้งค่าที่ไหนสักแห่ง
stealthcopter

5
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
ต้องได้รับอนุญาตหรือไม่และประเทศใดแสดง?
CoolMind

4

สำหรับอุปกรณ์บางอย่างหากตั้งค่าภาษาเริ่มต้นแตกต่างกัน (ชาวอินเดียสามารถตั้งค่าภาษาอังกฤษ (US)) ได้

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

จะให้ค่าผิดดังนั้นวิธีนี้จึงไม่น่าเชื่อถือ

นอกจากนี้ getNetworkCountryIso () วิธีการของ TelephonyManager จะไม่ทำงานบนอุปกรณ์ที่ไม่มีซิมการ์ด (แท็บเล็ต WIFI)

หากอุปกรณ์ไม่มีซิมเราสามารถใช้ Time Zone เพื่อรับประเทศได้ สำหรับประเทศเช่นอินเดียวิธีนี้จะใช้ได้ผล

รหัสตัวอย่างที่ใช้ตรวจสอบประเทศคืออินเดียหรือไม่ (รหัสเขตเวลา: asia / 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
ความคิดที่ดี แต่เขตเวลาไม่ใช่คุณลักษณะเฉพาะของประเทศที่คุณรู้จักใช่ไหม สำหรับเมอริเดียนทุกๆ 15 องศาจะมีเขตเวลาอื่นเป็นต้น
ฮัน

3

ใช้ 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เพื่อรับการอัปเดตละติจูดและลองจิจูดเพื่อผลลัพธ์ที่ดีขึ้น


gpsParty () คืออะไร? ไม่ได้กำหนดไว้
Nikola C

-2

ฉันใช้ 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
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.