推荐肉丝r0ysue课程(包含安卓逆向与js逆向):个人笔记整理
基于位置的服务
百度地图API
申请API
前往百度开放服务平台 (baidu.com)注册开发者
来到控制台 | 百度地图开放平台 (baidu.com)创建应用
应用名称随意,应用类型选择【Android SDK】
获取开发版(debug) SHA1
前往系统的.android
目录,默认位于~/.android
输入命令
E:\code\Android\.android>keytool -list -v -keystore debug.keystore
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: androiddebugkey
创建日期: 2021-2-27
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=US, O=Android, CN=Android Debug
发布者: C=US, O=Android, CN=Android Debug
序列号: 1
有效期为 Sat Feb 27 18:40:11 CST 2021 至 Mon Feb 20 18:40:11 CST 2051
证书指纹:
MD5: 84:9D:C6:94:D8:2F:C2:90:00:00:00:00:00:00:00:00
SHA1: D2:4C:7C:89:85:83:9A:68:1C:6F:FF:0F:00:00:00:00:00:00:00:00
SHA256: EF:5A:67:E6:15:68:64:05:AD:95:90:7F:0F:5C:34:2B:79:54:15:C0:85:94:1E:9B:00:00:00:00:00:00:00:00
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 1
*******************************************
*******************************************
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
获取发布板(release) SHA1
Android百度地图开发-第一篇:申请、搭建百度地图 - zhangmiao14 - 博客园 (cnblogs.com)创建相应的签名文件,并获取相应的SHA1
(测试,可以相同)
包名正常设置
点击提交
可复制key,或者[设置]修改上述配置
使用百度定位
官方开发文档:Android地图SDK | 百度地图API SDK (baidu.com)
下载&配置SDK
下载SDK
(根据需要)选择基础定位和基础地图,选择jar格式、标准开发包选择下载
配置SDK
解压下载的jar包,然后进入libs
目录
选择其中的BaiduLBS_Android.jar
文件放入项目中app/libs
目录
// gradle中需配置
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
...
}
之后新建src/main/jniLibs
目录,将 剩余所有 复制到此处
项目配置
AndroidManifest配置
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lbstest">
<!-- 添加权限:start -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 可删去 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- 添加权限:end -->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 添加key:start 需要修改value为申请到的key值 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key" />
<!-- 添加key:end -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</service>
</application>
</manifest>
代码
动态申请权限代码示例
public class MainActivity extends AppCompatActivity {
public LocationClient mLocationClient;
private TextView positionText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
// 注册一个定位监听器,当获得位置时,就会回调该监听器
mLocationClient.registerLocationListener(new MyLocationListener());
setContentView(R.layout.activity_main);
positionText = (TextView) findViewById(R.id.position_text_view);
//动态申请权限
// 申请权限较多,建立权限数组
List<String> permissionList = new ArrayList<>();
// 如果没有该权限,就将该权限添加到权限数组中
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
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[]数组
String [] permissions = permissionList.toArray(new String[permissionList.
size()]);
// 进行权限的申请
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
} else {
requestLocation();
}
}
private void requestLocation() {
mLocationClient.start();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "必须同意所有权限才能使用本程序",
Toast.LENGTH_SHORT).show();
// 如果有权限未被同意,则退出程序
finish();
return;
}
}
//同意所有权限后,加载位置
requestLocation();
} else {
Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
// 获得相应参数
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder currentPosition = new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).
append("\n");
currentPosition.append("经线:").append(location.getLongitude()).
append("\n");
currentPosition.append("定位方式:");
if (location.getLocType() == BDLocation.TypeGpsLocation) {
currentPosition.append("GPS");
} else if (location.getLocType() ==
BDLocation.TypeNetWorkLocation) {
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
});
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
}
实时更新位置
public class MainActivity extends AppCompatActivity {
...
private void requestLocation() {
initLocation();
mLocationClient.start();
}
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);
mLocationClient.setLocOption(option);
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
}
...
}
选择定位模式
上述方式为网络定位
切换到GPS定位。手机设置:位置信息模式→高精确度
定位模式进行指定,一共有3种模式可选:Hight_Accuracy、Battery_Saving和Device_Sensors。
Hight_Accuracy表示高精确度模式,会在GPS信号正常的情况下优先使用GPS定位,在无法接收GPS信号的时候使用网络定位。
Battery_Saving表示节电模式,只会使用网络进行定位。
Device_Sensors表示传感器模式,只会使用GPS进行定位。
其中,Hight_Accuracy是默认的模式。
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);
// 设置定位模式
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
mLocationClient.setLocOption(option);
}
显示位置相关信息
// 设置LocationClientOption的 需要获取当前位置详细的地址信息
option.setIsNeedAddress(true);
StringBuilder currentPosition = new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).
append("\n");
currentPosition.append("经线:").append(location.getLongitude()).
append("\n");
currentPosition.append("国家:").append(location.getCountry()).
append("\n");
currentPosition.append("省:").append(location.getProvince()).
append("\n");
currentPosition.append("市:").append(location.getCity()).
append("\n");
currentPosition.append("区:").append(location.getDistrict()).
append("\n");
currentPosition.append("街道:").append(location.getStreet()).
append("\n");
currentPosition.append("定位方式:");
if (location.getLocType() == BDLocation.TypeGpsLocation) {
currentPosition.append("GPS");
} else if (location.getLocType() ==
BDLocation.TypeNetWorkLocation) {
currentPosition.append("网络");
}
positionText.setText(currentPosition);
使用百度地图
添加地图控件
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
添加Application继承类
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//初始化百度地图
SDKInitializer.initialize(this);
}
}
/*
* 同时使AndroidManifest中<application>节点的 name属性为该类
java代码实现
public class MainActivity extends AppCompatActivity {
...
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化要在 setContentView 前
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
// 添加下面这个,就不用添加自定义Application类了
SDKInitializer.initialize(getApplication());
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);
...
}
...
/*
* 重写相应方法,及时释放资源
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
}
...
}
定位到当前位置
先获得地图总控制器
BaiduMap baiduMap = mapView.getMap();
-
设置缩放级别
// 设置缩放级别(3~21),值越大地图越精细 MapStatusUpdate update = MapStatusUpdateFactory.zoomTo(12.5f); // 最后需要调用该方法 使update的设置生效 baiduMap.animateMapStatus(update);
-
设置经纬度
LatLng ll = new LatLng(39.915, 116.404); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update);
显示所在位置光标
public class MainActivity extends AppCompatActivity {
...
private BaiduMap baiduMap;
private boolean isFirstLocate = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化要在 setContentView 前
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);
// 获得Map控制器
baiduMap = mapView.getMap();
// 启用我的位置显示
baiduMap.setMyLocationEnabled(true);
...
}
private void navigateTo(BDLocation location) {
/*
* 地图定位到当前位置
*/
// 判断是不是第一次定位
// 定位到当前位置,同时设置精度
if (isFirstLocate) {
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(16f);
baiduMap.animateMapStatus(update);
isFirstLocate = false;
}
/*
* 地图上当前位置 显示我的图标
*/
// 封装设备当前所在位置
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
locationBuilder.latitude(location.getLatitude());
locationBuilder.longitude(location.getLongitude());
MyLocationData locationData = locationBuilder.build();
// 设置上“我的位置”
baiduMap.setMyLocationData(locationData);
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location.getLocType() == BDLocation.TypeGpsLocation
|| location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 初始化地图
navigateTo(location);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
// 关闭我的位置显示,节约资源
baiduMap.setMyLocationEnabled(false);
}
}