मैं कहाँ हूँ? - यह जाओ


126

एक एंड्रॉइड मोबाइल वास्तव में अच्छी तरह से जानता है कि वह कहां है - लेकिन क्या देश कोड द्वारा देश को पुनः प्राप्त करने का एक तरीका है?

सटीक जीपीएस स्थिति जानने की आवश्यकता नहीं है - देश पर्याप्त है

मैंने पहले समय क्षेत्र का उपयोग करने के बारे में सोचा था, लेकिन वास्तव में मुझे इससे अधिक जानकारी की आवश्यकता है क्योंकि यह स्थान न्यूयॉर्क या लीमा है, इससे फर्क पड़ता है।

प्रश्न की पृष्ठभूमि: मेरे पास एक एप्लिकेशन है जो तापमान मानों का उपयोग करता है, और मैं डिफ़ॉल्ट इकाई को सेल्सियस या फ़ारेनहाइट पर सेट करना चाहता हूं, यह इस बात पर निर्भर करता है कि स्थान यूएस है या बाहर।


14
-1: आप निश्चित रूप से जानना नहीं चाहते हैं कि उपयोगकर्ता कहाँ है । आप उपयोगकर्ता की स्थानीय सेटिंग जानना चाहते हैं। स्वीकृत उत्तर बस यही उत्तर देता है, लेकिन अन्यथा यहां पूरी तरह से अनुचित है, क्योंकि खोज यहां उन लोगों को इंगित करेगी जो वास्तव में जानना चाहते हैं कि उपयोगकर्ता वास्तव में कहां है।
Jan Hudec

जवाबों:


96

इससे फोन के लिए देश कोड सेट हो जाएगा (फोन की भाषा, उपयोगकर्ता का स्थान नहीं):

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

getISO3Country () के साथ getCountry () को भी बदल सकते हैं ताकि देश के लिए 3 अक्षर का ISO कोड प्राप्त किया जा सके। इससे देश का नाम होगा :

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

यह अन्य विधियों की तुलना में आसान लगता है और फोन पर स्थानीयकरण सेटिंग्स पर निर्भर करता है, इसलिए यदि कोई अमेरिकी उपयोगकर्ता विदेश में है तो वे शायद फ़ारेनहाइट चाहते हैं और यह काम करेगा :)

संपादक ध्यान दें : इस समाधान का फोन के स्थान से कोई लेना-देना नहीं है। यह स्थिर है। जब आप जर्मनी के लिए यात्रा करेंगे तो स्थान नहीं बदलेगा। संक्षेप में: लोकेल! = स्थान।


83
यह उन देशों में काम नहीं करेगा जिनके लिए एंड्रॉइड में लोकेल नहीं है। उदाहरण के लिए, स्विट्जरलैंड में, भाषा जर्मन या फ्रेंच में सेट होने की संभावना है। यह तरीका आपको जर्मनी या फ्रांस देगा, स्विट्जरलैंड नहीं। स्थान प्रबंधक या टेलीफ़ोनी प्रबंधक दृष्टिकोण का उपयोग करने के लिए बेहतर है।
मैथ्यू

5
अच्छी तरह से काम नहीं करता है। मुझे सभी लैटिन अमेरिकी देशों के लिए उपयोगकर्ता देश को अलग करना होगा, सभी परीक्षण फोन यूएसए वापस आ गए हैं, भले ही फोन अंग्रेजी या स्पेनिश लैंग में हो।
htafoya

21
यह प्रश्न के शीर्षक का उत्तर नहीं देता है । मैं अंग्रेजी को फोन सेट हो सकता है और दुनिया में कहीं भी के बारे में हो सकता है (मेरे मूल भाषा है नहीं अंग्रेजी, लेकिन मैं ऐसा करने के लिए (ब्रिटिश) अंग्रेजी मेरे फोन सेट है। लेकिन यह वास्तविक सवाल का जवाब है , क्योंकि उपयोगकर्ता अमेरिका इकाइयों यदि चाहता है वह यूएसएयन है, जहां भी वह वास्तव में इस समय होता है।
जन हडेक

2
देश का नाम पाने के लिए संभव समाधान नहीं
आमिरखान

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
केवल सिम कार्ड के साथ फोन या अन्य उपकरणों पर काम करता है। एक वाईफ़ाई टैबलेट पर उपयोग करते समय, आप अशक्त हो जाएंगे। इसलिए इसकी उपयोगिता सीमित है।
ब्रम

1
@Bram यह सब आप प्राप्त कर सकते हैं। तो यह वास्तव में काफी उपयोगी है, समस्या केवल यह है कि आपके पास कोई अन्य विश्वसनीय डेटा स्रोत है यदि आपके पास केवल-वाईफाई टैबलेट है।
caw

11
ध्यान दें कि यदि संयुक्त राज्य अमेरिका का कोई उपयोगकर्ता फ्रांस में छुट्टी पर है, तो getSimCountryIsoवह कहेगा usऔर getNetworkCountryIsoकहेगाfr
टिम

1
आप toLowerCase()कॉल को बदलना चाह सकते हैं toUpperCase()
टॉब्स्को 42

मुझे कोड की आवश्यकता है कोड नाम नहीं; यूएसए +1 के लिए यूएस की तरह नहीं
शिहाब उद्दीन

67

इस लिंक का उपयोग करें http://ip-api.com/json , यह सभी जानकारी को json के रूप में प्रदान करेगा। इस जुबान से आप देश को आसानी से पा सकते हैं। यह साइट आपके वर्तमान आईपी का उपयोग करके काम करती है, यह स्वचालित रूप से आईपी और सेंडबैक विवरण का पता लगाती है।

डॉक्स 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"
}

नोट : जैसा कि यह एक 3 पार्टी समाधान है, केवल तभी उपयोग करें जब अन्य काम नहीं करते थे।


1
मुझे यकीन नहीं है कि यह वही है जो ओपी चाहता था, लेकिन मुझे वास्तव में वैसे भी जवाब पसंद है।
जॉनीलांबाडा

1
जवाब के बाद से यह टैबलेट (सिम के बिना) पर भी काम करेगा। टेलीफोनी समाधान सक्रिय सिम वाले फोन पर ही काम करता है। डुअल सिम फोन एक अन्य समस्या है क्योंकि वे विभिन्न देशों से हो सकते हैं। तो शायद यह ऊपर वर्णित आईपी समाधान पर भरोसा करने के लिए और अधिक समझ में आता है।
मनीष कटारिया

1
हालांकि, जैसा कि आपने बताया, यह समस्या के लिए सबसे अच्छा तरीका नहीं हो सकता है, यह वास्तव में एक वैध समाधान प्रदान करता है। +1 मुझसे और धन्यवाद!
माटेओ

1
तीसरे पक्ष का उपयोग करना हमेशा बुरा होता है, आप कभी नहीं जान सकते हैं कि वहां कितने स्थिर हैं। उदाहरण के लिए - Parse।
नैटिव

1
लेकिन इसकी सीमाएँ हैं। उनकी प्रणाली स्वचालित रूप से प्रति मिनट 150 से अधिक अनुरोधों को करने वाले किसी भी आईपी पते पर प्रतिबंध लगा देगी।
राम मंडल

62

असल में मैं सिर्फ पता चला है कि वहाँ एक भी एक देश कोड हो रही, की विधि getSimCountryIso () का उपयोग करने का अधिक रास्ता TelephoneManager:

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

चूंकि यह सिम कोड है इसलिए इसे अन्य देशों की यात्रा करते समय भी नहीं बदलना चाहिए।


43
जब डिवाइस में सिम कार्ड नहीं होता है तो यह काम नहीं कर सकता है, उदाहरण के लिए टैबलेट
थोमसडॉ

38

सबसे पहले, LocationManager प्राप्त करें। फिर, कॉल करें LocationManager.getLastKnownPosition। फिर एक जियोकोडर बनाएं और कॉल करें GeoCoder.getFromLocation। ऐसा करो एक अलग धागे में !! यह आपको Addressवस्तुओं की एक सूची देगा । बुलाओ Address.getCountryNameऔर तुम्हें मिल गया।

ध्यान रखें कि अंतिम ज्ञात स्थिति थोड़ी बासी हो सकती है, इसलिए यदि उपयोगकर्ता ने अभी सीमा पार की है, तो आपको इसके बारे में कुछ समय के लिए पता नहीं चल सकता है।


इस एप्लिकेशन के लिए डिफॉल्ट यूनिट को बदलना तब वांछित नहीं होगा जब देशों को सेल्सियस या फ़ारेनहाइट के उपयोगकर्ता की प्राथमिकता के रूप में बदल नहीं जाएगा क्योंकि वह नई भूमि के लिए उद्यम करता है।
स्टील्कोप्टर

मुझे यह पता होना चाहिए कि एपीआई कॉल के लिए मेरा उपयोगकर्ता किस देश में है। कॉल आसपास के क्षेत्र में स्थान देता है। इसलिए मैं केवल वास्तविक देश कोड में रुचि रखता हूं जो उपयोगकर्ता अभी है। बस एक अंतर्दृष्टि देने के लिए कि उपरोक्त दृष्टिकोण की आवश्यकता क्या हो सकती है।
विनजेनबेज़र

यह रेटेड एन्स के तहत अत्यधिक है, लेकिन तथ्य यह है कि यह सबसे विश्वसनीय समाधान है। ऊपर ans के अधिकांश वाईफाई नेटवर्क के लिए काम नहीं करते हैं। @Shine_joseph द्वारा प्रदान किया गया एक अच्छा लग रहा है, लेकिन उपलब्ध कराई गई व्यावसायिक उपयोग के लिए नहीं है।
मणि

सावधानी से प्रयोग करें। आपका डिवाइस नेटवर्क न होने पर भी आपको एक लोकेशन देगा, लेकिन जियोकोडर आमतौर पर एड्रेस एरे के लिए एक नल लौटा देगा यदि वाईफाई बंद है, तो एक अपवाद को उठाते हुए जिसे आपको कोशिश / पकड़ने की आवश्यकता होगी।
माइक क्रिचले

17

यहाँ LocationManager पर आधारित एक पूर्ण समाधान है और TelephonyManager और नेटवर्क प्रदाता के स्थानों पर कमियां हैं। मैंने @Marco W से उपरोक्त उत्तर का उपयोग फॉलबैक भाग (स्वयं के रूप में शानदार उत्तर) के लिए किया है।

नोट: कोड में PreferencesManager शामिल है, यह एक सहायक वर्ग है जो SharedPrefrences से डेटा बचाता और लोड करता है। मैं इसका उपयोग देश को S "P में सहेजने के लिए कर रहा हूं, मैं केवल देश को प्राप्त कर रहा हूं यदि यह खाली है। मेरे उत्पाद के लिए मैं वास्तव में सभी किनारे के मामलों की परवाह नहीं करता (उपयोगकर्ता विदेश यात्रा करता है और इसी तरह)।

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 या आप तर्क को समझ नहीं पाए। कृपया मुझे इस स्निपेट में अप्रयुक्त कोड का 1 उदाहरण दें
Nativ

2
बेशक, मैं तर्क को अनदेखा करता हूं और कृपया इसे गलत तरीके से न लें। मुझे लगता है कि PipplApp, PrefernoolsManager आदि को हटाया जा सकता है और प्रस्तावित समाधान पाठकों के लिए थोड़ा और अधिक स्पष्ट हो सकता है।
इहलोस

PiplApp के बारे में @ichalos मैं आपसे 100% सहमत हूं, मैं इसे हटा देता हूं
Nativ

नहीं है country = addresses.get(0).getCountryName();अपने कोड है, जो चर में देश का पूरा नाम रखा जाएगा में country। उसी समय विधि में getCountryBasedOnSimCardOrNetwork(Context context)आप देश का आईएसओ कोड लौटा रहे हैं। मुझे विश्वास है कि आप country = addresses.get(0).getCountryCode();:-)
फिरोजेन

15

आप उस देश से प्राप्त करने के लिए फोन का उपयोग कर सकते हैं getNetworkCountryIso()जोTelephonyManager वर्तमान में है (हालांकि स्पष्ट रूप से यह सीडीएमए नेटवर्क पर अविश्वसनीय है)।


यह बहुत सीधे लगता है और पहले उदाहरण में एमुलेटर पर अच्छी तरह से काम किया है - क्या आप सिर्फ यह बता सकते हैं कि यह सीडीएमए नेटवर्क पर अविश्वसनीय क्यों है?
DonGru

आह ठीक है, मैं समझ गया - क्योंकि प्रलेखन ऐसा कहता है :)
DonGru

आवेदन के कारण यह सबसे अच्छा समाधान नहीं होगा क्योंकि जब कोई उपयोगकर्ता विदेश यात्रा करता है तो उसकी डिफ़ॉल्ट इकाई बदल जाएगी। फोन लोकेल सेटिंग के आधार पर स्टैटिक डिफॉल्ट यूनिट का होना ज्यादा मायने रखता है, जो तब कहीं जाकर सेटिंग में बदला जा सकता है।
15

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
क्या उसे अनुमति की आवश्यकता है और वह किस देश को दिखाता है?
कूलमाइंड

4

कुछ उपकरणों के लिए, यदि डिफ़ॉल्ट भाषा अलग है (एक भारतीय अंग्रेजी (यूएस) सेट कर सकता है)

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

गलत मान देगा। तो यह विधि गैर विश्वसनीय है

इसके अलावा, TeleNonyManager का getNetworkCountryIso () तरीका उन डिवाइसों पर काम नहीं करेगा जिनमें सिम कार्ड (WIFI टैबलेट) नहीं हैं।

यदि किसी डिवाइस में सिम नहीं है तो हम देश को प्राप्त करने के लिए टाइम ज़ोन का उपयोग कर सकते हैं। भारत जैसे देशों के लिए, यह विधि काम करेगी

देश की जाँच करने के लिए इस्तेमाल किया गया नमूना कोड भारत है या नहीं (टाइम ज़ोन आईडी: एशिया / कलकत्ता)

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

अक्षांश और देशांतर के साथ जीपीएस का उपयोग करके, हम देश कोड प्राप्त कर सकते हैं।

यदि हम टेलीफोनी का उपयोग करते हैं, तो यह काम नहीं करेगा यदि हम सिम कार्ड का उपयोग नहीं कर रहे हैं और भाषा के आधार पर, यह देश कोड को गलत तरीके से दिखाता है।

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

}

लॉग इन करें:

ई / देशकोड: IN

संपादित करें: बेहतर परिणाम के लिए अक्षांश और देशांतर अद्यतन प्राप्त करने के लिए फ्यूज किए गए स्थान प्रदाता का उपयोग करें ।


GpsParty () क्या है? यह परिभाषित नहीं है
निकोला सी

-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"}]}

आप https://dev.maxmind.com/geoip/geoip2/geolite2/ से autoload.php और .mmdb फ़ाइल डाउनलोड कर सकते हैं

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
?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.