安卓中实现定位功能

Posted <microrock>

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓中实现定位功能相关的知识,希望对你有一定的参考价值。

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

第一步:申请NAS1
 
    1、若是想获得发布版的NAS1码,就得先把你的工程打包,打包成功后你就会获得一个以.jsk为后缀名的文件,打包的时候你会设置一个密码,一会用到这个文件的储存路径以及你设置的密码。
 
    2、打开你的androidstudio选择你的工程,在控制台选择Terminal目录下,在光标显示的地方输入 keytool -v -list -KeyStore KeyStore文件地址这段代码 ,KeyStore文件地址就是你的.jsk文件的地址,输入完后按回车会让你输入密码你直接输入,注意你输入密码的时候控制台并不显示,但不要紧控制台已经录入,然后按回车就会出现一系列的信息其中就包括NAS1码,这个就是发布版的NAS1码。
 
    3、如何获得测试版的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,这就是你工程中的清单文件下的

 1 package="com.jereh.biyingapplication" 

然后就完成申请key的步骤了。
 
第二步:导入jar包(jar包我只提供了包名,大家可以去GitHub上自行下载,如果大家感觉麻烦可以去我的有道笔记里下载,文末我会附上此篇文章的有道链接)
 
    1、首先需要下载这个jar包
  AMap_Location_V2.8.0_20160811.jar
以后如果再要开发2D地图还需要导入这个Jar包
  AMap_2DMap_V2.9.0_20160525.jar
导入包并添加依赖成功后就可以进入正题,定位服务了!!!
 
第三步:实现定位功能
    1、因为定位功能需要获取APP的位置信息,所以安卓6.0版本之上的还需要获取权限,关于如何获取权限,大家可以参考我的判断权限以及获取权限的那篇文章,这里就不赘述了
    2、同样因为权限问题,大家还需要在工程的清单文件里添加下面这些请求:
 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中实现定位服务功能了。
    3、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 }

   第三步定位回调:

 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出来的就是定位服务的信息,定位成功与定位失败都会在控制台输出,至此使用高德地图实现定位服务的工作就完成了,感觉还是很简单明了的,希望能给大家在定位方面的学习有所帮助,如果大家阅读之后感觉对您的理解有所帮助的话就请推荐一下,谢谢。

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

以上是关于安卓中实现定位功能的主要内容,如果未能解决你的问题,请参考以下文章

vue中实现百度地图拖拽地图定位功能

谷歌地图在安卓设备上显示为灰色

在类中实现委托(iOS/Swift)

在片段中实现 onClickListener

在多个片段中的片段中实现选项卡

尝试在片段中实现 OnClick 侦听器 [重复]