如何获得用户的国家/地区位置?

时间:2018-05-09 12:25:59

标签: android geolocation location privacy android-gps

由于GDPR,我需要检查用户位置是否来自欧盟。直到现在我找到了这些解决方案 -

1)Get Country using the Phone's language configuration如果用户使用英语美国版本可能会误导,即使他可能来自其他国家/地区)。

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

2)Get Location using the GPS需要位置Corse权限,我不想添加,特别是因为Android 6.0+运行时权限)。

    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)Get Location using the Sim/WIFI不能在没有SIM / WI-FI的桌子上使用,因为我的应用可以在没有互联网连接/ Wi-Fi的设备上使用)。

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

我的问题是,如果用户来自欧盟地区,是否有可能找出用户的位置。即使这个国家能够运作,我也不需要确切的位置。

请注意,此问题与任何其他问题不重复,因为我的案例未被任何其他问题解决。

编辑:任何其他可能还需要位置许可的方法(非Corse位置许可也会有所帮助)

任何指针都非常有用。

6 个答案:

答案 0 :(得分:5)

您可以通过请求以下网址http://adservice.google.com/getconfig/pubvendors来检查用户是否在欧盟境内。它给你这样的答案:

  

{&#34; is_request_in_eea_or_unknown&#34;:真}

某处我已经知道这是Android同意SDK的工作方式。

答案 1 :(得分:3)

您已经提到了获取Country Name的所有可能选项,但还有一个选项。如果您的应用程序具有Internet权限,您也可以通过 IP ADDRESS 获取国家/地区名称。

您也可以从IP Address获取国家/地区名称。获得IP地址后,将其传递给ipstack API以获取国家/地区名称。您可以免费提出10,000 requests/month

获取IP地址的方式有很多种(谷歌)。一种方法如下:

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

JSON格式的134.201.250.155 IP地址的API响应(如果需要,您也可以使用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
  }
}

答案 2 :(得分:2)

如果你的应用程序中没有GPS功能,并且你想在这种情况下添加和使用它,它会影响用户体验,我建议你应该假设用户已经在该地区并且做了你要做什么只为这种情况获取位置(和耗尽电池)是一种过度杀伤。

答案 3 :(得分:1)

使用Google Consent SDK检查用户是否在欧洲经济区(EEA)中。

build.gradle中添加:

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

ConsentInformation.getInstance(context).requestConsentInfoUpdate( ... )用作described in the docs

然后使用

ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown()

如果函数返回true,则将GDPR规则应用于您的应用。

答案 4 :(得分:0)

您可以获取MCC / MNC代码&amp;因为你的国家MCC(移动国家代码)中的urrest就足够了。 谢谢 ABHI

答案 5 :(得分:0)

另一种方法是跟踪IP位置,但是如果用户使用VPN或代理,则此方法可能无效。

以下是IP位置api服务的一个示例: https://ip-api.com/