两种定位方式:GPS定位、WiFi定位
优劣:

如果项目定位要求较高还是建议使用三方地图库

GPS定位相比Wifi定位更精准且可在无网络情况下使用,但在室内基本暴毙无法使用
WiFi定位没有室内外限制也不需要开启GPS但需要联网,另外测试发现WiFi定位时onLocationChanged函数(用于监听经纬度变化)触发间隔无法小于30s
   下面是Wifi定位的代码

public class GPSActivity extends AppCompatActivity {
public static final int LOCATION_CODE = 301;
private LocationManager locationManager;
private String locationProvider = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLocation();
}

private void getLocation () {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//获取所有可用的位置提供器
List<String> providers = locationManager.getProviders(true);
if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
//如果是Network
locationProvider = LocationManager.NETWORK_PROVIDER;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//获取权限(如果没有开启权限,会弹出对话框,询问是否开启权限)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//请求权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);
} else {
//监视地理位置变化
locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);
Location location = locationManager.getLastKnownLocation(locationProvider);
if (location != null) {
//输入经纬度
Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();
}
}
} else {
//监视地理位置变化
locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);
Location location = locationManager.getLastKnownLocation(locationProvider);
if (location != null) {
//不为空,显示地理位置经纬度
Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();
}
}
}

public LocationListener locationListener = new LocationListener() {
// Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
// Provider被enable时触发此函数,比如GPS被打开
@Override
public void onProviderEnabled(String provider) {
}
// Provider被disable时触发此函数,比如GPS被关闭
@Override
public void onProviderDisabled(String provider) {
}
//当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
@Override
public void onLocationChanged(Location location) {
if (location != null) {
//不为空,显示地理位置经纬度
Toast.makeText(GPSActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();
}
}
};

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case LOCATION_CODE:
if(grantResults.length > 0 && grantResults[0] == getPackageManager().PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "申请权限", Toast.LENGTH_LONG).show();
try {
List<String> providers = locationManager.getProviders(true);
if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
//如果是Network
locationProvider = LocationManager.NETWORK_PROVIDER;
}else if (providers.contains(LocationManager.GPS_PROVIDER)) {
//如果是GPS
locationProvider = LocationManager.GPS_PROVIDER;
}
//监视地理位置变化
locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);
Location location = locationManager.getLastKnownLocation(locationProvider);
if (location != null) {
//不为空,显示地理位置经纬度
Toast.makeText(GPSActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();
}
}catch (SecurityException e){
e.printStackTrace();
}
} else {
Toast.makeText(this, "缺少权限", Toast.LENGTH_LONG).show();
finish();
}
break;
}
}

@Override
protected void onDestroy() {
super.onDestroy();
locationManager.removeUpdates(locationListener);
}
}
别忘记在AndroidManifest.xml加权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
GPS定位只需更换下面代码

if (providers.contains(LocationManager.GPS_PROVIDER)) {
//如果是GPS
locationProvider = LocationManager.GPS_PROVIDER;
} else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
//如果是Network
locationProvider = LocationManager.NETWORK_PROVIDER;
} else {
Intent i = new Intent();
i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(i);
}
---------------------

最新文章

  1. asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法
  2. SQL初级语法 [查询: SELECT]
  3. python zip()
  4. javascript高级程序设计---Element对象
  5. nyoj1000_快速幂_费马小定理
  6. 学生成绩管理系统[C]
  7. PHP isset()与empty()的区别详解
  8. 更改DEVExpress的Column的DisplayFormat为自定义的方法。
  9. java发送带附件的邮件
  10. 使用kthread内核线程的内核模块
  11. VS2010/MFC对话框三:创建对话框类和添加控件变量
  12. Chapter 2 Open Book——15
  13. NTP服务器时间同步
  14. UVALive - 3027 Corporative Network (并查集)
  15. Netty的并发编程实践1:正确使用锁
  16. 计算机17-3,4作业E
  17. $(document).ready()和onload() html渲染时的区别
  18. nist-sha
  19. 【codeforces 242E】XOR on Segment
  20. 解决:MVC对象转json包含\r \n

热门文章

  1. git lfs
  2. RMQ(Range Minimum Query)问题(转)
  3. Activity快速入门理解
  4. [&#39;1&#39; for i in range(4)]
  5. 【184】FileZilla 搭建 FTP 及访问
  6. 【415】C语言文件读写
  7. 比Android更深远的改变世界——谷歌开源人工智能系统TensorFlow文档中文版
  8. CodeForces 722C Destroying Array (并查集)
  9. 项目迁移腾讯云后,用户反馈,https证书不匹配。
  10. HDU1254:推箱子(bfs+dfs)