ตำแหน่งจำลอง Android บนอุปกรณ์?


147

ฉันจะจำลองตำแหน่งของฉันบนอุปกรณ์จริง (Nexus One) ได้อย่างไร ฉันรู้ว่าคุณสามารถทำได้ด้วยตัวจำลองในแผงควบคุมตัวจำลอง แต่สิ่งนี้ไม่ได้ผลสำหรับอุปกรณ์ทางกายภาพ


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

6
มีแอพพลิเคชั่นหลายตัวใน Market ที่สามารถจำลองตำแหน่ง GPS ได้ ตัวอย่างเช่น "Location spoofer"
Vlad

มีแอพจำนวนมากในร้านที่ทำเช่นนี้ .. คุณสามารถลอง - play.google.com/store/apps/…หรือนี่ - play.google.com/store/apps/…
Yehuda

1
นอกจากนี้ยังมีแอพในร้านที่รองรับคำสั่ง "geo fix" และ "geo nmea" เหมือนกับตัวจำลอง! play.google.com/store/apps/…
luv

@Iuv มากกว่ามันเป็นโอเพนซอร์สgithub.com/luv/mockgeofix
ลาด

คำตอบ:


166

ดูเหมือนวิธีเดียวที่จะทำคือการใช้ผู้ให้บริการสถานที่จำลอง

คุณต้องเปิดใช้งานสถานที่จำลองในแผงการพัฒนาในการตั้งค่าและเพิ่มของคุณ

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

กับรายการของคุณ

ตอนนี้คุณสามารถเข้าไปในรหัสของคุณและสร้างผู้ให้บริการตำแหน่งจำลองของคุณเองและตั้งค่าตำแหน่งของผู้ให้บริการนี้


83
มีแอพพลิเคชั่นในท้องตลาดชื่อว่า "Fake GPS" หากคุณเปิดใช้งานตำแหน่งจำลองบนอุปกรณ์ของคุณจะมี GUI ที่ดีสำหรับการตั้งค่าตำแหน่งของคุณ ฉันรู้ว่านี่ไม่ใช่วิธีแก้ปัญหาด้วยตัวเอง แต่เป็นวิธีแก้ปัญหาที่คุ้มค่าสำหรับการทดสอบอย่างรวดเร็ว
ทิมกรีน

2
นี่อาจเป็นลิงค์ - วันเดียวกันและเนื้อหาที่เกี่ยวข้อง
Defenestration

4
@ TimGreen ของคุณควรเป็นคำตอบที่ยอมรับได้ (ไม่ใช่แค่ความคิดเห็น)! โดยวิธีที่ง่ายที่สุดในการทดสอบ
Bostone

ที่จริงแล้วแอปพลิเคชั่น "gps gps" นั้นไม่ได้ดีที่สุดเพราะมันสามารถตั้งค่าสถานที่และสุ่มไปมา เวอร์ชันใหม่ของพวกเขาสามารถกำหนดเส้นทางได้ แต่จะทำซ้ำเฉพาะจุดที่มีการกระโดดข้ามสถานที่ขนาดใหญ่ คำตอบของ Janusz นั้นถูกต้องแน่นอนว่าคุณต้องสร้างผู้ให้บริการจำลองของคุณเอง เราเพิ่งทำเช่นนั้นและหากใครต้องการหรือถ้าคำถามนี้ยังต้องการความช่วยเหลือฉันจะโพสต์รหัส
vkinra

5
คำสั่ง "ไปในรหัสของคุณและสร้างผู้ให้บริการสถานที่จำลองของคุณ" ควรจะอธิบายในรายละเอียดเพิ่มเติม
Dims

102

หากคุณใช้โทรศัพท์นี้เฉพาะในห้องปฏิบัติการพัฒนามีโอกาสที่คุณจะสามารถประสานชิป GPS และฟีดพอร์ตอนุกรมโดยตรงด้วยลำดับ NMEA จากอุปกรณ์อื่น


68
ทำไมถึงเกลียดชัง? คำตอบนี้เป็นแกนแข็งสุดยอดมาก
Ben Zotto

61
ไม่ยอมใครง่ายๆ Awesomely แม้ว่าไร้ประโยชน์สุดเหวี่ยง / ไม่เกี่ยวข้องด้วย
olivervbk

13
สนุกพอ แต่
etienne

23
อืมฉันคิดว่าทุกคนที่คำตอบนี้จะเกี่ยวข้องกันรู้อยู่แล้วว่าพวกเขาสามารถทำได้ ฉันสงสัยว่าทั้งสามคนกำลังค้นหา stackoverflow เพื่อหาทางแก้ไข
ToolmakerSteve

10
หากคุณมีปัญหาในการหาวิธีสร้างลำดับ NMEA จริงลงในอุปกรณ์ที่ยังไม่ได้จำหน่ายของคุณมีตัวเลือกที่ยอดเยี่ยม: ประสานอุปกรณ์ GPS ภายนอกจริงและย้ายห้องปฏิบัติการพัฒนาทั้งหมดไปตามแทร็กที่แท้จริงของทีมนักวิ่ง / นักขี่จักรยาน / รถยนต์ / เครื่องบิน / อะไรก็ตามขึ้นอยู่กับความเร็วที่คุณต้องการจำลอง อย่าลืมเปิดรูบนหลังคาของห้องปฏิบัติการพัฒนาเพื่อให้อุปกรณ์สามารถรับสัญญาณวิทยุจากดาวเทียมได้ ไม่เป็นไร ;-)
สเตฟานโกริชน

32

ฉันหวังว่าฉันจะมีสายเคเบิลของฉันมีประโยชน์ ฉันรู้ว่าคุณสามารถ telnet เพื่อจำลองเพื่อเปลี่ยนตำแหน่ง

$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK

ฉันจำไม่ได้ว่าคุณสามารถ telnet ไปยังอุปกรณ์ของคุณ แต่ฉันคิดว่าคุณทำได้ ฉันหวังว่านี่จะช่วยได้.

คุณจะต้องใช้ adb (สะพานแก้จุดบกพร่อง Android) สำหรับสิ่งนี้ (CLI)


คุณได้รับอนุญาตปฏิเสธทุกสิ่งที่คุณส่งเป็นคำสั่งไปยังคอนโซลของอุปกรณ์ของคุณ อาจเป็นไปได้ด้วยแอปพลิเคชันเทอร์มินัล แต่ฉันคิดว่าต้องใช้การเข้าถึงรูท
Janusz

เพียงแค่เราอยู่ในหน้าเดียวกัน: คุณไม่ได้พูดถึง "adb shell" คุณ? สิ่งที่ฉันกำลังพูดถึงนั้นแตกต่างกันนี่คือการตั้งค่าบางอย่างที่อนุญาตให้คุณตั้งค่าพารามิเตอร์เฉพาะหุ่นยนต์ ตัวอย่างเช่นฉันรู้ว่าคุณสามารถตั้งค่าการส่งต่อพอร์ต (เช่น localhost: 1234 ไปที่โทรศัพท์: 1234) โดยไม่ต้องเข้าถึงรูทดังนั้นคุณสามารถตั้งค่าพร็อกซี SOCKS และอุโมงค์ผ่านสายเคเบิลโดยไม่มีรูต
ทิมกรีน

คุณสามารถใช้ adb forward tcp: 6000 tcp: 23 เพื่อส่งต่อพอร์ต 6000 บนเครื่องของคุณไปยังพอร์ต 23 บนอุปกรณ์ แต่ฉันไม่สามารถเชื่อมต่อได้แม้ว่าพอร์ตจะแสดงเป็นเปิด การใช้ไคลเอ็นต์ telnet บนอุปกรณ์และการเชื่อมต่อกับ localhost ก็ล้มเหลวด้วย
Janusz

15
มันใช้งานได้ดีสำหรับอีมูเลเตอร์ แต่ไม่ทำงานสำหรับอุปกรณ์จริง ดังนั้นจึงไม่ตอบคำถามของ OP เลย :(
Matthew Gilliard

4
@TimGreen โซลูชันของคุณสำหรับอีมูเลเตอร์เท่านั้น คำถามเกี่ยวกับอุปกรณ์จริง
IgorGanapolsky

29

คุณสามารถใช้สิทธิ์บริการตำแหน่งเพื่อจำลองตำแหน่ง ...

"android.permission.ACCESS_MOCK_LOCATION"

และในจาวาโค้ดของคุณ

// Set location by setting the latitude, longitude and may be the altitude...
String[] MockLoc = str.split(",");
Location location = new Location(mocLocationProvider);            
Double lat = Double.valueOf(MockLoc[0]);
location.setLatitude(lat);
Double longi = Double.valueOf(MockLoc[1]);
location.setLongitude(longi);
Double alti = Double.valueOf(MockLoc[2]);
location.setAltitude(alti);

9
ค่าของ mocLocationProvider คืออะไร?
วิกเตอร์

เช่น LocationManager.GPS_PROVIDER
enigma969

25

ฉันประสบความสำเร็จกับรหัสต่อไปนี้ แม้ว่ามันจะให้ฉันล็อคเดียวด้วยเหตุผลบางอย่าง (แม้ว่าฉันได้ลองคู่ LatLng ที่แตกต่างกัน) มันทำงานได้สำหรับฉัน mLocationManagerเป็นสิ่งLocationManagerที่เกี่ยวกับLocationListener:

private void getMockLocation()
{
    mLocationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
    mLocationManager.addTestProvider
    (
      LocationManager.GPS_PROVIDER,
      "requiresNetwork" == "",
      "requiresSatellite" == "",
      "requiresCell" == "",
      "hasMonetaryCost" == "",
      "supportsAltitude" == "",
      "supportsSpeed" == "",
      "supportsBearing" == "",

      android.location.Criteria.POWER_LOW,
      android.location.Criteria.ACCURACY_FINE
    );      

    Location newLocation = new Location(LocationManager.GPS_PROVIDER);

    newLocation.setLatitude (/* TODO: Set Some Lat */);
    newLocation.setLongitude(/* TODO: Set Some Lng */);

    newLocation.setAccuracy(500);

    mLocationManager.setTestProviderEnabled
    (
      LocationManager.GPS_PROVIDER, 
      true
    );

    mLocationManager.setTestProviderStatus
    (
       LocationManager.GPS_PROVIDER,
       LocationProvider.AVAILABLE,
       null,
       System.currentTimeMillis()
    );      

    mLocationManager.setTestProviderLocation
    (
      LocationManager.GPS_PROVIDER, 
      newLocation
    );      
}

1
โพสต์ที่ดีโปรดดูคำตอบของฉันด้านล่างเพื่อเพิ่มเติม
icyerasor

เท่าที่ฉันจำได้setTestProviderStatusจะใช้ที่นี่เพื่อแจ้งเตือน / โพสต์ไปยัง / กำหนดเวลาเหตุการณ์ด้วย LocationManager ที่ผู้ให้บริการ GPS พบการแก้ไข "ตอนนี้" เพื่อให้การประมวลผลของเหตุการณ์ดังกล่าวสามารถเกิดขึ้นได้
Dr1Ku

ความหมายของ " mLocationManagerคืออะไรLocationManagerซึ่งขึ้นอยู่กับ LocationListener"? ฉันจะทำสิ่งนี้ได้อย่างไร ขอบคุณ ..
Yehuda

นี่คือหนึ่งบทความอธิบายวิธีการตรวจสอบสำหรับการเปลี่ยนแปลงสถานที่ที่ใช้LocationManagerบริการและLocationListener: blog.doityourselfandroid.com/2010/12/25/...
Dr1Ku

2
บวก 1 สำหรับวิธีที่คุณเป็นตัวแทนของจริงและเท็จในวิธีการ addTestProvider
A.Alqadomi

16

สิ่งที่ Dr1Ku โพสต์ทำงานได้ ใช้รหัสวันนี้ แต่ต้องการเพิ่ม locs เพิ่มเติม ดังนั้นนี่คือการปรับปรุงบางอย่าง:

ทางเลือก: แทนที่จะใช้สตริง LocationManager.GPS_PROVIDER คุณอาจต้องการกำหนด constat PROVIDER_NAME ของคุณเองและใช้มัน เมื่อลงทะเบียนเพื่ออัปเดตตำแหน่งให้เลือกผู้ให้บริการผ่านเกณฑ์แทนการระบุโดยตรงเป็นสตริง

ครั้งแรก: แทนที่จะเรียก removeTestProvider ก่อนอื่นให้ตรวจสอบว่ามีผู้ให้บริการที่จะลบหรือไม่ (เพื่อหลีกเลี่ยง IllegalArgumentException):

if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
  mLocationManager.removeTestProvider(PROVIDER_NAME);
}

ที่สอง: ในการเผยแพร่มากกว่าหนึ่งที่ตั้งคุณต้องตั้งเวลาสำหรับที่ตั้ง:

newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);

นอกจากนี้ยังมีการทดสอบ google ที่ใช้ MockLocationProviders: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

ตัวอย่างการทำงานที่ดีอีกตัวอย่างสามารถดูได้ที่: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/

อีกบทความที่ดีคือ: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 นอกจากนี้คุณยังจะพบรหัสบางอย่างที่ใช้งานได้จริงสำหรับ ฉันในโปรแกรมจำลอง


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

@ Dr1KU ยังคงเป็นกรณีที่คุณไม่สามารถเปลี่ยนกลับเป็น GPS ปกติได้หรือไม่? ที่ระบุไว้ที่ไหนสักแห่ง?
Kaz Dragon

@KazDragon นั่นเป็นกรณีที่กลับมาแล้ว จากสิ่งที่ฉันจำได้หลังจากเปิดเครื่องMock ProviderGPS ปกติจะไม่ทำงานฉันไม่สามารถแก้ไขได้ (ฉันกำลังทดสอบอุปกรณ์โดยตรง) นี่อาจไม่เป็นเช่นนั้นเนื่องจากมีเหตุการณ์มากมายเกิดขึ้นใน Android ตั้งแต่นั้นมา
Dr1Ku

@ Dr1Ku อ่าฉันกำลังทำสิ่งที่คล้ายกันมากในขณะนี้และรับผลลัพธ์ที่คล้ายกับที่คุณอธิบายไว้ ฉันหวังว่าจะทราบว่านี่เป็นข้อ จำกัด ที่มีอยู่ในแพลตฟอร์มหรือว่าฉันเพิ่งพลาดการเรียกฟังก์ชั่นไปที่อื่น ฉันน่าจะถามคำถามนี้
Kaz Dragon

9

มีแอพที่มีอยู่ใน Android Market ที่ให้คุณระบุ "ตำแหน่งจำลอง" สำหรับอุปกรณ์ของคุณ

ฉันค้นหาhttps://market.android.comและพบแอปที่ชื่อว่า "My Fake Location" ที่เหมาะกับฉัน

ผู้ให้บริการ GPS จำลองที่กล่าวถึงโดย Paul ด้านบน (ที่http://www.cowlumbus.nl/forum/MockGpsProvider.zip ) เป็นอีกตัวอย่างหนึ่งที่มีซอร์สโค้ด - แม้ว่าฉันจะไม่สามารถติดตั้ง APK ที่ให้มาได้ (กล่าวว่าล้มเหลว [INSTALL_FAILED_OLDER_SDK] และอาจต้องการคอมไพล์ใหม่)

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

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


GPS ปลอมนั้นง่ายกว่า ฉันแค่สงสัยว่าทำไมพวกเขาจึงขอรหัสผู้โทรในการอนุญาตแอพ: S
Guillaume Massé

8

สิ่งนี้ใช้ได้สำหรับฉัน (Android Studio):

ปิดใช้งานการติดตาม GPS และ WiFi บนโทรศัพท์ บน Android 5.1.1 และด้านล่างเลือก "เปิดใช้งานตำแหน่งจำลอง" ในตัวเลือกของนักพัฒนา

ทำสำเนารายการของคุณในไดเรกทอรี src / debug เพิ่มรายการต่อไปนี้ (นอกแท็ก "แอปพลิเคชัน"):

Android ใช้สิทธิ์: name = "android.permission.ACCESS_MOCK_LOCATION"

ตั้งค่าส่วนแผนที่เรียกว่า "แผนที่" รวมรหัสต่อไปนี้ใน onCreate ():

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
ll = new MyLocationListener();
if (lm.getProvider("Test") == null) {
    lm.addTestProvider("Test", false, false, false, false, false, false, false, 0, 1);
}
lm.setTestProviderEnabled("Test", true);
lm.requestLocationUpdates("Test", 0, 0, ll);

map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng l) {
        Location loc = new Location("Test");
        loc.setLatitude(l.latitude);
        loc.setLongitude(l.longitude);
        loc.setAltitude(0); 
        loc.setAccuracy(10f);
        loc.setElapsedRealtimeNanos(System.nanoTime());
        loc.setTime(System.currentTimeMillis()); 
        lm.setTestProviderLocation("Test", loc);
    }
};

โปรดทราบว่าคุณอาจต้องเพิ่ม "minSdkVersion" ในโมดูลไฟล์ gradle ของคุณชั่วคราวเป็น 17 เพื่อใช้วิธีการ "setElapsedRealtimeNanos"

รวมรหัสต่อไปนี้ไว้ในคลาสกิจกรรมหลัก:

private class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        // do whatever you want, scroll the map, etc.
    }
}

เรียกใช้แอปของคุณด้วย AS ใน Android 6.0 ขึ้นไปคุณจะได้รับข้อยกเว้นด้านความปลอดภัย ตอนนี้ไปที่ตัวเลือกของนักพัฒนาในการตั้งค่าและเลือก "เลือกแอปจำลองตำแหน่ง" เลือกแอพของคุณจากรายการ

ตอนนี้เมื่อคุณแตะบนแผนที่ onLocationChanged () จะเริ่มต้นด้วยพิกัดของการแตะของคุณ

ฉันเพิ่งรู้เรื่องนี้ดังนั้นตอนนี้ฉันไม่ต้องเดินไปรอบ ๆ บริเวณใกล้เคียงด้วยโทรศัพท์ในมือ


ฉันคิดว่ามันใช้งานได้กับ Android 6 ถ้าคุณใส่รหัสนี้ในการให้บริการ
Hamza

7

ฉันได้สร้างตัวจัดการแบบง่ายจำลองตำแหน่งการเคลื่อนที่จากตำแหน่งเริ่มต้น

เริ่มในการติดต่อกลับของคุณ:

private final GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
    @Override
    public void onConnected(Bundle bundle) {
        if (BuildConfig.USE_MOCK_LOCATION) {
            LocationServices.FusedLocationApi.setMockMode(mGoogleApiClient, true);
            new MockLocationMovingHandler(mGoogleApiClient).start(48.873399, 2.342911);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }
};

ชั้นจัดการ:

   private static class MockLocationMovingHandler extends Handler {

    private final static int SET_MOCK_LOCATION = 0x000001;
    private final static double STEP_LATITUDE =  -0.00005;
    private final static double STEP_LONGITUDE = 0.00002;
    private final static long FREQUENCY_MS = 1000;
    private GoogleApiClient mGoogleApiClient;
    private double mLatitude;
    private double mLongitude;

    public MockLocationMovingHandler(final GoogleApiClient googleApiClient) {
        super(Looper.getMainLooper());
        mGoogleApiClient = googleApiClient;
    }

    public void start(final double initLatitude, final double initLongitude) {
        if (hasMessages(SET_MOCK_LOCATION)) {
            removeMessages(SET_MOCK_LOCATION);
        }
        mLatitude = initLatitude;
        mLongitude = initLongitude;
        sendEmptyMessage(SET_MOCK_LOCATION);
    }

    public void stop() {
        if (hasMessages(SET_MOCK_LOCATION)) {
            removeMessages(SET_MOCK_LOCATION);
        }
    }

    @Override
    public void handleMessage(Message message) {
        switch (message.what) {
            case SET_MOCK_LOCATION:
                Location location = new Location("network");
                location.setLatitude(mLatitude);
                location.setLongitude(mLongitude);
                location.setTime(System.currentTimeMillis());
                location.setAccuracy(3.0f);
                location.setElapsedRealtimeNanos(System.nanoTime());
                LocationServices.FusedLocationApi.setMockLocation(mGoogleApiClient, location);

                mLatitude += STEP_LATITUDE;
                mLongitude += STEP_LONGITUDE;
                sendEmptyMessageDelayed(SET_MOCK_LOCATION, FREQUENCY_MS);
                break;
        }
    }
}

หวังว่ามันจะช่วย ..


6

วิธีแก้ปัญหาที่กล่าวถึงโดย icyerasor และจัดหาโดย Pedro ที่ http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ ทำงานได้ดีมากสำหรับฉัน อย่างไรก็ตามมันไม่ได้ให้การสนับสนุนสำหรับการเริ่มต้นการหยุดและการรีสตาร์ทผู้ให้บริการ GPS จำลองอย่างถูกต้อง

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

รหัสพร้อมกับโครงการตัวอย่างสำหรับ Eclipse สามารถพบได้ใน GitHub: https://github.com/paulhoux/Android-MockProviderGPS

เครดิตทั้งหมดควรไปที่ Pedro เพื่อทำงานอย่างหนัก


6

เพิ่มในรายการของคุณ

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
    tools:ignore="MockLocation,ProtectedPermissions" />

ฟังก์ชันตำแหน่งจำลอง

void setMockLocation() {
    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    locationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, false,
            false, false, true, true, true, 0, 5);
    locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);

    Location mockLocation = new Location(LocationManager.GPS_PROVIDER);
    mockLocation.setLatitude(-33.852);  // Sydney
    mockLocation.setLongitude(151.211);
    mockLocation.setAltitude(10);
    mockLocation.setAccuracy(5);
    mockLocation.setTime(System.currentTimeMillis());
    mockLocation.setElapsedRealtimeNanos(System.nanoTime());
    locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, mockLocation);
}

คุณจะต้องเปิดใช้งานตำแหน่งจำลองในการตั้งค่าผู้พัฒนาอุปกรณ์ของคุณ หากยังไม่พร้อมใช้งานให้ตั้ง "แอปพลิเคชันตำแหน่งจำลอง" เป็นแอปพลิเคชันของคุณเมื่อมีการใช้งานด้านบน


3

แอพ GPS ปลอมจาก google play ช่วยฉันได้ เพียงให้แน่ใจว่าคุณอ่านเส้นทางทั้งหมดในคำอธิบายแอพ คุณต้องปิดการใช้งานบริการระบุตำแหน่งอื่น ๆ รวมถึงเริ่มแอพหลังจากเปิดใช้งาน "Fake GPS" ทำงานได้ดีสำหรับสิ่งที่ฉันต้องการ

นี่คือลิงค์ไปยังแอปใน GooglePlay: Fake GPS



2

ติดตั้งแอพปลอม GPS https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=th

ตัวเลือกของนักพัฒนา -> เลือกแอปจำลองตำแหน่ง (หมายถึงแอพปลอมที่ตั้ง)

แอพ GPS ปลอม :

แท็บสองครั้งบนแผนที่เพื่อเพิ่ม -> คลิกปุ่มเล่น -> แสดงขนมปัง "หยุดตำแหน่งปลอม"

ในที่สุดตรวจสอบกับแอพ google map


2

ฉันเขียนแอพที่ใช้งาน WebServer (REST-Like) บนโทรศัพท์ Android ของคุณเพื่อให้คุณสามารถตั้งตำแหน่ง GPS จากระยะไกลได้ เว็บไซต์จัดทำแผนที่ซึ่งคุณสามารถคลิกเพื่อกำหนดตำแหน่งใหม่หรือใช้ปุ่ม "wasd" เพื่อเลื่อนไปในทิศทางใดก็ได้ แอปเป็นวิธีแก้ปัญหาอย่างรวดเร็วดังนั้นจึงแทบไม่มี UI หรือเอกสาร แต่การนำไปใช้งานนั้นเป็นไปอย่างรวดเร็วและคุณสามารถค้นหาทุกอย่างในชั้นเรียน (เพียงสี่)

ที่เก็บโครงการ: https://github.com/juliusmh/RemoteGeoFix


1

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

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

    ll = new LocationListener() {        
        public void onLocationChanged(Location location) {  
          // Called when a new location is found by the network location provider.  
            onGPSLocationChanged(location); 
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {       
            bigInfo.setText("Changed "+ status);  
        }

        public void onProviderEnabled(String provider) {
            bigInfo.setText("Enabled "+ provider);
        }

        public void onProviderDisabled(String provider) {
            bigInfo.setText("Disabled "+ provider);
        }
      };

เมื่อ GPS ได้รับการปรับปรุงให้เขียนวิธีการต่อไปนี้เพื่อทำสิ่งที่คุณต้องการ

public void onGPSLocationChanged(Location location){  
if(location != null){  
    double pLong = location.getLongitude();  
    double pLat = location.getLatitude();  
    textLat.setText(Double.toString(pLat));  
    textLong.setText(Double.toString(pLong));  
    if(autoSave){  
        saveGPS();  
        }
    }
}

อย่าลืมที่จะนำเหล่านี้ในที่ประจักษ์
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION


0

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


0

อาจไม่ใช่วิธี 'โปรแกรมเมอร์' แต่ถ้าคุณต้องการประหยัดเวลาและหาวิธีแก้ปัญหาในการทำงานลองใช้แอปหนึ่งในแอปที่อุทิศให้กับสถานที่จำลองใน Google Play:

สกูตเตอร์ตำแหน่ง GPS ปลอม

สถานที่จำลอง

ตำแหน่ง GPS ปลอม


1
คุณลองพวกเขาเหรอ? พวกเขาทำงานตามที่ร้องขอในคำถามหรือไม่
arekolek

การตั้งค่าใด ๆ หรือไม่ต้องการทั้งหมดของพวกเขา : P
arekolek

ตำแหน่ง GPS ปลอม Spoofer ดีพอ แต่ตำแหน่งจำลองช่วยให้สามารถกำหนดเส้นทางซึ่งเป็นคุณสมบัติที่ดี
klimat

0

ใช้ประโยชน์จากเครื่องมือจำลองตำแหน่งแบบโต้ตอบที่สะดวกและฟรีสำหรับโทรศัพท์และแท็บเล็ต Android (ชื่อ CATLES) มันสร้างตำแหน่ง GPS ในระดับระบบ (แม้ในแอพ Google Maps หรือ Facebook) และทำงานได้ทั้งบนอุปกรณ์จริงและอุปกรณ์เสมือน:

เว็บไซต์: http://ubicom.snet.tu-berlin.de/catles/index.html

วิดีโอ: https://www.youtube.com/watch?v=0WSwH5gK7yg


0

ใช้สิทธิ์นี้ในไฟล์ Manifest

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">

android studio จะแนะนำว่า "ควรจะขอตำแหน่งจำลองในไฟล์ทดสอบหรือดีบักเฉพาะรายการ (โดยทั่วไปคือ src / debug / AndroidManifest.xml)" เพียงปิดการใช้งานการตรวจสอบ

ตอนนี้ให้แน่ใจว่าคุณได้ตรวจสอบ " อนุญาตสถานที่จำลอง " ในการตั้งค่านักพัฒนาของโทรศัพท์ของคุณ

ใช้ LocationManager

locationManager.addTestProvider(mocLocationProvider, false, false,
                false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);

ตอนนี้ตั้งค่าตำแหน่งทุกที่ที่คุณต้องการ

Location mockLocation = new Location(mocLocationProvider); 
mockLocation.setLatitude(lat); 
mockLocation.setLongitude(lng); 
mockLocation.setAltitude(alt); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 

0

การแก้ปัญหาดังกล่าวข้างต้นไม่ได้ทำงานสำหรับฉันเพราะฉันถูกทดสอบบนอุปกรณ์ Android กับรุ่นล่าสุดบริการของ Google Play ซึ่งใช้FusedLocationProviderClient หลังจากตั้งค่าการอนุญาตตำแหน่งจำลองในรายการแอพและแอปเป็นแอปจำลองตำแหน่งที่ระบุในการตั้งค่านักพัฒนาซอฟต์แวร์ (ตามที่ระบุไว้ในคำตอบก่อนหน้า) จากนั้นฉันเพิ่มรหัส Kotlin ด้านล่างซึ่งจำลองตำแหน่งเรียบร้อยแล้ว

locationProvider = FusedLocationProviderClient(context)
locationProvider.setMockMode(true)

val loc = Location(providerName)
val mockLocation = Location(providerName) // a string
mockLocation.latitude = latitude  // double
mockLocation.longitude = longitude
mockLocation.altitude = loc.altitude
mockLocation.time = System.currentTimeMillis()
mockLocation.accuracy = 1f
mockLocation.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    mockLocation.bearingAccuracyDegrees = 0.1f
    mockLocation.verticalAccuracyMeters = 0.1f
    mockLocation.speedAccuracyMetersPerSecond = 0.01f
}
//        locationManager.setTestProviderLocation(providerName, mockLocation)
locationProvider.setMockLocation(mockLocation)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.