Отримайте поточне місцезнаходження користувача в Android, не використовуючи GPS або Інтернет


91

Чи можна отримати поточне місцезнаходження користувача без використання GPS або Інтернету? Я маю на увазі за допомогою оператора мобільної мережі.


1
Чи прийнята відповідь працює ідеально? Для мене це не працює ... !!!
Саміта Чатуранга

3
На жаль, прийнята відповідь неправильна :-( Дивно, що він набрав 28 голосів проти, хоча він не відповідає на питання правильно!
Девід Вассер

@DavidWasser Оцініть ваші цінні коментарі. І чи вважаєте ви, що насправді не існує жодного способу отримати деталі місцезнаходження без використання Інтернету або GPS? (крім використання повідомлень, що транслюються по стільниковій мережі)
Саміта Чатуранга

2
@SamithaChathuranga Подумайте про це: якщо у вас немає GPS і у вас немає Інтернету, де ви збираєтесь отримати цю інформацію? Ви можете отримати інформацію про ідентифікатор стільника з мережі. Це дає вам лише посвідчення особи. Потім вам знадобиться спосіб зіставлення ідентифікатора з фактичною координатою або ім'ям. Ви завжди можете створити власну базу даних ідентифікатора стільникового зв'язку та включити її у свою програму, але для збору всіх цих даних вам знадобиться надзвичайно багато роботи, і відображення не є статичним: воно змінюється, коли оператори мобільного зв’язку встановлюють нові вишки стільникових мереж і перенумеровують їх мережі. В основному практична відповідь - "ні".
Девід Вассер

@DavidWasser Дякую за відповідь. У мене також був великий сюрприз, як отримати розташування без Інтернету або GPS. Але, включаючи stackoverflow на багатьох форумах, це, як кажуть, можливо. Тому я думав, що це буде можливо. Здається, багато людей теж помиляються.
Саміта Чатуранга

Відповіді:


87

Що ви хочете зробити, це отримати позицію, використовуючи LocationManager.NETWORK_PROVIDERзамість LocationManager.GPS_PROVIDER. Вирішення NETWORK_PROVIDERбуде вирішено на GSM або Wi-Fi, які коли-небудь доступні. Очевидно, що при вимкненому wifi буде використовуватися GSM. Майте на увазі, що використання стільникової мережі становить приблизно 500 метрів.

http://developer.android.com/guide/topics/location/obtaining-user-location.html містить справді чудову інформацію та зразок коду.

Після того, як ви закінчите з більшістю коду OnCreate(), додайте це:

// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Ви також можете запросити свою діяльність реалізувати LocationListenerклас і, таким чином, реалізувати onLocationChanged()у своїй діяльності.


1
будь ласка, не забудьте ознайомитися зі стратегіями збереження акумулятора. Крім того, залежно від вашої програми, PASSIVE_PROVIDER та використання getLastKnownLocation можуть заощадити вам багато роботи та заряду, якщо інші програми використовують антени.
Ян

2
Привіт @Ian, я використовував той самий код .. Але в моєму випадку метод слухача onLocationChanged () ніколи не викликався. Я використав requestLocationUpdates у методі onResume (). все одно це ніколи не дзвонило. То що там було?
MS.

2
Привіт @lan або будь-яка інша особа, яка може мені допомогти, я реалізував вищезгаданий код, але викликається метод onLocationChanged, який невед, що може бути проблемою, може хтось допоможе мені, будь ласка .....
pareshm

1
Чи можна отримати координати без Інтернету? У деяких пристроях це, здається, не працює.
iammilind

20
Ця відповідь неправильна :-( OP запитав, як отримати місцезнаходження без використання підключення до Інтернету. LOCATION_PROVIDER повинен використовувати Інтернет для доступу до серверів, щоб вирішити колекцію MAC-адрес Cell-ID та WIFI в геокоординату. Якщо у вас немає Інтернету з'єднання ви не зможете отримати координату. Якщо ви скажете мені, що це працює для вас, це означає, що у вас є підключення до Інтернету, або у вас було підключення до Інтернету (API розташування завантажує та кешує деяку інформацію про область навколо вас) , або інформація про місцезнаходження стара (і, отже, неточна).
Девід Вассер

16

Отримавши те, getLastKnownLocationви насправді не ініціюєте виправлення самостійно.

Майте на увазі, що це може запустити постачальника, але якщо користувач коли-небудь отримував місцезнаходження раніше, я не думаю, що це стане. Документи насправді не надто зрозумілі щодо цього.

Відповідно до документів getLastKnownLocation:

Повертає місце розташування із зазначенням даних останнього відомого виправлення місцезнаходження, отриманого від даного постачальника. Це можна зробити, не запускаючи постачальника.

Ось короткий фрагмент:

import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import java.util.List;

public class UtilLocation {
    public static Location getLastKnownLoaction(boolean enabledProvidersOnly, Context context){
        LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        Location utilLocation = null;
        List<String> providers = manager.getProviders(enabledProvidersOnly);
        for(String provider : providers){

            utilLocation = manager.getLastKnownLocation(provider);
            if(utilLocation != null) return utilLocation;
        }
        return null;
    }
}

Ви також повинні додати новий дозвіл на AndroidManifest.xml

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

Я думаю, чи можна отримати поточне місцезнаходження за допомогою мобільної мережі
Prabhu M

Вам потрібно прочитати документи. Вивчають відмінності між PASSIVE_PROVIDER, NETWORK_PROVIDERі GPS_PROVIDER.
hwrdprkns

1
Хоча це ідеально, я б перевірив час останнього розташування за допомогою getTime (). Потім, це лише питання вирішення, скільки років ви дозволите цьому бути. Якщо вона занадто стара, знайдіть нову посаду, використовуючи мій пост.
Ян

1
@Ian Як отримати нове чи свіже місце?
Archie.bpgc

5
Чи можемо ми отримати місцезнаходження, якщо GPS вимкнено
Прасад

4
boolean gps_enabled = false;
boolean network_enabled = false;

LocationManager lm = (LocationManager) mCtx
                .getSystemService(Context.LOCATION_SERVICE);

gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

Location net_loc = null, gps_loc = null, finalLoc = null;

if (gps_enabled)
    gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (network_enabled)
    net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (gps_loc != null && net_loc != null) {

    //smaller the number more accurate result will
    if (gps_loc.getAccuracy() > net_loc.getAccuracy()) 
        finalLoc = net_loc;
    else
        finalLoc = gps_loc;

        // I used this just to get an idea (if both avail, its upto you which you want to take as I've taken location with more accuracy)

} else {

    if (gps_loc != null) {
        finalLoc = gps_loc;
    } else if (net_loc != null) {
        finalLoc = net_loc;
    }
}

4

Ні, наразі ви не можете отримати місцезнаходження без використання GPS або Інтернету.

Методи визначення місцезнаходження, засновані на WiFi, стільниковому або Bluetooth, працюють за допомогою великої бази даних, яка постійно оновлюється. Пристрій сканує ідентифікатори передавача, а потім надсилає їх у запиті через Інтернет до таких служб, як Google, Apple або Skyhook. Ця служба відповідає місцезнаходженням на основі попередніх опитувань бездротового зв'язку з відомих місць. Без доступу до Інтернету ви повинні мати локальну копію такої бази даних та постійно її оновлювати. Для глобального використання це дуже недоцільно.

Теоретично, оператор мобільного зв'язку може надавати лише локальну послугу передачі даних, але не мати доступу до Інтернету, а потім відповідати на запити про місцезнаходження з мобільних пристроїв. Мобільні провайдери цього не роблять; ніхто не хоче платити за такий вид обмеженого доступу до даних. Якщо у вас є послуга передачі даних через оператора мобільного зв’язку, ви маєте доступ до Інтернету.

Коротше кажучи, використання LocationManager.NETWORK_PROVIDER або android.hardware.location.network для отримання геоданих вимагає використання Інтернету.

Використання останньої відомої позиції вимагає від вас зовсім недавно доступу до GPS або Інтернету. Якщо у вас просто був Інтернет, можливо, ви можете налаштувати своє положення або налаштування, щоб знову отримати Інтернет. Якщо у вашому пристрої не було GPS або доступу до Інтернету, остання відома функція розташування вам не допоможе.

Без GPS або Інтернету ви можете:

  1. Сфотографуйте нічне небо та використовуйте поточний час, щоб оцінити своє місцезнаходження на основі зіркової карти. Можливо, для цього потрібно додаткове обладнання, щоб забезпечити правильне вимірювання кутів для ваших знімків.
  2. Використовуйте акселерометр для відстеження місця, починаючи з відомого місця. Накопичення помилок у такому підході робить його недоцільним для більшості ситуацій.



-1

Здається, можна відстежувати смарт-телефон без використання GPS.

Джерела:

Основне: "PinMe: Відстеження користувачів смартфонів у всьому світі"

Вторинний: "Як відстежити мобільний телефон без GPS чи згоди"

Я ще не знайшов посилання на остаточний код команди. Коли я це зроблю, я розміщу повідомлення, якщо інший цього не зробив.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.