2013-09-27 2 views
8

Я разрабатываю приложение для Android, которое получает данный адрес. Я хочу, чтобы приложение запускалось только на устройстве, если пользователь находится по этому адресу или ближе к нему.Как узнать, находится ли Android-устройство рядом с адресом google maps api

Это возможно сделать только с Google Maps api?

+0

Что произойдет, когда пользователь пытался запустить приложение и не было в пределах нужного диапазона? – Prmths

+0

Возможно, это могло бы помочь вам: http://stackoverflow.com/questions/3652951/google-maps-api-get-coordinates-of-address. Вам в основном нужно сравнить два набора координат и выяснить, находятся ли эти две пары достаточно близко друг к другу. – Izmaki

+0

@Prmths приложение просто не откроется :) –

ответ

6

вы можете получить адрес и от адреса получить широту и долготу:

Geocoder coder = new Geocoder(this); 
List<Address> address; 

try { 
    address = coder.getFromLocationName(strAddress,5); 
    if (address == null) { 
     return null; 
    } 
    Address location = address.get(0); 
    location.getLatitude(); 
    location.getLongitude(); 


} 

А потом сравнить его с вашим адресом

if (distance(mylocation.latitude, mylocation.longitude, location.getLatitude(), location.getLongitude()) < 0.1) { // if distance < 0.1 

    // launch the activity 
}else { 
    finish(); 
} 


/** calculates the distance between two locations in MILES */ 
private double distance(double lat1, double lng1, double lat2, double lng2) { 

    double earthRadius = 3958.75; // in miles, change to 6371 for kilometers 

    double dLat = Math.toRadians(lat2-lat1); 
    double dLng = Math.toRadians(lng2-lng1); 

    double sindLat = Math.sin(dLat/2); 
    double sindLng = Math.sin(dLng/2); 

    double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) 
     * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)); 

    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 

    double dist = earthRadius * c; 

    return dist; 
} 

EDIT: Как @FelipeMosso говорил вы также можете использовать distanceBetween, который вычисляет приблизительное расстояние в метрах между двумя точками или distanceTo, которое дает вам расстояние между вами и назначение.

+0

Спасибо @ Dyna! Я посмотрю на это, когда вернусь домой, и вернусь к вам с обратными связями. –

+0

Ваша идея сработала для меня! Но раньше я искал освещенный бит, и я нашел метод класса Android под названием distanceBetween, который делает то же самое, что и метод расстояния. Если кто-то сталкивается с той же проблемой, я рекомендую вам использовать: http://developer.android.com/reference/android/location/Location.html –

+0

OK @FelipeMosso. Я обновляю свой ответ по вашей ссылке, чтобы мы могли помочь другим разработчикам с этой проблемой. Cheers * – Dyna

2

API GMSCore Locations также имеет геокодирование, которое позволяет обнаруживать близость устройства к одному или нескольким местоположениям Geofence. Вы можете использовать Карты, чтобы получить lat lng для адреса.

Это не остановит ваше приложение. Лучшее решение - запустить приложение, а затем позволить ему перейти в фоновый режим. Когда пользователь пересекает Geofence, выведите уведомление. Когда пользователь нажимает на уведомление, вызывается действие.

См Creating and Monitoring Geofences