本文只教学定位功能,需要搜索、2D或3D地图的可以到腾讯地图开发平台看api文档,链接:[腾讯地图](https://lbs.qq.com/)
一、到腾讯地图开发平下载定位sdk,快速入口:[腾讯地图定位](https://lbs.qq.com/mobile/androidLocationSDK/androidGeoDownload)
二、在项目的AndroidManiFest文件加入权限和配置AppKey
<!-- 通过GPS得到精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 通过网络得到粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 访问网络. 某些位置信息需要从网络服务器获取 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问WiFi状态. 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 修改WiFi状态. 发起WiFi扫描, 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 访问网络状态, 检测网络的可用性. 需要网络运营商相关信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 访问手机当前状态, 需要device id用于网络定位 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 支持A-GPS辅助定位 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 用于 log 日志 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application>
<meta-data android:name="TencentMapSDK" android:value="您申请的Key" />
</application>
三、Android Studio配置工程** Android Studio的配置方式有两种:
方法1:
a)在libs主动添加so文件和SDK(如果项目有聊天或其他的so文件冲突的话,可以把他们放在一起,我也是这样,目前来看没什么bug)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200616111353317.PNG)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200616111037775.PNG)
b)在 build.gradle 文件的 dependencies 中配置
implementation fileTree(include: ['*.jar'], dir: 'libs')
//腾讯地图定位
implementation files('libs/TencentLocationSdk_v7.2.6.jar')
方法二:
Gradle配置引用
a)修改根目录gradle配置
llprojects {
repositories {
jcenter()
google()
mavenCentral()
}
}
b)修改工程目录gradle配置
在 build.gradle 文件的 dependencies 中增加配置
implementation 'com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.2.6'
四、代码混淆
在proguard-rules.pro文件加入代码混淆(复制粘贴即可)
-keepclassmembers class ** {
public void on*Event(...);
}
-keep class c.t.**{*;}
-keep class com.tencent.map.geolocation.**{*;}
-dontwarn org.eclipse.jdt.annotation.**
-dontwarn c.t.**
五、接下就是代码了
public class LocationActivity extends BaseActivity implements TencentLocationListener {
private static final int MY_PERMISSION_REQUEST_CODE = 10000;
private TencentLocationRequest request;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
initdata();
}
public void initdata() {
checkPermission();
}
public void setLocation() {
request = TencentLocationRequest.create();
request.setInterval(60000);//设置定位周期(位置监听器回调周期), 单位为 ms (毫秒)
request.setRequestLevel(REQUEST_LEVEL_POI); // 0:包含经纬度,1:包含经纬度, 位置名称, 位置地址,3:包含经纬度,位置所处的中国大陆行政区划,4:包含经纬度,位置所处的中国大陆行政区划及周边POI列表
request.setAllowGPS(true);
request.setAllowDirection(true);
request.setIndoorLocationMode(true);
TencentLocationListener listener = this;
TencentLocationManager locationManager = TencentLocationManager.getInstance(LocationActivity.this);
int error = locationManager.requestLocationUpdates(request, listener);
if (error == 0) {
//注册位置监听器成功
} else {
//注册位置监听器失败keytool -v -list -keystore
locationNowlocation.setText("定位失败");
}
}
@Override
public void onLocationChanged(TencentLocation tencentLocation, int error, String s) {
if (TencentLocation.ERROR_OK == error) { // 定位成功
//定位成功
if (tencentLocation != null) {
String address = tencentLocation.getCity();
locationNowlocation.setText(address);
}
} else { // 定位失败
Tools.ToastTextThread(LocationActivity.this, "定位失败");
}
}
@Override
public void onStatusUpdate(String name, int status, String desc) {
/*if (name.equals("GPS")) {
if (status == 0) {
Tools.ToastTextThread(LocationActivity.this, "GPS关闭");
}
}*/
}
public void checkPermission() {
//检查是否有相应的权限,根据自己需求,进行添加相应的权限
boolean isAllGranted = checkPermissionAllGranted(
new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION
}
);
// 如果这3个权限全都拥有, 则直接执行备份代码
if (isAllGranted) {
setLocation();
} else {
// 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSION_REQUEST_CODE);
}
}
/**
* 检查是否拥有指定的所有权限
*/
private boolean checkPermissionAllGranted(String[] permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// 只要有一个权限没有被授予, 则直接返回 false
return false;
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSION_REQUEST_CODE) {
boolean isAllGranted = true;
// 判断是否所有的权限都已经授予了
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false;
break;
}
}
if (isAllGranted) {
// 所有的权限都授予
setLocation();
} else {
// 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
setLocationDialog("");
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//关闭定位监听器
TencentLocationManager locationManager = TencentLocationManager.getInstance(this);
locationManager.removeUpdates(this);
}
}
网友评论