首先需要在 AndroidManifest.xml 文件中添加「获取模拟定位信息」权限。
1
2
3
4
5
6
7
8
9
|
<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的代码,我直接贴出来了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
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 使用Mocklocation虚拟定位,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://blog.csdn.net/breakpoints_/article/details/103644164