Android之使用GPS和NetWork定位
Android中使用GPS和NetWork获取定位信息
在Android中定位是属于危险权限,需要在添加Mainfest.xml中添加。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- 1
- 2
如果在Android6.0级以上系统,需要 动态的申请权限,也可以使用封装好 权限管理库。
定位的几种方式
在Android系统当中,给我们提供了四种定位方式,分别是:
network
它是依靠信号塔或WiFi来定位的。对应的provider字段是LocationManager.NETWORK_PROVIDER,是一种低精度,低耗电的初略定位方式。
gps
它是依靠GPS来定位的。对应的provider字段是LocationManager.GPS_PROVIDER,是高精度,高耗电的精准定位方式。
passive
被动的获取定位信息,通过接受其他APP或service的定位信息。不过需要这个权限ACCESS_FINE_LOCATION。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- 1
fused
Google已经将这个定位方式hide了。
获取定位的api封装
public class LocationUtils {private static final long REFRESH_TIME = 5000L;private static final float METER_POSITION = 0.0f;private static ILocationListener mLocationListener;private static LocationListener listener = new MyLocationListener();private static class MyLocationListener implements LocationListener {@Overridepublic void onLocationChanged(Location location) {//定位改变监听if (mLocationListener != null) {mLocationListener.onSuccessLocation(location);}}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {//定位状态监听}@Overridepublic void onProviderEnabled(String provider) {//定位状态可用监听}@Overridepublic void onProviderDisabled(String provider) {//定位状态不可用监听}}/*** GPS获取定位方式*/public static Location getGPSLocation(@NonNull Context context) {Location location = null;LocationManager manager = getLocationManager(context);//高版本的权限检查if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return null;}if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//是否支持GPS定位//获取最后的GPS定位信息,如果是第一次打开,一般会拿不到定位信息,一般可以请求监听,在有效的时间范围可以获取定位信息location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);}return location;}/*** network获取定位方式*/public static Location getNetWorkLocation(Context context) {Location location = null;LocationManager manager = getLocationManager(context);//高版本的权限检查if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return null;}if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {//是否支持Network定位//获取最后的network定位信息location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);}return location;}/*** 获取最好的定位方式*/public static Location getBestLocation(Context context, Criteria criteria) {Location location;LocationManager manager = getLocationManager(context);if (criteria == null) {criteria = new Criteria();}String provider = manager.getBestProvider(criteria, true);if (TextUtils.isEmpty(provider)) {//如果找不到最适合的定位,使用network定位location = getNetWorkLocation(context);} else {//高版本的权限检查if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return null;}//获取最适合的定位方式的最后的定位权限location = manager.getLastKnownLocation(provider);}return location;}/*** 定位监听*/public static void addLocationListener(Context context, String provider, ILocationListener locationListener) {addLocationListener(context, provider, REFRESH_TIME, METER_POSITION, locationListener);}/*** 定位监听*/public static void addLocationListener(Context context, String provider, long time, float meter, ILocationListener locationListener) {if (locationListener != null) {mLocationListener = locationListener;}if (listener == null) {listener = new MyLocationListener();}LocationManager manager = getLocationManager(context);if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}manager.requestLocationUpdates(provider, time, meter, listener);}/*** 取消定位监听*/public static void unRegisterListener(Context context) {if (listener != null) {LocationManager manager = getLocationManager(context);if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}//移除定位监听manager.removeUpdates(listener);}}private static LocationManager getLocationManager(@NonNull Context context) {return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);}/*** 自定义接口*/public interface ILocationListener {void onSuccessLocation(Location location);}
}
- 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
获取定位使用实例
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private boolean flag;private Button gsp_btn;private Button network_btn;private Button best_btn;private static Context context;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);context = getApplicationContext();initView();initListener();}private void initListener() {gsp_btn.setOnClickListener(this);network_btn.setOnClickListener(this);best_btn.setOnClickListener(this);}@Overrideprotected void onResume() {super.onResume();initPermission();//针对6.0以上版本做权限适配}private void initView() {gsp_btn = (Button) findViewById(R.id.gps);network_btn = (Button) findViewById(R.id.net);best_btn = (Button) findViewById(R.id.best);}private void initPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//检查权限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED|| ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {//请求权限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1);} else {flag = true;}} else {flag = true;}}/*** 权限的结果回调函数*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 1) {flag = grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED;}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.gps:if (flag) {getGPSLocation();} else {Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();}break;case R.id.net:if (flag) {getNetworkLocation();} else {Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();}break;case R.id.best:if (flag) {getBestLocation();} else {Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();}break;}}/*** 通过GPS获取定位信息*/public void getGPSLocation() {Location gps = LocationUtils.getGPSLocation(this);if (gps == null) {//设置定位监听,因为GPS定位,第一次进来可能获取不到,通过设置监听,可以在有效的时间范围内获取定位信息LocationUtils.addLocationListener(context, LocationManager.GPS_PROVIDER, new LocationUtils.ILocationListener() {@Overridepublic void onSuccessLocation(Location location) {if (location != null) {Toast.makeText(MainActivity.this, "gps onSuccessLocation location: lat==" + location.getLatitude() + " lng==" + location.getLongitude(), Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "gps location is null", Toast.LENGTH_SHORT).show();}}});} else {Toast.makeText(this, "gps location: lat==" + gps.getLatitude() + " lng==" + gps.getLongitude(), Toast.LENGTH_SHORT).show();}}/*** 通过网络等获取定位信息*/private void getNetworkLocation() {Location net = LocationUtils.getNetWorkLocation(this);if (net == null) {Toast.makeText(this, "net location is null", Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, "network location: lat==" + net.getLatitude() + " lng==" + net.getLongitude(), Toast.LENGTH_SHORT).show();}}/*** 采用最好的方式获取定位信息*/private void getBestLocation() {Criteria c = new Criteria();//Criteria类是设置定位的标准信息(系统会根据你的要求,匹配最适合你的定位供应商),一个定位的辅助信息的类c.setPowerRequirement(Criteria.POWER_LOW);//设置低耗电c.setAltitudeRequired(true);//设置需要海拔c.setBearingAccuracy(Criteria.ACCURACY_COARSE);//设置COARSE精度标准c.setAccuracy(Criteria.ACCURACY_LOW);//设置低精度//... Criteria 还有其他属性,就不一一介绍了Location best = LocationUtils.getBestLocation(this, c);if (best == null) {Toast.makeText(this, " best location is null", Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, "best location: lat==" + best.getLatitude() + " lng==" + best.getLongitude(), Toast.LENGTH_SHORT).show();}}}
- 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
关于GPS定位的信息还有比较多的内容,在API24中GpsStauts类过时,使用GnssStatus类替换,同时在LocationManager中的一些GPS状态的监听,也被新的API退换。
感谢http://blog.csdn.net/qq_33689414/article/details/54136922
Android之使用GPS和NetWork定位相关推荐
- android网络获取经纬,Android中透过GPS或NetWork获取当前位置的经纬度
Android中通过GPS或NetWork获取当前位置的经纬度 private double latitude=0.0; private double longitude =0.0; Location ...
- android获取当前位置经纬度,Android中通过GPS或NetWork获取当前位置的经纬度
今天在Android项目中要实现一个通过GPS或NetWork来获取当前移动终端设备的经纬度功能.要实现该功能要用到Android Framework 中的 LocationManager 类.下面我 ...
- Android之检测GPS服务和定位权限是否开启
一:效果图 1.判断是否开定位权限,没开并跳转权限界面 2.判断是否开启GPS定位服务,没开跳转相应界面去打开 二:实现代码 private LocationManager lm;//[位置管理]lm ...
- android 强制打开gps定位_Android判断GPS是否开启和强制帮用户打开GPS
引子:在我们的应用为用户提供定位服务时,通常想为用户提供精确点的定位服务,这是需要用户配合的.我们必须先检测用户手机的GPS当前是否打开,若没打开则弹出对话框提示.用户若不配合我们也没办法,只能采用基 ...
- 106.android简单的GPS实时定位
//定位权限.网络权限: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/ ...
- 安卓定位方式全总结-gps定位,network定位,ip定位,基站定位
一般我们使用的是第三方定位,因为第三方定位比较成熟,有些场景我们不需要或者不可以使用第三方定位的时候我们就需要自己去获取定位了. 文章目录 定位方式 1.gps和network(时效性差) 1.1 使 ...
- android gps 差分定位,基于Android的高精度GPS定位与土地测量应用设计
摘要: 随着移动平台技术的飞速发展,Android作为一款新兴的嵌入式操作系统,基于Android系统的移动终端应用设计成为当今应用开发的一个主流.而GPS(Global Positioning Sy ...
- android 强制打开gps定位_Android 6.0动态权限及跳转GPS设置界面的方法
1.动态权限申请 模糊的位置信息android.permission.ACCESS_COARSE_LOCATION权限为例 在AndroidManifest文件中加入权限 然后java代码中动态申请 ...
- android 自带gps定位Location相关知识
android自带gps定位功能相信大家都不会太陌生了,都有所涉及.简单的写了一个示例程序,获取经纬度还有其它相关数据的代码,还有其他相关的知识,比如直接跳转到打开系统gps设置的界面.还有一个bug ...
最新文章
- 在Ubuntu 14.04 64bit上安装批量图片处理器XnConvert
- Morris post order traversal algorithm
- Android伍什小随笔(二)- 更新中
- OpenCV图像增强(二)——Retinex图像增强
- 选择在共享模式中运行时使用的采样频率和位深度_【仪器】示波器的使用以及基本原理...
- Android USB转串口编程
- 国外网站设计欣赏:30个优秀的国外咖啡网站设计
- java weblogic 配置_java----weblogic部署应用
- Origin绘制区间图,并添加折线
- centos 5.8 mysql_linux centos5.8装yum安装mysql
- 关于离散数学的一点事情
- Intel BIGDL 探索
- Android端直播系统开发入门
- Yii2基本概念之——事件(Event)
- 色拉英语第2集第4幕: Cheers! ….hiccup
- 周末假期,去一趟安化云台山风景区
- 企业咨询行业拓客的10个经典方法
- WAP 构建 Java 应用 和 WAP经验总结
- android 音频在手机上测试播放不流畅问题
- 爱思助手安卓能用吗_苹果的蓝牙耳机安卓能用吗
热门文章
- [ChneChen的随笔]从一些影视剧原型说开去(附一:柴静 - 而我却今天才知道他的存在)
- 火萤视频桌面|火萤视频桌面下载
- 2021.11.7 力扣-周赛-分配给商店的最多商品的最小值
- 英语音标速记综述大全
- 让我们说说APP的推广方法
- Android创建AVD时出现no emulator installed和install haxm
- RemoteObject
- 如何制作有星号的条形码
- Alibaba Cloud Linux 2 LTS 快速启动优化实践
- python程序设置头像_利用python实现微信头像加红色数字功能