安卓中实现定位功能

  你们好,今天咱们讲一下比较热门的定位服务,闲话少叙直奔主题。由于是使用高德地图因此首先我们就得先在高德开发平台上注册一个帐号,具体注册流程在这里就不一一赘诉了,下面就讲一下再注册成功以后如何申请key,要申请key就得须要发布版NAS1码与测试版NAS1码以及工程的包地址,下面就讲一下如何获取NAS1码。java

第一步:申请NAS1
 
     一、如果想得到发布版的NAS1码,就得先把你的工程打包,打包成功后你就会得到一个以.jsk为后缀名的文件,打包的时候你会设置一个密码,一会用到这个文件的储存路径以及你设置的密码。
 
    二、打开你的androidstudio选择你的工程,在控制台选择Terminal目录下,在光标显示的地方输入 keytool -v -list -KeyStore KeyStore文件地址 这段代码 ,KeyStore文件地址就是你的.jsk文件的地址,输入完后按回车会让你输入密码你直接输入,注意你输入密码的时候控制台并不显示,但没关系控制台已经录入,而后按回车就会出现一系列的信息其中就包括NAS1码,这个就是发布版的NAS1码。
 
    三、如何得到测试版的NAS1码,这里就须要本身写一个工具类来把测试版的NAS1打印出来,具体工具类代码以下:
 1 import android.content.Context;
 2 import android.content.pm.PackageInfo;
 3 import android.content.pm.PackageManager;
 4 
 5 import java.security.MessageDigest;
 6 import java.security.NoSuchAlgorithmException;
 7 import java.util.Locale;
 8 
 9 /**
10  * Created by zhangdi on 2016/9/2.
11  * 用来获取测试版SHA1的工具类
12  */
13 public class Sha1 {
14     public static String sHA1(Context context) {
15         try {
16             PackageInfo info = context.getPackageManager().getPackageInfo(
17                     context.getPackageName(), PackageManager.GET_SIGNATURES);
18             byte[] cert = info.signatures[0].toByteArray();
19             MessageDigest md = MessageDigest.getInstance("SHA1");
20             byte[] publicKey = md.digest(cert);
21             StringBuffer hexString = new StringBuffer();
22             for (int i = 0; i < publicKey.length; i++) {
23                 String appendString = Integer.toHexString(0xFF & publicKey[i])
24                         .toUpperCase(Locale.US);
25                 if (appendString.length() == 1)
26                     hexString.append("0");
27                 hexString.append(appendString);
28                 hexString.append(":");
29             }
30             String result = hexString.toString();
31             return result.substring(0, result.length()-1);
32         } catch (PackageManager.NameNotFoundException e) {
33             e.printStackTrace();
34         } catch (NoSuchAlgorithmException e) {
35             e.printStackTrace();
36         }
37         return null;
38     }
39 }

得到NAS1码就直接类名.方法名就能够打印出来。至此第一步得到NAS1码的工序就完成了,下面就能够去高德开发平台上申请key了,注意他还须要一个包名,即pagename,这就是你工程中的清单文件下的android

 1 package="com.jereh.biyingapplication" api

而后就完成申请key的步骤了。
 
第二步:导入jar包(jar包我只提供了包名,你们能够去GitHub上自行下载,若是你们感受麻烦能够去个人有道笔记里下载,文末我会附上此篇文章的有道连接)
 
     一、首先须要下载这个jar包
  AMap_Location_V2.8.0_20160811.jar
之后若是再要开发2D地图还须要导入这个Jar包
  AMap_2DMap_V2.9.0_20160525.jar
导入包并添加依赖成功后就能够进入正题,定位服务了!!!
 
第三步:实现定位功能
    一、由于定位功能须要获取APP的位置信息,因此安卓6.0版本之上的还须要获取权限,关于如何获取权限,你们能够参考个人判断权限以及获取权限的那篇文章,这里就不赘述了
    二、一样由于权限问题,你们还须要在工程的清单文件里添加下面这些请求:
 1 <!-- Normal Permissions 不须要运行时注册 -->
 2 <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
 3 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 4 <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
 5 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 6 <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
 7 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
 8 <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
 9 
10 <!-- 请求网络 -->
11 <uses-permission android:name="android.permission.INTERNET" />
12 
13 <!-- 不是SDK须要的权限,是示例中的后台唤醒定位须要的权限 -->
14 <uses-permission android:name="android.permission.WAKE_LOCK" />
15 
16 <!-- 须要运行时注册的权限 -->
17 <!-- 用于进行网络定位 -->
18 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
19 <!-- 用于访问GPS定位 -->
20 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
21 
22 <!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 -->
23 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
24 <!-- 读取缓存数据 -->
25 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
26 
27 <!-- 用于读取手机当前的状态 -->
28 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
29 
30 <!-- 更改设置 -->
31 <uses-permission android:name="android.permission.WRITE_SETTINGS" />
32 
33 <!-- 外部存储的权限 -->
34 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
35 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
36 <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />

这个也不是都用于请求位置信息权限,你们用到什么能够选择性的添加,由于定位是一个服务(service)因此再往下就是要为这个service在清单文件里声明一下,以下代码,直接copy:缓存

<!-- 定位服务 -->
<service android:name="com.amap.api.location.APSService" />

<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="6cd0117ba5d8e074a98ba70906f3efe2">

    <!-- 开发者申请的key -->
</meta-data>
这里须要注意的是value里填写的值是你从高德开发平台上申请的key值,作好这一切以后就能够进入正题,在你的APP中实现定位服务功能了。
    三、java中设置定位服务的代码:(我这里都是封装的方法,你们能够自行斟酌)
        第一步:设置定位模式:
 1 /**
 2  * 设置定位模式
 3  */
 4 private void setLocationClient(){
 5     //定位模式,高精度定位,仅设备,网络
 6     clientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
 7     //是否单次定位
 8     clientOption.setOnceLocation(false);
 9     //是否返回逆地理地理数据
10     clientOption.setNeedAddress(true);
11     //定位时间间隔
12     clientOption.setInterval(60000);
13     //定位超时时长
14     clientOption.setHttpTimeOut(30000);
15 }

    第二步:设置定位属性:网络

 1 /**
 2  * 设置定位属性
 3  */
 4 private void locationCity(){
 5     //设置定位属性
 6     setLocationClient();
 7     locationClient.setLocationOption(clientOption);
 8     locationClient.startLocation();
 9     locationClient.setLocationListener(this);
10 }

   第三步定位回调:app

 1 /**
 2  * 定位回调
 3  * @param aMapLocation
 4  */
 5 @Override
 6 public void onLocationChanged(AMapLocation aMapLocation) {
 7     //定位回调
 8     if (aMapLocation!=null&&aMapLocation.getErrorCode()==0){
 9         Log.i("定位回调",aMapLocation.getCity().toString());
10     }
11     if (aMapLocation.getErrorCode()!=0){
12         Log.i("定位回调","错位信息"+aMapLocation.getErrorCode());
13         Log.i("定位回调","错位信息"+aMapLocation.getErrorInfo());
14     }
15 }

其中log出来的就是定位服务的信息,定位成功与定位失败都会在控制台输出,至此使用高德地图实现定位服务的工做就完成了,感受仍是很简单明了的,但愿能给你们在定位方面的学习有所帮助,若是你们阅读以后感受对您的理解有所帮助的话就请推荐一下,谢谢。ide

有道笔记连接: http://note.youdao.com/noteshare?id=afe19f09d5c431bdd8e09b28781cb0e0工具

相关文章
相关标签/搜索