本文只教學定位功能针炉,需要搜索、2D或3D地圖的可以到騰訊地圖開發(fā)平臺看api文檔和媳,鏈接:[騰訊地圖](https://lbs.qq.com/)
一巴刻、到騰訊地圖開發(fā)平下載定位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狀態(tài). 需要WiFi信息用于網絡定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 修改WiFi狀態(tài). 發(fā)起WiFi掃描, 需要WiFi信息用于網絡定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 訪問網絡狀態(tài), 檢測網絡的可用性. 需要網絡運營商相關信息用于網絡定位 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 訪問網絡的變化, 需要某些信息用于網絡定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 訪問手機當前狀態(tài), 需要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);//設置定位周期(位置監(jiān)聽器回調周期), 單位為 ms (毫秒)
? ? ? ? request.setRequestLevel(REQUEST_LEVEL_POI); // 0:包含經緯度,1:包含經緯度, 位置名稱, 位置地址,3:包含經緯度,位置所處的中國大陸行政區(qū)劃,4:包含經緯度跃脊,位置所處的中國大陸行政區(qū)劃及周邊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) {
? ? ? ? ? ? //注冊位置監(jiān)聽器成功
? ? ? ? } else {
? ? ? ? ? ? //注冊位置監(jiān)聽器失敗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個權限全都擁有, 則直接執(zhí)行備份代碼
? ? ? ? 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();
? ? ? ? //關閉定位監(jiān)聽器
? ? ? ? TencentLocationManager locationManager = TencentLocationManager.getInstance(this);
? ? ? ? locationManager.removeUpdates(this);
? ? }
}