index.uts 5.1 KB
Newer Older
1

杜庆泉's avatar
杜庆泉 已提交
2 3 4 5 6 7 8

import ActivityCompat from "androidx.core.app.ActivityCompat";
import Manifest from "android.Manifest";
import Looper from "android.os.Looper";
import TencentLocationManager from "com.tencent.map.geolocation.TencentLocationManager";
import TencentLocationListener from "com.tencent.map.geolocation.TencentLocationListener";
import TencentLocation from "com.tencent.map.geolocation.TencentLocation";
杜庆泉's avatar
杜庆泉 已提交
9
import TencentLocationRequest from "com.tencent.map.geolocation.TencentLocationRequest";
10
import PackageManager from "android.content.pm.PackageManager";
11 12 13
import Class from 'java.lang.Class';
import Exception from 'java.lang.Exception';

杜庆泉's avatar
杜庆泉 已提交
14

杜庆泉's avatar
杜庆泉 已提交
15 16 17

export function requestPremission() {
	
18 19 20 21 22 23
	/**
	 * 同意隐私协议。重要!!
	 * 说明文档:https://lbs.qq.com/mobile/androidLocationSDK/androidGeoGuide/agreePrivacy
	 */
	TencentLocationManager.setUserAgreePrivacy(true);
	
24 25 26 27
	/**
	 * 准备权限
	 */
	let permissionNeed = [Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION];
杜庆泉's avatar
杜庆泉 已提交
28

lizhongyi_'s avatar
lizhongyi_ 已提交
29 30 31
	UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, permissionNeed, function (allRight:boolean,_:string[]) {
		console.log("用户同意了权限",allRight)
	}, function (_:boolean,_:string[]) {
32 33
		console.log("用户拒绝了部分权限:")
	})
lizhongyi_'s avatar
lizhongyi_ 已提交
34 35 36
	
  // 请求权限
  return { name: "requestPremission"};
杜庆泉's avatar
杜庆泉 已提交
37
  
杜庆泉's avatar
杜庆泉 已提交
38 39 40
}


杜庆泉's avatar
杜庆泉 已提交
41 42 43
/**
 * 定位请求参数封装
 */
杜庆泉's avatar
杜庆泉 已提交
44
type LocationOptions = {
杜庆泉's avatar
杜庆泉 已提交
45 46
	geocode:boolean,
	success: (response:LocationResponse) => void;
杜庆泉's avatar
杜庆泉 已提交
47 48
};

杜庆泉's avatar
杜庆泉 已提交
49 50 51 52 53 54 55 56 57 58
/**
 * 定位返回结果封装
 */
type LocationResponse = {
	name?:string,
	address?:string,
	latitude?:number,
	longitude?:number
}

59 60 61 62

/**
 * 定位监听结果包装类
 */
杜庆泉's avatar
杜庆泉 已提交
63 64 65 66 67 68 69 70
class LocationOptionsWapper{
	
	hostOption:LocationOptions;
	
	constructor(option: LocationOptions){
		this.hostOption = option
	}
	
杜庆泉's avatar
杜庆泉 已提交
71 72
	onLocationChanged(location:TencentLocation , _error:Int ,
								  _reason:string){
杜庆泉's avatar
杜庆泉 已提交
73
		
74
		let response:LocationResponse = {
杜庆泉's avatar
杜庆泉 已提交
75 76 77 78 79
			name:location.name,
			address:location.address,
			latitude:location.latitude,
			longitude:location.longitude
		};
杜庆泉's avatar
杜庆泉 已提交
80
		this.hostOption.success(response);
杜庆泉's avatar
杜庆泉 已提交
81 82 83
	}
	
	
杜庆泉's avatar
杜庆泉 已提交
84
	onStatusUpdate(_name:string, _status:Int, _desc:string){
杜庆泉's avatar
杜庆泉 已提交
85
		// 定位状态发生变化
杜庆泉's avatar
杜庆泉 已提交
86 87 88 89
	}
};


杜庆泉's avatar
杜庆泉 已提交
90 91 92
/**
 * Tencent 定位监听实现类
 */
杜庆泉's avatar
杜庆泉 已提交
93 94
class SingleLocationListener extends TencentLocationListener {
    
杜庆泉's avatar
杜庆泉 已提交
95
	
杜庆泉's avatar
杜庆泉 已提交
96 97 98
	hostOptionWraper:LocationOptionsWapper;
	
	constructor(option: LocationOptionsWapper){
杜庆泉's avatar
杜庆泉 已提交
99
		super();
杜庆泉's avatar
杜庆泉 已提交
100
		this.hostOptionWraper = option
杜庆泉's avatar
杜庆泉 已提交
101 102
	}
	
杜庆泉's avatar
杜庆泉 已提交
103
	override onLocationChanged(location:TencentLocation , error:Int ,
杜庆泉's avatar
杜庆泉 已提交
104
								  reason:string ):void{
105 106
									  console.log(error);
									  console.log(reason);
107
		console.log(error);
杜庆泉's avatar
杜庆泉 已提交
108
		this.hostOptionWraper.onLocationChanged(location,error,reason);
杜庆泉's avatar
杜庆泉 已提交
109 110
	}

杜庆泉's avatar
杜庆泉 已提交
111
	override onStatusUpdate(name:string, status:Int, desc:string ):void{
杜庆泉's avatar
杜庆泉 已提交
112
		console.log(name);
杜庆泉's avatar
杜庆泉 已提交
113
		this.hostOptionWraper.onStatusUpdate(name,status,desc);
杜庆泉's avatar
杜庆泉 已提交
114
	}
杜庆泉's avatar
杜庆泉 已提交
115
	
杜庆泉's avatar
杜庆泉 已提交
116
}
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
/**
 * 判断当前的基座是否已经集成了sdk, 即是否是自定义基座
 */
export function checkHasIntegration():boolean{
	
	let hasIntegration =  true
	try{
		let xClass = Class.forName("com.tencent.map.geolocation.TencentLocationListener")
		console.log(xClass);
	}catch(e:Exception){
		hasIntegration = false;
	}
	
	if(!hasIntegration){
		return false;
	}
	
	return true
}
136 137 138 139 140
/**
 * 检查定位的相关配置是否正确
 */
function checkLocationConfig():boolean{
	
141 142
	let packageName = UTSAndroid.getAppContext()!.getPackageName();
	let appInfo = UTSAndroid.getAppContext()!.getPackageManager()!.getApplicationInfo(packageName,PackageManager.GET_META_DATA)
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
	
	let metaData = appInfo.metaData
	if (metaData == null) {
		 return false;
	}
	let adId = metaData.getString("TencentMapSDK")
	let splitArray = adId!.split("-")
	let keyCharNum = splitArray.size
	
	if(keyCharNum > 5){
		// 存在超过5个-,说明是符合规则的appkey
		return true;
	}
	// 不符合校验规则,打回
	return false;
}

杜庆泉's avatar
杜庆泉 已提交
160 161 162 163
/**
 * 腾讯地图获取定位信息
 * 参考文档:https://lbs.qq.com/mobile/androidLocationSDK/androidGeoGuide/androidGeoAdapt
 */
164
export function getLocation(locationOptions: LocationOptions):boolean {
杜庆泉's avatar
杜庆泉 已提交
165
	
166 167 168 169 170 171
   if(!checkLocationConfig()){
	   /**
		* 未通过配置预校验,通常是app key 配置错误
		*/
		return false
   }
172
  
173
  let mLocationManager = TencentLocationManager.getInstance(UTSAndroid.getAppContext());
杜庆泉's avatar
杜庆泉 已提交
174 175
  // 定位监听器封装
  let locationOptionWrapper = new LocationOptionsWapper(locationOptions);
杜庆泉's avatar
杜庆泉 已提交
176
  let mLocationListener = new SingleLocationListener(locationOptionWrapper);
杜庆泉's avatar
杜庆泉 已提交
177 178 179 180 181 182 183 184
  // 发起单次请求
  let locationRequest = TencentLocationRequest.create()
  // 是否需要逆地理编码
  if(locationOptions.geocode){
	  locationRequest.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_ADMIN_AREA);
  }else{
	  locationRequest.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_GEO);
  }
185
  
186 187
  console.log("requestSingleFreshLocation");
  
188 189
  mLocationManager.requestSingleFreshLocation(locationRequest, mLocationListener, Looper.getMainLooper());
  
190 191 192
  return true;
}

193 194 195
/**
 * 持续监听位置变化
 */
196
@Suppress("UNUSED_PARAMETER")
197 198 199
export function watchPosition(_locationOptions: LocationOptions) {
	//todo
}
200

201 202 203
/**
 * 关闭监听位置变化
 */
204
@Suppress("UNUSED_PARAMETER")
205 206 207
export function clearWatch() {
	//todo
}