web-dev-qa-db-fra.com

Comment obtenir l'emplacement du pays de l'utilisateur?

En raison du RGPD, je dois vérifier l'emplacement des utilisateurs si l'utilisateur est de l'Union européenne. Jusqu'à présent, j'ai trouvé ces solutions -

1) Obtenir le pays en utilisant la configuration linguistique du téléphone ( Peut induire en erreur si l'utilisateur utilise la version anglaise des États-Unis, même s'il peut provenir d'un autre pays ).

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

2) Obtenir la position à l'aide du GPS ( Nécessite l'autorisation Location Corse que je ne veux pas ajouter en particulier à cause de Android 6.0+ autorisations d'exécution ).

    private void getCountryCode(final Location location) {
    Helper.log(TAG, "getCountryCode");

    AsyncTask<Void, Void, String> countryCodeTask = new AsyncTask<Void, Void, String>() {

        final float latitude = (float) location.getLatitude();
        final float longitude = (float) location.getLongitude();
        // Helper.log(TAG, "latitude: " +latitude);
        List<Address> addresses = null;
        Geocoder gcd = new Geocoder(mContext);
        String code = null;

        @Override
        protected String doInBackground(Void... params) {
            try {
                addresses = gcd.getFromLocation(latitude, longitude, 1);
                code = addresses.get(0).getCountryCode();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return code;
        }

        @Override
        protected void onPostExecute(String code) {
            Helper.log(TAG, "onPostExecute");
            mCountryCodeListener.returnCountryCode(code);
        }

    };
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Gingerbread_MR1) {
        countryCodeTask.execute();
    } else {
        countryCodeTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
}

3) Obtenir l'emplacement en utilisant le Sim/WIFI ( Ne peut pas être utilisé sur des tables sans SIM/WI-FI où mon application peut être utilisée sur un appareil sans connexion Internet/Wi-Fi ).

TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String countryCodeValue = tm.getNetworkCountryIso();

Ma question est de savoir s'il est possible de savoir où se trouve l'utilisateur, qu'il soit originaire de la région de l'Union européenne ou non. Je n'ai pas besoin de l'emplacement exact, même le pays fonctionnera.

Veuillez noter que cette question n'est pas un double d'une autre question car mon cas n'est résolu par aucune autre question.

EDIT: Toute autre méthode qui pourrait également nécessiter une autorisation de localisation (l'autorisation de localisation Not Corse sera également utile)

Tout pointeur sera vraiment utile.

13
Rajesh K

Vous pouvez vérifier si l'utilisateur est dans l'UE en demandant l'URL suivante http://adservice.google.com/getconfig/pubvendors . Cela vous donne une réponse comme ça:

{"is_request_in_eea_or_unknown": true}

Quelque part, j'ai lu que c'est ainsi que fonctionne le Android consentement SDK.

7
Bero

Vous avez mentionné toutes les options possibles pour obtenir Country Name mais il y a encore une option. SI votre application dispose d'une autorisation Internet, vous pouvez également obtenir le nom du pays par ADRESSE IP ..

Vous pouvez obtenir le nom du pays à partir de IP Address ainsi que. Une fois que vous avez l'adresse IP, transmettez-la à ipstack API pour obtenir le nom du pays. Tu peux faire 10,000 requests/month gratuitement.

Il existe de nombreuses façons d'obtenir une adresse IP (Google it). Une façon est ci-dessous:

public static String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                    return inetAddress.getHostAddress();
                }
            }
        }
    } catch (SocketException ex) {
        ex.printStackTrace();
    }
    return null;
}

Ajoutez l'autorisation ci-dessous à AndroidManifest.xml:

 <uses-permission Android:name="Android.permission.INTERNET" />
 <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />

Consultez cette documentation pour savoir comment utiliser l'API ipstack: https://ipstack.com/documentation .

Usage:

https://api.ipstack.com/YOUR_IP_ADDRESS?access_key=YOUR_ACCESS_KEY

Réponse API pour 134.201.250.155 Adresse IP au format JSON (vous pouvez également obtenir en XML si vous le souhaitez):

{
  "ip": "134.201.250.155",
  "hostname": "134.201.250.155",
  "type": "ipv4",
  "continent_code": "NA",
  "continent_name": "North America",
  "country_code": "US",
  "country_name": "United States",
  "region_code": "CA",
  "region_name": "California",
  "city": "Los Angeles",
  "Zip": "90013",
  "latitude": 34.0453,
  "longitude": -118.2413,
  "location": {
    "geoname_id": 5368361,
    "capital": "Washington D.C.",
    "languages": [
        {
          "code": "en",
          "name": "English",
          "native": "English"
        }
    ],
    "country_flag": "https://assets.ipstack.com/images/assets/flags_svg/us.svg",
    "country_flag_emoji": "????????",
    "country_flag_emoji_unicode": "U+1F1FA U+1F1F8",
    "calling_code": "1",
    "is_eu": false
  },
  "time_zone": {
    "id": "America/Los_Angeles",
    "current_time": "2018-03-29T07:35:08-07:00",
    "gmt_offset": -25200,
    "code": "PDT",
    "is_daylight_saving": true
  },
  "currency": {
    "code": "USD",
    "name": "US Dollar",
    "plural": "US dollars",
    "symbol": "$",
    "symbol_native": "$"
  },
  "connection": {
    "asn": 25876,
    "isp": "Los Angeles Department of Water & Power"
  }
  "security": {
    "is_proxy": false,
    "proxy_type": null,
    "is_crawler": false,
    "crawler_name": null,
    "crawler_type": null,
    "is_tor": false,
    "threat_level": "low",
    "threat_types": null
  }
}
3
VicJordan

Utilisez SDK Google Consent pour vérifier si l'utilisateur se trouve dans l'Espace économique européen (EEE).

Dans build.gradle, Ajoutez:

implementation 'com.google.Android.ads.consent:consent-library:1.0.6'

Utilisez ConsentInformation.getInstance(context).requestConsentInfoUpdate( ... ) comme décrit dans la documentation .

Ensuite, utilisez

ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown()

Si la fonction renvoie true appliquez les règles GDPR à votre application.

2
Paweł Nadolski

Si vous n'avez pas de fonctionnalité GPS dans votre application et que vous souhaitez l'ajouter et l'utiliser uniquement dans ce cas, cela affecte l'expérience utilisateur et je suggère que vous supposiez que l'utilisateur est déjà dans cette région et faites ce que vous avez faire. Trouver l'emplacement (et vider la batterie) juste pour ce cas est une exagération.

2
Adib Faramarzi

vous pouvez récupérer le code MCC/MNC et comme votre intérêt se porte sur le pays, le MCC (code de pays mobile) devrait suffire. Merci Abhi

0
Scorpion_Abhi