我调用高德地图的定位API:
我们首先需要注册成为高德开发者,然后申请一个 API key
第一步,注册高德开发者;第二步,去控制台创建应用;第三步,获取Key。上诉步骤跟着https://lbs.amap.com/api/android-sdk/summary/ 这里来就可以了
不过有些需要注意的点我说说:
我们完成第二步之后,也就是创建应用成功之后需要获取一个key,这个key要我们点击添加,然后出来这个东西:
Key 名称随便填一个,下面的发布版安全码SHA1 (打包程序时所用签名文件 的SHA1指纹)的获取:
右侧工具栏的Gradle→项目名→:app→Tasks→ android,然后双击signingReport,就可以在Terminal 看到SHA1 了
正式版SHA1 的获取比较麻烦。
点击“如何获取”,然后看到其指南是这么说的:
第一步、打开Android Studio 的Terminal 工具;第二步、输入命令:keytool -v -list -keystore keystore文件路径;第三步、输入Keystore 密码但是根据其截图看出,我们在第二步不只是需要填这些,还需要加上jdk 的安装路径:
cmd 输入以下命令即可获取:
echo %java_home% 1
然后就是keystore 的文件路径
要是之前没有创建过keystore 的话,我们需要生成一个keystore 签名文件:
首先进入jdk 的bin 目录下:cd C:Progra~1Javajdk1.8.0_131bin 1
(注意:由于文件路径不能有空格,所以我把c:Program Files 缩写为c:Progra~1)
会发现有一个keytool.exe 文件。
keytool -genkey -alias test.keystore -keyalg RSA -validity 10000 -keystore e:keytest.keystore 1
该命令会在e:keytest.keystore 路径下生成一个有效时间为10000 的文件test.keystore
然后需要填写一系列的东西:
然后这个keystore 签名文件就成功生成了。
在AS 的Terminal 中输入刚刚获取的sdk 安装路径和那些东西:
C:Progra~1Javajdk1.8.0_131binkeytool -v -list -keystore f:keytest.keystore 1
(我刚刚说了,cmd 命令不能有空格,所以我把c:Program Files 缩写为c:Progra~1)
然后输入刚刚的密钥库口令:
就成功获取到了SHA1 了
接下来就开始使用高德API 了
按照这里说的,可以选择下载sdk 手动引入,也可以通过添加dependencies 方式自动导入
https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project
(需要什么就添加什么)
我在这选择给项目添加dependencies
然后再按照这里说的,
https://lbs.amap.com/api/android-sdk/guide/create-project/dev-attention
添加(我另外添加了一条<service>):
<meta-data android:name="com.amap.api.v2.apikey" android:value="这里输入你自己的用户Key"/> <!-- 定位需要的服务 适配Android Q需要加上android:foregroundServiceType="location"--> <service android:name="com.amap.api.location.APSService" android:foregroundServiceType="location" tools:targetApi="q" /> 1234567
到这里,配置工作就基本做好了,接下来就是主代码环节了。
新建两个对象:
public AMapLocationClient aMapLocationClient; public AMapLocationClientOption aMapLocationClientOption; 12
然后:
aMapLocationClient = new AMapLocationClient(getApplicationContext()); aMapLocationClient.setLocationListener(new AMapLocationListener() { @Override public void onLocationChanged(final AMapLocation aMapLocation) { if (aMapLocation!=null && aMapLocation.getErrorCode()==0){ StringBuilder currentPosition = new StringBuilder(); currentPosition.append("纬度:").append(aMapLocation.getLatitude()).append("n"); currentPosition.append("经度:").append(aMapLocation.getLongitude()).append("n"); currentPosition.append("定位方式:"); if (aMapLocation.getLocationType() == AMapLocation.LOCATION_TYPE_GPS){ currentPosition.append("GPS"); } else if (aMapLocation.getLocationType() == AMapLocation.LOCATION_TYPE_WIFI){ currentPosition.append("WiFi"); } location_tv.setText(currentPosition); } } });
123456789101112131415161718然后对必要的权限进行请求:
List<String> permissionList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (!permissionList.isEmpty()){ String[] permissions = permissionList.toArray(new String[permissionList.size()]); ActivityCompat.requestPermissions(MainActivity.this, permissions, 1); } else {/* 该方法在下面声明 */ requestLocation(); }
12345678910111213141516在onCreate() 方法外面写一个配置aMapLocationClientOption 的方法:
private AMapLocationClientOption getDefaultOption(){ AMapLocationClientOption mOption = new AMapLocationClientOption(); mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式 mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭 mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效 mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒 mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用 AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差 mOption.setLocationCacheEnable(false); //可选,设置是否使用缓存定位,默认为true mOption.setGeoLanguage(AMapLocationClientOption.GeoLanguage.DEFAULT);//可选,设置逆地理信息的语言,默认值为默认语言(根据所在地区选择语言) return mOption; }
12345678910111213141516最后调用的方法:
private void requestLocation(){ aMapLocationClientOption = getDefaultOption(); aMapLocationClient.setLocationOption(aMapLocationClientOption); aMapLocationClient.startLocation(); } 12345
顺带来一些其他的地理位置信息获取方法:
注意:若出现经纬度输出0.0 或其他异常情况,可以看看aMapLocation.getErrorCode() 的错误号是什么,然后对照着错误码对照表进行分析解决。
在app 中载入高德2D 地图(异常简单):
按照开篇所述将需要的dependencies 都添加完成之后,在布局的xml 文件中添加一个MapView 控件:
<com.amap.api.maps2d.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true"> </com.amap.api.maps2d.MapView> 123456
然后在程序中直接:
MapView mapView; mapView = findViewById(R.id.map_view); mapView.onCreate(savedInstanceState); 123
即可显示出来:
不过有一点需要注意:对于MapView 对象,一定要严格控制其生命周期,即一定要在程序中显式声明其创建、暂停、恢复和销毁,即:
public class MapActivity extends AppCompatActivity { MapView mapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); mapView = findViewById(R.id.map_view); mapView.onCreate(savedInstanceState); } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } }
1234567891011121314151617181920212223242526272829相关知识
基于图像规则与Android手机的棉花病虫害诊断系统
1+x移动应用开发(中级) 账号服务集成 推送服务 定位服务 机器学习服务(文本识别)
基于森林碳汇的生态系统服务市场化分析
Plant disease identification method based on lightweight CNN and mobile application
基于植物功能群的生态系统服务形成与维持机制研究
开花流水
基于Android的鲜花预定软件的设计与实现
Ecosystem service evolution in ecological restoration: trend, process, and evaluation
生态系统服务价值评估在生态修复中的应用
基于Android的车载智能监测系统的应用与研究
网址: Android >> 42. 基于位置的服务(Location Based Service) https://m.huajiangbk.com/newsview1189093.html
上一篇: 定制个性化乡旅线路 瞧!“花卉产 |
下一篇: C++运算符详解 |