GPS 또는 인터넷을 사용하지 않고 Android에서 사용자의 현재 위치를 가져옵니다.


91

GPS 나 인터넷을 사용하지 않고 사용자의 현재 위치를 알 수 있습니까? 모바일 네트워크 공급자의 도움으로 의미합니다.


1
수락 된 답변이 완벽하게 작동합니까? 나를 위해 그것은 작동하지 않습니다 ... !!!
Samitha Chathuranga

3
불행하게도 허용 대답은 잘못된 것입니다 :-( 놀라운 그것이 제대로 질문에 대답하지 않는 28 upvotes 비록 가지고 있다고!
데이비드 WASSER

@DavidWasser 소중한 의견에 감사드립니다. 그리고 실제로 인터넷이나 GPS를 사용하지 않고 위치 정보를 얻을 수있는 방법이 없다고 생각하십니까? (다른 그 셀 브로드 캐스트 메시지를 사용하여보다)
SAMITHA Chathuranga

2
@SamithaChathuranga 이것에 대해 생각해보십시오 : GPS도없고 인터넷도없는 경우이 정보를 어디서 얻을 수 있습니까? 네트워크에서 셀 ID 정보를 얻을 수 있습니다. 이것은 당신에게 ID 만 제공합니다. 그런 다음 ID를 실제 좌표 또는 이름에 매핑하는 방법이 필요합니다. 항상 고유 한 셀 ID 데이터베이스를 구축하여 애플리케이션에 포함시킬 수 있지만 모든 데이터를 수집하는 데 엄청난 작업이 필요하며 매핑은 고정적이지 않습니다. 이동 통신사가 새 기지국을 설치하고 번호를 다시 매기면 변경됩니다. 그들의 네트워크. 기본적으로 실질적인 대답은 "아니오"입니다.
David Wasser

@DavidWasser 답장을 보내 주셔서 감사합니다. 나는 또한 인터넷이나 GPS없이 위치를 얻는 방법에 큰 놀라움을 느꼈습니다. 그러나 많은 포럼에서 스택 오버플로를 포함하는 것이 가능하다고합니다. 그것이 가능할 것이라고 생각한 이유입니다. 많은 사람들도 오해를 받고있는 것 같습니다.
SAMITHA Chathuranga

답변:


87

당신이 찾고있는 것은 LocationManager.NETWORK_PROVIDER대신을 사용하여 위치를 얻는 것입니다 LocationManager.GPS_PROVIDER. NETWORK_PROVIDER는 GSM 또는 와이파이에 의지 해결, 이제까지 가능합니다. 분명히 와이파이가 꺼지면 GSM이 사용됩니다. 셀 네트워크 사용은 기본적으로 500m까지 정확합니다.

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을 사용하면 다른 애플리케이션이 안테나를 사용하는 경우 많은 작업과 배터리를 절약 할 수 있습니다.
Ian

2
안녕하세요 @Ian, 동일한 코드를 사용했습니다.하지만 제 경우에는 onLocationChanged () 리스너 메소드가 호출되지 않았습니다. onResume () 메서드에서 requestLocationUpdates를 사용했습니다. 그래도 전화를 안 했어요 .. 그래서 무슨 문제가 있었나요?
MS.

2
안녕하세요 @lan 또는 나를 도울 수있는 다른 사람 내가 위의 코드를 구현했지만 onLocationChanged 메서드는 문제가 무엇인지 호출됩니다. 누구든지 제발 도와주세요 .....
pareshm

1
인터넷없이 좌표를 얻을 수 있습니까? 일부 장치에서는 작동하지 않는 것 같습니다.
iammilind 2015

20
이 대답은 잘못되었습니다 :-( OP가 인터넷 연결을 사용하지 않고 위치를 얻는 방법을 물었습니다. LOCATION_PROVIDER는 인터넷을 사용하여 서버에 액세스하여 Cell-ID 및 WIFI MAC 주소 모음을 지리적 좌표로 확인해야합니다. 인터넷이없는 경우 좌표를 구할 수 없습니다. 작동한다고 말씀하시면 인터넷에 연결되어 있거나 인터넷에 연결되어 있음을 의미합니다 (위치 API는 주변 지역에 대한 일부 정보를 다운로드하고 캐시합니다). , 위치 정보 또는 이전 (따라서 부정확)입니다.
데이비드 WASSER

16

을 얻음으로써 getLastKnownLocation실제로 스스로 수정을 시작하지 않습니다.

인식하는 것이이 공급자를 시작할 있지만 사용자가 이전에 위치를 얻은 적이 있다면 그렇게 될 것이라고 생각하지 않습니다. 문서는 이것에 대해 너무 명확하지 않습니다.

문서 getLastKnownLocation에 따르면 :

지정된 공급자로부터 얻은 마지막으로 알려진 위치 수정의 데이터를 나타내는 Location을 반환합니다. 이는 제공자를 시작하지 않고도 수행 할 수 있습니다.

다음은 빠른 스 니펫입니다.

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" />

내가 생각이 나는, 그것은 모바일 네트워크를 사용하여 현재 위치를 얻을 수 있나요
프라 부 M

문서를 읽어야합니다. 사이의 차이점을 알아 PASSIVE_PROVIDER, NETWORK_PROVIDER하고 GPS_PROVIDER.
hwrdprkns

1
이것이 이상적이지만 getTime ()을 사용하여 마지막 위치의 시간을 확인합니다. 그런 다음 몇 살을 허용할지 결정하는 문제입니다. 너무 오래된 경우 내 게시물을 사용하여 새 위치를 얻으십시오.
Ian

1
@Ian 새롭거나 새로운 위치를 얻는 방법?
Archie.bpgc 2013 년

5
GPS가 꺼져 있으면 위치를 알 수 있습니까?
Prasad

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, Cellular 또는 Bluetooth 기반 위치 기술은 지속적으로 업데이트되는 대규모 데이터베이스의 도움으로 작동합니다. 장치는 송신기 ID를 스캔 한 다음 인터넷통해 Google, Apple 또는 Skyhook과 같은 서비스에 쿼리를 통해 전송합니다 . 이 서비스는 알려진 위치의 이전 무선 설문 조사를 기반으로 한 위치로 응답합니다. 인터넷에 액세스 할 수 없으면 이러한 데이터베이스의 로컬 사본이 있어야하며이를 최신 상태로 유지해야합니다. 글로벌 사용의 경우 이는 매우 비실용적입니다.

이론적으로 모바일 공급자는 로컬 데이터 서비스 만 제공 할 수 있지만 인터넷에는 액세스 할 수 없으며 모바일 장치에서 위치 쿼리에 응답 할 수 있습니다. 이동 통신사는이를 수행하지 않습니다. 아무도 이러한 제한된 데이터 액세스에 대해 비용을 지불하고 싶어하지 않습니다. 이동 통신사를 통해 데이터 서비스를 받으면 인터넷에 액세스 할 수 있습니다.

간단히 말해서 LocationManager.NETWORK_PROVIDER 또는 android.hardware.location.network를 사용하여 위치를 가져 오려면 인터넷을 사용해야합니다.

마지막으로 알려진 위치를 사용하려면 최근에 GPS 또는 인터넷에 액세스해야합니다. 방금 인터넷을 사용했다면 위치 나 설정을 조정하여 인터넷을 다시 사용할 수 있습니다. 장치에 GPS 또는 인터넷 액세스가없는 경우 마지막으로 알려진 위치 기능이 도움이되지 않습니다.

GPS 또는 인터넷없이 다음을 수행 할 수 있습니다.

  1. 밤하늘 사진을 찍고 현재 시간을 사용하여 별표를 기반으로 위치를 추정합니다. 사진의 각도를 정확하게 측정하려면 추가 장비가 필요할 수 있습니다.
  2. 가속도계를 사용하여 알려진 위치에서 시작하는 위치를 추적합니다. 이러한 종류의 접근 방식에서 누적 된 오류는 대부분의 상황에서 비실용적입니다.


2

Google Maps Geolocation API를 살펴 보셨습니까? Google지도 위치 정보

이것은 간단한 RestApi입니다. POST 만 요청하면 서비스가 미터 단위의 정확도로 위치를 반환합니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.