web-dev-qa-db-ja.com

ユーザーの国の場所を取得する方法は?

GDPRのため、ユーザーが欧州連合出身かどうかをユーザーの場所で確認する必要があります。今まで私はこれらの解決策を見つけました-

1) 電話の言語設定を使用して国を取得する他の国からのユーザーである場合でも、ユーザーが英語のUSバージョンを使用していると、見当違いを起こす可能性があります)。

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

2) GPSを使用して位置を取得Android 6.0+のため、特に追加したくないLocation Corse権限が必要です。ランタイム権限)。

    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の場所のアクセス許可も役立ちます)

どんなポインタも本当に役に立ちます。

13
Rajesh K

次のURL http://adservice.google.com/getconfig/pubvendors をリクエストすることで、ユーザーがEU内にいるかどうかを確認できます。それはあなたにそのような答えを与えます:

{"is_request_in_eea_or_unknown":true}

Android同意SDKが機能する方法であると私は読んだところがあります。

7
Bero

Country Nameを取得するために考えられるすべてのオプションについて説明しましたが、もう1つのオプションがあります。アプリケーションにインターネット権限がある場合は、IP ADDRESSでも国名を取得できます。

国名はIP Addressからも取得できます。 IPアドレスを取得したら、それを ipstack APIに渡して国名を取得します。 10,000 requests/monthは無料で作成できます。

IPアドレス(Google it)を取得するには、さまざまな方法があります。 1つの方法は以下のとおりです。

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
  }
}
3
VicJordan

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ルールをアプリに適用します。

2
Paweł Nadolski

アプリにGPS機能がなく、この場合にのみGPS機能を追加して使用したい場合、それはユーザーエクスペリエンスに影響を与えるので、ユーザーがその地域にすでにいると想定して、あなたがしていることを行うことをお勧めしますする。この場合のためだけに場所を取得する(そしてバッテリーを消耗させる)ことはやりすぎです。

2
Adib Faramarzi

mCC/MNCコードをフェッチできます。また、ur intrestが国にあるため、MCC(モバイル国コード)で十分です。ありがとうございます

0
Scorpion_Abhi