对于需要定位的情况,也不一定一定要集成高德和百度,android 原生也有自己GPS 定位,但是GPS 在室内是定位不到的,只能在室外定位。这样的话,通过GPS 定位,我们可以知道用户在室内还是室外,可以做适当的逻辑处理。
权限:
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 允许程序访问CellID或WiFi热点来获取粗略的位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
动态申请:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
}
初始化:
private void initLocation() {
locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
}
位置回调:
/**
* 在室外才有这个回调,室内没有
*
*/
LocationListener listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
设置监听:
locationManager .requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, 0, listener);
这里 MIN_TIME:
/**
* 5S
*/
private static final int MIN_TIME = 1000 * 5 ;
由于室内没有回调,室外才有。我们可以监控回调烂判断是否在室内。
方法:在回调里每次都延迟消息发送(时间大于回调时间),延迟发送消息前,先remove 消息,当在室内的时候,这个延迟发送的时间就会成功发送(因为室外不停的回调,会不断的remove 消息,消息最终都不能到达)
代码:
public void onLocationChanged(Location location) {
ToastUtils.show("在室外了");
handler.removeMessages(WHAT);
handler.sendEmptyMessageDelayed(WHAT,6000);
}
/**
* 检测GPS Location 回调
*/
private Handler handler = new Handler(Looper.getMainLooper())
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what)
{
case WHAT:
ToastUtils.show("现在在室内了。。。。。");
break;
}
}
};
OK。