您的位置:首页 > 移动开发 > Android开发

Android中使用GPS和NetWork获取定位信息

2017-10-11 08:12 513 查看
在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 {
@Override
public void onLocationChanged(Location location) {//定位改变监听
if (mLocationListener != null) {
mLocationListener.onSuccessLocation(location);
}
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {//定位状态监听

}

@Override
public void onProviderEnabled(String provider) {//定位状态可用监听

}

@Override
public 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;

@Override
protected 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);
}

@Override
protected 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;
}
}

/**
* 权限的结果回调函数
*/
@Override
public 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;
}
}

@Override
public 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() {
@Override
public 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退换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: