android studio 使用Mocklocation虚拟定位总结

首先需要在 AndroidManifest.xml 文件中添加「获取模拟定位信息」权限。

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

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
        tools:ignore="MockLocation"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAG"/>

然后需要打开android studio模拟器的开发者权限

step1:找到安卓的setting点开

step2:拉到最底部,点击System,再拉到最底部找到关于手机,手机版本连续点击7次,返回上一层就有一个开发者选择

 

step3:点击Developer options,往下拉,找到select mock location app,点击你需要模拟定位的app就行了。

具体app的代码,我直接贴出来了

import android.location.Criteria;
import android.location.LocationProvider;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.provider.Settings;
import android.widget.TextView;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.app.Activity;
import android.content.Context;

import android.view.View;
import android.widget.Button;

import java.util.Date;

public class MainActivity extends Activity {


    private TextView tv;//用于显示信息的TextView
    private LocationManager mLocationManager;//位置管理器
    private Button btn;//点击按钮访问
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        boolean hasAddTestProvider = false;
        LocationManager locationManager  = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        boolean canMockPosition = (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0 || Build.VERSION.SDK_INT > 22);
        if (canMockPosition && hasAddTestProvider == false)
            try {
            String providerStr = LocationManager.GPS_PROVIDER;
            LocationProvider provider = locationManager.getProvider(providerStr);
            if (provider != null) {
                locationManager.addTestProvider(
                        provider.getName()
                        , provider.requiresNetwork()
                        , provider.requiresSatellite()
                        , provider.requiresCell()
                        , provider.hasMonetaryCost()
                        , provider.supportsAltitude()
                        , provider.supportsSpeed()
                        , provider.supportsBearing()
                        , provider.getPowerRequirement()
                        , provider.getAccuracy());
            } else {
                locationManager.addTestProvider(
                        providerStr
                        , true, true, false, false, true, true, true
                        , Criteria.POWER_HIGH, Criteria.ACCURACY_FINE);
            }
            locationManager.setTestProviderEnabled(providerStr, true);
            locationManager.setTestProviderStatus(providerStr, LocationProvider.AVAILABLE, null, System.currentTimeMillis());

            // 模拟位置可用
            hasAddTestProvider = true;
            canMockPosition = true;
        } catch (SecurityException e) {
            canMockPosition = false;
        }
        if (hasAddTestProvider == true) {
            String providerStr = LocationManager.GPS_PROVIDER;
            Location mockLocation = new Location(providerStr);
            mockLocation.setLatitude(22);  // 维度(度)
            mockLocation.setLongitude(113); // 经度(度)
            mockLocation.setAltitude(30);  // 高程(米)
            mockLocation.setBearing(180);  // 方向(度)
            mockLocation.setSpeed(10);  //速度(米/秒)
            mockLocation.setAccuracy(0.1f);  // 精度(米)
            mockLocation.setTime(10);  // 本地时间
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
            }
            locationManager.setTestProviderLocation(providerStr, mockLocation);
        }
        else {
            System.out.println("hasAddTestProvider" + hasAddTestProvider);
        }
        LocationManager locMgr = (LocationManager)
                getSystemService(LOCATION_SERVICE);
        LocationListener lis = new LocationListener() {
            public void onLocationChanged(Location location) {
                //You will get the mock location
            }
            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {

            }
            @Override
            public void onProviderEnabled(String s) {

            }
            @Override
            public void onProviderDisabled(String s) {

            }
        };
        //获取到位置管理器实例
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //获取到GPS_PROVIDER
        final Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        //侦听位置发生变化,2000毫秒更新一次,位置超过8米也更新一次
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 8, new LocationListener() {

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
                // TODO Auto-generated method stub
            }
            @Override
            public void onProviderEnabled(String provider) {
                // 当GPS Location Provider可用时,更新位置
                updata(mLocationManager.getLastKnownLocation(provider));
            }
            @Override
            public void onProviderDisabled(String provider) {
                // TODO Auto-generated method stub
            }
            @Override
            public void onLocationChanged(Location location) {
                // 当GPS定位信息发生改变时,更新位置
                String temp = updata(location);
                //postinfotoweb(temp);
            }
        });
        //创建发送http请求的按钮
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = findViewById(R.id.main_btn);//绑定ID
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {//监听按钮
                new Thread(new Runnable() {//创建子线程
                    @Override
                    public void run() {
                        //getwebinfo();//把路径选到MainActivity中
                        String temp = updata(location);
                        System.out.println("location" + temp);

                    }
                }).start();//启动子线程
            }
        });
        //更新位置信息显示到TextView
        String temp = updata(location);
        //postinfotoweb(temp);
    }
    private String updata(Location location){
        if(location != null){
            StringBuilder sb = new StringBuilder();
            sb.append("实时的位置信息:\n");
            sb.append("经度:");
            sb.append(location.getLongitude());
            sb.append("\n纬度:");
            sb.append(location.getLatitude());
            sb.append("\n高度:");
            sb.append(location.getAltitude());
            sb.append("\n速度:");
            sb.append(location.getSpeed());
            sb.append("\n方向:");
            sb.append(location.getBearing());
            sb.append("\n当地时间:");
            sb.append(location.getTime());
            return sb.toString();
        }
        return  null;
    }
}


欢迎留言交流

Android Studio是一个集成开发环境(IDE),用于开发Android应用程序。它是Google官方推荐的开发工具,提供了许多功能和工具,使开发人员能够更轻松地创建和调试Android应用程序。虚拟定位是指在模拟器或设备上模拟用户的位置信息。在Android Studio中,您可以使用模拟器或连接真实设备来测试和调试应用程序,包括虚拟定位功能。 要在Android Studio中进行虚拟定位,您可以按照以下步骤操作: 1. 在Android Studio中打开您的项目。 2. 在顶部工具栏中选择“AVD Manager”图标,打开Android Virtual Device Manager。 3. 在Android Virtual Device Manager中,您可以创建新的虚拟设备或编辑现有的设备配置。如果您还没有创建设备,请点击“Create Virtual Device”按钮,并按照向导选择合适的设备类型和配置。 4. 在配置设备时,您将看到一个“Location”选项,您可以在这里设置虚拟设备的位置信息。您可以手动输入纬度和经度,或者选择地图上的位置。这将模拟设备的位置。 5. 完成设备配置后,点击“Finish”按钮创建虚拟设备。 6. 在Android Studio中启动虚拟设备,您将看到一个模拟设备的屏幕,您可以在模拟设备上测试和调试应用程序,并模拟不同的位置信息。 请注意,虚拟定位功能依赖于所使用的虚拟设备和其配置。一些虚拟设备可能没有此功能或具有不同的配置选项。确保您选择合适的设备和配置,以满足您的虚拟定位需求。 希望这可以帮助您在Android Studio中实现虚拟定位功能!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breakpoints_

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值