Wo bin ich? – Land holen

Ein Android-Handy weiß eigentlich ganz gut wo es ist – aber gibt es eine Möglichkeit, das Land durch so etwas wie ein Ländercode zu holen?

Keine Notwendigkeit, die genaue GPS-Position zu kennen – das Land ist ausreichend

Ich dachte zuerst daran, die Zeitzone zu benutzen, aber eigentlich brauche ich mehr Informationen als das, da es einen Unterschied macht, wenn die Lage New York oder Lima ist.

Der Hintergrund der Frage: Ich habe eine Anwendung, die Temperaturwerte verwendet, und ich möchte die Standard-Einheit entweder auf Celsius oder Fahrenheit, je nachdem, ob die Lage ist US oder außerhalb

  • Wie bekomme ich meinen Standort auf Google Maps für Android API v2
  • Google Maps Geolocation api: Zugriff nicht konfiguriert
  • FusedLocationApi.getLastLocation immer null
  • Wie suche ich in Google Map Api V2 Android?
  • Unit Testing Location Service
  • Berechnen der Geschwindigkeit für eine Navigations-App ohne getSpeed ​​() -Methode
  • Suche nach Standort mit MCC, MNC, LAC und Cell ID
  • Android Der Import com.google kann nicht aufgelöst werden
  • 10 Solutions collect form web for “Wo bin ich? – Land holen”

    Dies wird die Landesvorwahl erhalten :

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

    Kann auch getCountry () mit getISO3Country () ersetzen, um einen 3-Buchstaben-ISO-Code für das Land zu erhalten. Hier wird der Name des Landes erhalten :

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

    Das scheint einfacher als die anderen Methoden und verlassen sich auf die Lokalisierungseinstellungen am Telefon. Wenn also ein US-User im Ausland ist, dann wollen sie wohl noch Fahrenheit und das wird funktionieren 🙂

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

    Eigentlich habe ich gerade herausgefunden, dass es noch einen weiteren Weg gibt, einen Ländercode zu bekommen, mit der Methode getSimCountryIso () von TelephoneManager :

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

    Da es sich um den Sim-Code handelt, sollte man sich auch nicht ändern, wenn man in andere Länder reist.

    Verwenden Sie diesen Link http://ip-api.com/json , dies wird alle Informationen als json. Von diesem json können Sie das Land leicht zu bekommen. Diese Seite arbeitet mit deiner aktuellen IP, erkennt automatisch die IP- und Sendedetails.

    Docs http://ip-api.com/docs/api:json Hoffe, es hilft.

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

    NB : Bitte verwenden Sie das nicht als primäre Lösung

    Zuerst bekommst du den LocationManager. Anschließend rufen Sie LocationManager.getLastKnownPosition . Dann erstellen Sie einen GeoCoder und rufen Sie GeoCoder.getFromLocation . Ist das in einem separaten Thread !! Dies gibt Ihnen eine Liste von Address . Rufen Sie Address.getCountryName und Sie haben es.

    Denken Sie daran, dass die letzte bekannte Position ein bisschen veraltet sein kann, also wenn der Benutzer nur die Grenze überschritten hat, können Sie es nicht für eine Weile wissen.

    Sie könnten getNetworkCountryIso() von TelephonyManager , um das Land zu bekommen, in dem sich das Telefon befindet (obwohl anscheinend das bei CDMA-Netzwerken unzuverlässig ist).

    Hier ist eine komplette Lösung, die auf dem LocationManager basiert und als Fallbacks der TelephonyManager und die Standorte des Netzwerkanbieters. Ich habe die obige Antwort von @Marco W. für den Fallback Teil (große Antwort als sich selbst!).

    Hinweis: Der Code enthält PreferencesManager, das ist eine Hilfsklasse, die Daten aus SharedPrefrences speichert und lädt. Ich benutze es, um das Land in S "P zu retten, ich bekomme nur das Land, wenn es leer ist. Für mein Produkt kümmere ich mich nicht um alle Kantenfälle (User reist ins Ausland und so weiter).

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

    Mit GPS mit Breiten- und Längengrad können wir den Ländercode erhalten.

    Wenn wir telefonieren, wird es nicht funktionieren, wenn wir keine SIM-Karte verwenden und im Gebietsschema, basierend auf Sprache, zeigen sie den Ländercode falsch an.

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

    Log:

    E / countryCode: IN

    Bearbeiten: Verwenden Sie Fused Location Provider , um Breiten- und Längengrad für ein besseres Ergebnis zu erhalten.

    Ich habe GEOIP db benutzt und eine Funktion erstellt. Sie können diesen Link direkt verbrauchen 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"}]} 

    Sie können die Datei autoload.php und .mmdb von https://dev.maxmind.com/geoip/geoip2/geolite2/ herunterladen.

     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, eg, // "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 ?> 

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

    Ist veraltet. Verwenden Sie diese stattdessen:

     Locale locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { locale = context.getResources().getConfiguration().getLocales().get(0); } else { locale = context.getResources().getConfiguration().locale; } 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.