Как получить Страна Страна пользователя? - PullRequest
0 голосов
/ 09 мая 2018

Из-за GDPR мне необходимо проверить местонахождение пользователей, является ли пользователь из Европейского Союза.До сих пор я нашел эти решения -

1) Получить страну, используя языковую конфигурацию телефона ( Может ввести в заблуждение, если пользователь использует английскую версию для США, даже если он может быть из какой-то другойстрана ).

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

2) Получить местоположение с помощью GPS ( Требуется разрешение Location Corse, которое я не хочу добавлять, особенно из-за времени выполнения Android 6.0+permissions ).

    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) Получить местоположение с помощью Sim / WIFI ( Не может использоваться на столах без SIM / WI-FI, где в качестве моего приложенияможет использоваться на устройстве без подключения к Интернету / Wi-Fi ).

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

Мой вопрос заключается в том, можно ли узнать местонахождение пользователя, если пользователь из региона Европейского Союза илине.Мне не нужно точное местоположение, даже если страна будет работать.

Обратите внимание, что этот вопрос не является дубликатом любого другого вопроса, так как мой вопрос не решается ни одним другим вопросом.

РЕДАКТИРОВАТЬ: Любой другой метод, который также может потребовать разрешения местоположения (также не будет разрешено местоположение Corse)

Любой указатель будет действительно полезным.

Ответы [ 5 ]

0 голосов
/ 14 ноября 2018

Используйте Google Consent SDK , чтобы проверить, находится ли пользователь в Европейском экономическом пространстве (EEA).

В build.gradle добавить:

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

Используйте ConsentInformation.getInstance(context).requestConsentInfoUpdate( ... ) как , как описано в документации .

Тогда используйте

ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown()

Если функция возвращает true, применить правила GDPR к вашему приложению.

0 голосов
/ 30 мая 2018

Вы можете проверить, находится ли пользователь в ЕС, запросив следующий URL http://adservice.google.com/getconfig/pubvendors. Это дает вам ответ так:

{ "is_request_in_eea_or_unknown": истинно}

Где-то я читал, что так работает SDK согласия Android.

0 голосов
/ 16 мая 2018

вы можете получить код MCC / MNC, а также, если вы заинтересованы в стране MCC (мобильный код страны) должно быть достаточно. Спасибо Аби

0 голосов
/ 19 мая 2018

Если у вас нет функции GPS в вашем приложении, и вы хотите добавить и использовать ее только для этого случая, это влияет на взаимодействие с пользователем, и я хотел бы предложить, чтобы вы предположили, что пользователь уже находится в этом регионе, и что ты должен сделать. Получить местоположение (и разряжать батарею) только для этого случая - излишество.

0 голосов
/ 15 мая 2018

Вы упомянули все возможные варианты получения Country Name, но есть еще один вариант. ЕСЛИ ваше приложение имеет разрешение на доступ в Интернет, вы также можете получить название страны по IP-АДРЕСУ ..

Вы также можете получить название страны от IP Address. Получив IP-адрес, передайте его в ipstack API, чтобы получить название страны. Вы можете сделать 10,000 requests/month бесплатно.

Существует много разных способов получить IP-адрес (Google it). Один из способов ниже:

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

Добавьте ниже разрешение AndroidManifest.xml:

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

Ознакомьтесь с этой документацией о том, как использовать ipstack API: https://ipstack.com/documentation.

Использование:

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

Ответ API для 134.201.250.155 IP-адреса в формате JSON (Вы также можете получить в XML, если хотите):

{
  "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
  }
}
...