Android通过原生Api获取经纬度:
原生定位API只能定位到经纬度,但是如果要定位具体的地址,则需要将经纬度信息发送到谷歌服务器,进行反向地理位置解析,因为目前
国内无法连接谷歌服务器,所以使用原生定位API就不合适了,而且百度定位的功能多又强,非常适合用来定位以及获取地图等.
工具类:
public class LocationUtils {
private static Context mContext;
private static LocationUtils mInstance;
public static final String TAG = "LocationUtils";
private LocationUtils(Context mContext) {
this.mContext = mContext;
}
public static LocationUtils getInstance(Context context){
if (mInstance == null){
synchronized (LocationUtils.class){
if (mInstance == null){
mInstance = new LocationUtils(context);
mContext = context;
}
}
initLocation();
}
return mInstance;
}
static LocationManager locationManager;
static Location location;
static String provider;
public static void initLocation() {
locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
// 获取所有可用的位置提供器
List<String> providerList = locationManager.getProviders(true);
if (providerList.contains(LocationManager.GPS_PROVIDER)) {
provider = LocationManager.GPS_PROVIDER;
} else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
} else {
// 当没有可用的位置提供器时,弹出Toast提示用户
Toast.LENGTH_SHORT).show();
LogUtil.d(TAG,"No location provider to use");
return;
}
location = locationManager.getLastKnownLocation(provider);
/*if (location != null) {
// 显示当前设备的位置信息
showLocation(location);
}*/
locationManager.requestLocationUpdates(provider, 5000, 1, locationListener);
}
/**
* 获取位置信息
* @return
*/
public static Map<String, String> getLocation() {
return showLocation(location);
}
public static Map<String, String> showLocation(Location location) {
if(location == null)return null;
Map<String, String> map = new HashMap<>();
map.put("longitude", String.valueOf(location.getLongitude()));
map.put("latitude", String.valueOf(location.getLatitude()));
return map;
}
public static LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// 更新当前设备的位置信息
showLocation(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
public void remove() {
if (locationManager != null) {
// 关闭程序时将监听器移除
locationManager.removeUpdates(locationListener);
}
}
}
百度定位:
如果需要使用百度定位,请到http://lbsyun.baidu.com/location/ 上去选择定位服务,百度定位SDK版本为 v7.3,只需要选择功能开发包
下载-->>选择全量定位功能,点击开发包下载即可,大小只有733kb.
**使用百度定位:**
1.创建应用-->>Android SDK...
2.获取开发版和正式版SHA1方法:
1).正式版SHA1获取:
打开cmd,输入:keytool -list -v -keystore E:\use-by-me.jks(不需要定位到文件所在位置)
然后输入自己创建jks数字签名时的密码 这里是:123456
2).开发版SHA1获取:
cmd命令(进入.android文件夹下):cd C:\Users\Administrator\.android
输入:keytool -list -v -keystore debug.keystore
注意:密码为 android
**注意点:**
1)当您选择使用v4.0及之后版本的定位SDK时,需要先申请且配置AK,并在程序相应位置填写您的AK。(选择使用v3.3及之前版本SDK
的开发者,不需要使用AK).
2)每个AK仅且唯一对于1个应用验证有效.
3)若您需要在同一个工程中同时使用Android定位SDK和Android地图SDK,可以使用同一个AK.
4)Android定位SDK提供了多种CPU架构的so文件(jar通用,只有一个),所以会出现armeabi、arm64-v8a、armeabi-v7a、
x86、x86_64看起来名称一样重复的.so文件,其实是为了支持多种CPU而准备的。但是BaiduLBS_Android.jar这个jar文件只有一个,
所以只要将下载的全量定位功能开发包中所有的so以及jar放到工程libs目录下即可。
5)使用带有室内精准定位的SDK版本时,需增加集成库文件libindoor.so.
6)新版本的定位SDK,开发者除了要更新jar包之外,同时需要关注so文件是否有更新。如果so文件名称改变,即so文件有更新,开发者
要及时替换掉老版本,否则会导致定位失败.
7)室内外网定位成功,室内内网定位失败.