รับตำแหน่งปัจจุบันของผู้ใช้ใน Android โดยไม่ต้องใช้ GPS หรืออินเทอร์เน็ต


91

เป็นไปได้ไหมที่จะรับตำแหน่งปัจจุบันของผู้ใช้โดยไม่ต้องใช้ GPS หรืออินเทอร์เน็ต? ฉันหมายถึงด้วยความช่วยเหลือของผู้ให้บริการเครือข่ายมือถือ


1
คำตอบที่ยอมรับทำงานได้อย่างสมบูรณ์หรือไม่? สำหรับผมมันใช้ไม่ได้ ... !!!
Samitha Chathuranga

3
น่าเสียดายที่คำตอบที่ยอมรับนั้นผิด :-( น่าทึ่งที่ได้รับ 28 โหวตถึงแม้ว่าจะตอบคำถามไม่ถูกก็ตาม!
David Wasser

@DavidWasser ชื่นชมความคิดเห็นที่มีค่าของคุณ และคุณคิดว่าไม่มีวิธีใดในการรับรายละเอียดตำแหน่งโดยไม่ใช้อินเทอร์เน็ตหรือ gps? (นอกเหนือจากการใช้ข้อความออกอากาศทางเซลล์นั้น)
Samitha Chathuranga

2
@SamithaChathuranga ลองนึกถึงสิ่งนี้: ถ้าคุณไม่มี GPS และคุณไม่มีอินเทอร์เน็ตคุณจะหาข้อมูลนี้ได้จากที่ไหน? คุณสามารถรับข้อมูล ID เซลล์ได้จากเครือข่าย สิ่งนี้ทำให้คุณมีเพียง ID จากนั้นคุณจะต้องมีวิธีในการแมป ID กับพิกัดหรือชื่อจริง คุณสามารถสร้างฐานข้อมูล ID เซลล์ของคุณเองและรวมไว้ในแอปพลิเคชันของคุณได้ตลอดเวลา แต่จะต้องใช้เวลามากในการรวบรวมข้อมูลทั้งหมดนั้นและการทำแผนที่จะไม่คงที่: จะเปลี่ยนไปเมื่อผู้ให้บริการมือถือติดตั้งเสาสัญญาณและเปลี่ยนหมายเลขใหม่ เครือข่ายของพวกเขา โดยทั่วไปคำตอบที่ใช้ได้จริงคือ "ไม่"
David Wasser

@DavidWasser ขอบคุณสำหรับการตอบกลับ ฉันยังประหลาดใจอย่างมากที่จะได้รับตำแหน่งโดยไม่ใช้อินเทอร์เน็ตหรือ gps แต่การรวม stackoverflow ในหลาย ๆ ฟอรัมสิ่งนี้เป็นไปได้ นั่นเป็นเหตุผลที่ฉันคิดว่ามันจะเป็นไปได้ ดูเหมือนคนจำนวนมากจะเข้าใจผิดเช่นกัน
Samitha Chathuranga

คำตอบ:


87

สิ่งที่คุณต้องการทำคือรับตำแหน่งโดยใช้LocationManager.NETWORK_PROVIDERแทนLocationManager.GPS_PROVIDER. NETWORK_PROVIDERจะแก้ไขในระบบ GSM หรือ WiFi ซึ่งเคยใช้ได้ เห็นได้ชัดว่าเมื่อปิด 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 () ก็ยังไม่เคยโทร .. แล้วมีปัญหาอะไร?
.

2
เฮ้ @lan หรือบุคคลอื่นที่สามารถช่วยฉันได้ฉันติดตั้งโค้ดข้างบน แต่เมธอด onLocationChanged ถูกเรียกว่าอะไรจะเป็นปัญหาใครก็ได้ช่วยฉันทีได้ไหม .....
pareshm

1
เป็นไปได้ไหมที่จะหาพิกัดโดยไม่ใช้อินเทอร์เน็ต ดูเหมือนว่าในอุปกรณ์บางอย่างจะไม่ทำงาน
iammilind

20
คำตอบนี้ไม่ถูกต้อง :-( OP ถามวิธีรับตำแหน่งโดยไม่ต้องใช้การเชื่อมต่ออินเทอร์เน็ต LOCATION_PROVIDER จำเป็นต้องใช้อินเทอร์เน็ตเพื่อเข้าถึงเซิร์ฟเวอร์เพื่อแก้ไขการรวบรวมที่อยู่ MAC ของ Cell-ID และ WIFI ในพิกัดทางภูมิศาสตร์หากคุณไม่มีอินเทอร์เน็ต การเชื่อมต่อคุณจะไม่สามารถรับพิกัดได้หากคุณบอกฉันว่ามันเหมาะกับคุณนั่นหมายความว่าคุณมีการเชื่อมต่ออินเทอร์เน็ตหรือคุณมีการเชื่อมต่ออินเทอร์เน็ต (ดาวน์โหลดตำแหน่ง API และแคชข้อมูลบางอย่างเกี่ยวกับพื้นที่รอบตัวคุณ) หรือข้อมูลสถานที่ตั้งเก่า (จึงไม่ถูกต้อง)
David Wasser

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, Cellular หรือ Bluetooth ทำงานโดยใช้ฐานข้อมูลขนาดใหญ่ที่มีการอัปเดตอยู่ตลอดเวลา อุปกรณ์จะสแกนหา ID เครื่องส่งสัญญาณแล้วส่งสิ่งเหล่านี้ในแบบสอบถามผ่านอินเทอร์เน็ตไปยังบริการเช่น Google, Apple หรือ Skyhook บริการนั้นตอบสนองด้วยตำแหน่งตามการสำรวจไร้สายก่อนหน้านี้จากสถานที่ที่รู้จัก หากไม่มีอินเทอร์เน็ตคุณจะต้องมีสำเนาของฐานข้อมูลดังกล่าวในเครื่องและอัปเดตอยู่เสมอ สำหรับการใช้งานทั่วโลกสิ่งนี้ไม่สามารถใช้งานได้จริง

ในทางทฤษฎีผู้ให้บริการโทรศัพท์มือถือสามารถให้บริการข้อมูลในพื้นที่เท่านั้น แต่ไม่มีการเข้าถึงอินเทอร์เน็ตจากนั้นตอบคำถามเกี่ยวกับตำแหน่งจากอุปกรณ์มือถือ ผู้ให้บริการมือถือไม่ทำเช่นนี้ ไม่มีใครต้องการจ่ายสำหรับการเข้าถึงข้อมูลที่ถูก จำกัด ประเภทนี้ หากคุณมีบริการข้อมูลผ่านผู้ให้บริการมือถือของคุณแสดงว่าคุณสามารถเข้าถึงอินเทอร์เน็ตได้

กล่าวโดยย่อคือการใช้ LocationManager.NETWORK_PROVIDER หรือ android.hardware.location.network เพื่อรับตำแหน่งต้องใช้อินเทอร์เน็ต

การใช้ตำแหน่งที่ทราบล่าสุดทำให้คุณต้องมี GPS หรืออินเทอร์เน็ตเมื่อเร็ว ๆ นี้ หากคุณเพิ่งมีอินเทอร์เน็ตคุณสามารถปรับตำแหน่งหรือการตั้งค่าเพื่อรับอินเทอร์เน็ตได้อีกครั้ง หากอุปกรณ์ของคุณไม่มี GPS หรืออินเทอร์เน็ตคุณสมบัติตำแหน่งสุดท้ายที่ทราบจะไม่ช่วยคุณ

หากไม่มี GPS หรืออินเทอร์เน็ตคุณสามารถ:

  1. ถ่ายภาพท้องฟ้ายามค่ำคืนและใช้เวลาปัจจุบันในการประมาณตำแหน่งของคุณตามแผนภูมิดาว อาจต้องใช้อุปกรณ์เพิ่มเติมเพื่อให้แน่ใจว่ามุมสำหรับภาพของคุณได้รับการวัดอย่างถูกต้อง
  2. ใช้เครื่องวัดความเร่งเพื่อติดตามตำแหน่งโดยเริ่มจากตำแหน่งที่ทราบ การสะสมของข้อผิดพลาดในแนวทางแบบนี้ทำให้ไม่สามารถปฏิบัติได้ในสถานการณ์ส่วนใหญ่

3

สามารถรับตำแหน่งปัจจุบันของผู้ใช้ได้ที่นี่โดยไม่ต้องใช้ GPS และผู้ให้บริการเครือข่าย

1. Convert cellLocation to real location (Latitude and Longitude), using "http://www.google.com/glm/mmap"

2. คลิกที่นี่เพื่อการอ้างอิงของคุณ


2

ลองดู Google Maps Geolocation Api หรือยัง Google Map Geolocation

นี่คือ RestApi ที่เรียบง่ายคุณเพียงแค่ต้องโพสต์คำขอบริการจะส่งคืนตำแหน่งด้วยความแม่นยำเป็นเมตร


-1

ปรากฏว่าสามารถติดตามสมาร์ทโฟนได้โดยไม่ต้องใช้ GPS

แหล่งที่มา:

หลัก: "PinMe: ติดตามผู้ใช้สมาร์ทโฟนทั่วโลก"

รอง: "วิธีติดตามโทรศัพท์มือถือโดยไม่ใช้ GPS หรือความยินยอม"

ฉันยังไม่พบลิงก์ไปยังรหัสสุดท้ายของทีม ฉันจะโพสต์เมื่อใดหากยังไม่ได้ดำเนินการ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.