2014-02-17 3 views
2

Я создаю приложение, в котором я присваиваю разные значения каждой стране и делаю что-то на основе этого значения. Как:Получить текущую страну в Android - путешествия

Argentina 3 
Australia 7 
USA 23 

Чтобы выбрать страну, мне нужно использовать текущую страну пользователя, для этого я использую Google, геокодер:

geocoder.getFromLocation 

Geocoder documentation

Но если у меня есть много пользователей (надеюсь), это будет проблемой из-за ограничения на использование API 2500 (с ключом API/без ключа: 2,500 запросов за 24 часа).
Geocoder API Limits

Вопрос 1: Об ограничении использования. Является ли этот номер максимальным количеством запросов для всех пользователей, использующих мою карту?

EDIT: Я нашел это

В рамках геокодирований находятся в сеанс пользователя, не существует риска того, что ваше приложения достигнет глобального предел, как ваш UserBase растет. Геокодирование на стороне клиента не будет ограничиваться лимитом квоты, если вы не выполните партию запросов геокодирования в пользовательском сеансе . Поэтому, используя клиентское геокодирование, вам, как правило, не нужно беспокоиться о квоте . usage Limits

Вопрос 2: Допустим, я использовать Geocoder.getFromLocation() Есть ли список названий стран, которые используют Google? Например, они могут иметь «США», «США» или «Соединенные Штаты» или даже «Соединенные Штаты Америки». Мне нужно это для того, чтобы получить доступ к значению страны в приведенной выше таблице.

Я думаю о первоначально получения страной с использованием типичных способов:

telephonyManager.getSimCountryIso(); 

или

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

и добавить кнопку в обновления, так что пользователь может обновить его, когда путешествие (используя геокодер).

Вопрос 3: Есть ли у вас какие-либо другие предложения? альтернативы?

+0

Возможный дубликат [Где я? - Получить страну] (http://stackoverflow.com/questions/3659809/where-am-i-get-country) – mpop

ответ

0

Я сделал быстрый поиск Google и нашел Where am I? - Get country

в основном, если вы звоните

String locale = getResources().getConfiguration().locale.getCountry(); 
Log.d("IssuesEtc","the local is " + locale); 

это должно дать вам код страны. Я запустил вышеупомянутый snipit, и я вернулся , местный - это , поэтому он работает на моем телефоне (Samsung S blaze, cyagin mod, на T-Mobile) Я также должен отметить, что звонок был выполнен внутри класс, который расширил Activity, если вы находитесь вне класса, в котором есть контекст ansestory, вам нужно будет получить контекст для запуска метода getResources().

+1

, но это не работает во время путешествия, не так ли? – fersarr

+0

Хорошо, может быть, нет, но некоторые другие ответы на приведенную выше ссылку можно попробовать, например, ---- Вы можете использовать getNetworkCountryIso() из TelephonyManager, чтобы получить страну, в которой находится телефон в настоящее время (хотя, по-видимому, это ненадежно на сетях CDMA). --- TelephonyManager tm = (TelephonyManager) getSystemService (Context.TELEPHONY_SERVICE); Строка countryCode = tm.getSimCountryIso(); ---- оба эти могут работать, снова см. Первую ссылку, которую я предоставил. – mpop

+0

да, спасибо. Я тоже видел это сообщение, но, чтобы избежать проблем с CDMA, я думаю, что было бы безопаснее использовать геокодер, знаете ли вы об ограничениях использования API? – fersarr

1

Новый ответ, как обещал fersarr новое решение, это работает с GPS и Google Maps API, также не мой лучший код, но

private GeoPoint getLocation() { 
try { 
    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE); 
String provider = locationManager.getBestProvider(criteria,true); 
//In order to make sure the device is getting the location, request updates. 
// this requests updates every hour or if the user moves 1 kilometer 
Location curLocation = locationManager.getLastKnownLocation(provider); 
GeoPoint curGeoPoint = new GeoPoint((int)(curLocation.getLatitude() * 1e6), (int)(curLocation.getLongitude()*1e6)); 
return curGeoPoint; 
} catch (NullPointerException e) { 
    Log.e("your app name here","Log your error here"); 
} 
return null; 
} 


public static String getCountryName(Context context, GeoPoint curLocal) { 
Geocoder geocoder = new Geocoder(context, Locale.getDefault()); 
List<Address> addresses = null; 
try { 
    addresses = geocoder.getFromLocation((double)curLocal.getLatitudeE6()/1e6,(double)curLocal.getLongitudeE6()/ 1e6,1); 
} catch (IOException ignored) { 
    Address result; 
    if (addresses != null && !addresses.isEmpty()) { 
     return addresses.get(0).getCountryName(); 
    } 
    return null; 
} 
return addresses.get(0).getCountryCode(); 
} 

Вам нужно будет сделать некоторые очистки в этом коде, а это «на лету» не очищает код. но то, что это делает, является первым методом getLocation будет тянуть вашу текущую точку Geo от GPS (если вы не можете использовать систему GPS на устройстве, это не сработает), то вы можете передать геототу и контекст (свою активность) на getCountryName, которое должно вернуть название страны (в моем случае это было также США), он возвращает список, который вам, возможно, придется иметь дело с более чем тогда, когда код страны возвращается в спорные места.

Смежные вопросы