Browse Source

1.0.3开发完成

chendeng 1 year ago
parent
commit
08cb6ca83f

+ 12 - 0
README.md

@@ -1,3 +1,13 @@
+### 插件
+```text
+1、购买原生插件,https://ext.dcloud.net.cn/plugin?id=16049, 购买普通授权版
+2、购买成功,在项目的uni_moudles目录下,会多出一个pow-amap目录
+3、创建 Android平台、iOS平台、Web服务三种类型的KEY
+4、manifest.json 配置 APP常用其它配置,将minSdkVersion 设置为 21,需要使用高德原生插件,必须大于等于21,也就是不再支持android 5.0以下的版本
+5、manifest.json 配置 APP模块配置->Geolocation->系统定位,并勾选ios和android,不能选高德地图,会和高德导航插件冲突
+6、拷贝代码根目录AndroidManifest.xml 到项目根目录,将第5行 android:value="" 里的值改成高德Android平台对应的app_key,第三行 package="" 里的包名改成项目的包名
+7、打自定义基座
+```
 ### 文件操作
 ```text
 将uni_modules/ai-speak目录,复制到uni_modules目录中,如果不存在则创建目录
@@ -11,6 +21,8 @@ export const VOICE_ASSISTANT_DEBUG = false;
 export const VOICE_ASSISTANT_PLATFORM = 'develop';				//运行环境,develop:开发环境  production:生产环境
 export const VOICE_ASSISTANT_APP_ID = 'APP_ID';
 export const VOICE_ASSISTANT_APP_SECRET = 'APP_SECRET';
+export const VOICE_ASSISTANT_GAODE_IOS  = 'xxxxxx';       //高德IOS平台的app_key
+export const VOICE_ASSISTANT_GAODE_WEBSERVER = 'xxxxx';   // 高德web服务 app_key
 ```
 
 ### 添加本地插件

+ 1 - 1
config/app.js

@@ -1,5 +1,5 @@
 export const VOICE_ASSISTANT_DEBUG           = true;
-export const VOICE_ASSISTANT_PLATFORM        = 'develop';					//运行环境,develop:开发环境  production:生产环境
+export const VOICE_ASSISTANT_PLATFORM        = 'production';					//运行环境,develop:开发环境  production:生产环境
 export const VOICE_ASSISTANT_APP_ID          = '41e6c9ff5c';
 export const VOICE_ASSISTANT_APP_SECRET      = 'YjI5MDZhZmU4ZjJkMDVlMzY5MzUyYWQ1M2YxNWFjZDhiYjVkMTMyNGM0NWNlOThlMzAxMWM2OGI0YWQ5ODc4NA==';
 export const VOICE_ASSISTANT_GAODE_IOS       = '7d1f2135ba4d4daec2d8f8315908f0f7';

+ 14 - 2
uni_modules/ai-speak/api/service.js

@@ -338,7 +338,7 @@ async function runAnswerChat(data, mode) {
 			'messages': data
 		};
 		//token = 'ff';
-		result = await request.post(BAIDU_BASE_URL + 'rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ai_apaas?access_token=' +
+		result = await request.post(BAIDU_BASE_URL + 'rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=' +
 			token, params);
 		return result;
 	} else if (mode == 'server') {
@@ -361,6 +361,18 @@ async function runAnswerChat(data, mode) {
 	return null;
 }
 
+export async function runAnswerChatApp(data) {
+	console.log('runAnswerChatApp');
+	let token = await getBaiduToken('model');
+	let params = {
+		'messages': data
+	};
+
+	let result = await request.post(BAIDU_BASE_URL + 'rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ai_apaas?access_token=' +
+		token, params);
+	return result;
+}
+
 export async function answerChatGpt(data) {
 	//console.log('answerChatGpt');
 	let url = 'https://api.link-ai.chat/v1/chat/completions';
@@ -461,7 +473,7 @@ export async function getGaodeSearch(address, city) {
 		'key': VOICE_ASSISTANT_GAODE_WEBSERVER,
 		'keywords': address,
 		'page': 1,
-		'offset': 5,
+		'offset': 10,
 		'city': city,
 		'extensions': 'all'
 	};

+ 13 - 5
uni_modules/ai-speak/business/chat.js

@@ -12,6 +12,7 @@ import {
 	answerQuestion,
 	answerChat,
 	answerChatGpt,
+	runAnswerChatApp,
 	getThingInfo,
 	reportError,
 } from "@/uni_modules/ai-speak/api/service.js";
@@ -157,6 +158,10 @@ export default class Chat {
 							case 'link':
 								result = this.runVideo(beforeActionData);
 								break;
+
+							default:
+								result = await this.runEngineAnswer(message);
+								break;
 						}
 					}
 				}
@@ -369,12 +374,15 @@ export default class Chat {
 					let v = actionMessage[i];
 					let regex = new RegExp('(' + v.keyword.replace(/\|/g, '|') + ')', 'g');
 					if (message.search(regex) > -1) {
-						console.log(v);
 						data = v;
 						if (v.type == CONSTANT.CHAT_ACTION.NAVIGATION) {
-							let location = await this.map.getLocation(true);		//重新获取定位信息
-							console.log(location);
-							data.destination = await this.findDestinationInText(message, v);
+							if (await Tools.checkLocationPermissions()) {
+								await this.map.getLocation(true);		//重新获取定位信息
+								data.destination = await this.findDestinationInText(message, v);
+							} else {
+								// 如果没有定位权限,不执行定位命令模式
+								return null;
+							}
 						}
 						break;
 					}
@@ -414,7 +422,7 @@ export default class Chat {
 		  }
 		];
 
-		let result = await answerChat(data);
+		let result = await runAnswerChatApp(data);
 		//let result = await answerChatGpt(data);
 		console.log(result);
 		try {

+ 1 - 5
uni_modules/ai-speak/business/map.js

@@ -28,9 +28,6 @@ export default class Map {
 		this.config = {};
 		//this.amap = uni.requireNativePlugin('AMap-OneNavi');
 		//this.amap = uni.requireNativePlugin('TT-AMapNavi');
-		uni.setNavigationBarTitle({
-			title: '导航'
-		})
 	}
 
 	/**
@@ -172,7 +169,7 @@ export default class Map {
 					reject(err);
 				}
 			});
-		})
+		});
 	}
 
 	/**
@@ -181,7 +178,6 @@ export default class Map {
 	async showLocationList() {
 		let self = this;
 		let res = await this.getLocation();
-		console.log(res);
 		let latitude  = res.latitude;
 		let longitude = res.longitude;
 		let list      = this.getSearchLocationList();

+ 56 - 3
uni_modules/ai-speak/components/ai-speak/ai-speak.vue

@@ -15,7 +15,7 @@
 		<view class="ai-speakbox" :class="aiIsOpen ? 'ai-show' : ''" :style="">
 			<robot ref="robot" cardBg="#000" videoTextColor="#fff" videoTextSize="26rpx" :headerStyle="headerStyle"
 				:setCardTop="setCardTop" :locationList="locationList" @onAllowPermissions="onAllowPermissions"
-				@onCloseRobot="closeAi" @onChangeMode="onChangeMode" @onLocationDetail="onLocationDetail"
+				@onCloseRobot="closeAi" @onChangeMode="onChangeMode" @onLocationDetail="onLocationDetail" @onOpenLocation="onOpenLocation"
 				@onCloseLocationList="onCloseLocationList">
 			</robot>
 			<!-- <view v-if="debug">
@@ -249,7 +249,13 @@
 				this.$refs.robot.videoHides();
 				this.$refs.robot.setActionStatus(CONSTANT.ROBOT_STATUS.HI);
 				this.$refs.robot.setShowVolume(false);
-				this.aiIsOpen = true;
+				this.aiIsOpen = true;
+
+				if (!await Tools.checkLocationPermissions() && this.systemInfo.platform === 'android') {
+					// 如果没有定位权限,则提示开启
+					this.$refs.robot.changeOpenLocationTisStatus(true);
+				}
+
 				this.$refs.robot.show().then(() => {
 					if (this.aiIsOpen) {
 						self.startMonitorVoice();
@@ -514,6 +520,46 @@
 				this.speechRecognition.stopSpeaking();
 				this.$refs.robot.videoShow(url);
 				this.$refs.robot.setActionStatus(CONSTANT.ROBOT_STATUS.PLAYING);
+			},
+			/**
+			 * 用户点击开启定位权限
+			 */
+			async onOpenLocation() {
+				this.$refs.robot.changeOpenLocationTisStatus(false);
+				const platform = this.systemInfo.platform;
+				if (platform === "ios") {
+					await this.map.loadLocation();
+				} else if (platform === "android") {
+					try {
+						this.allowLocation();
+					} catch(e) {
+						// 授权失败,重新打开授权提示
+						this.$refs.robot.changeOpenLocationTisStatus(true);
+					}
+				}
+			},
+			/**
+			 * 申请定位权限
+			 */
+			allowLocation() {
+				return new Promise(async (resolve, reject) => {
+					this.showPermissionPop(
+						"获取定位权限",
+						"小宝将获取您的定位信息,提供导航和所在地天气信息服务。"
+					);
+					let self = this;
+					await Tools.allowPermissions({
+						code: "location",
+						resolve: function() {
+							self.hidePermissionPop();
+							resolve();
+						},
+						reject: function(err) {
+							self.hidePermissionPop();
+							reject(err);
+						},
+					});
+				});
 			},
 			/**
 			 * 同意激活语音助手
@@ -607,7 +653,14 @@
 							locationPermissions = false;
 							self.hidePermissionPop();
 						},
-					});
+					});
+
+					try {
+						this.allowLocation();
+						locationPermissions = true;
+					} catch(e) {
+						locationPermissions = false;
+					}
 
 					if (recordPermissions && photoLibraryPermissions && locationPermissions) {
 						this.initXunfei();

+ 2 - 5
uni_modules/ai-speak/components/ai-speak/robot.vue

@@ -242,7 +242,6 @@
 			});
 		},
 		mounted() {
-			this.changePositionTipState(true)
 			this.init();
 		},
 		methods: {
@@ -486,12 +485,10 @@
 			},
 			// 打开定位授权
 			openLocation(){
-				uni.showToast({
-					title: "打开定位授权页面"
-				})
+				this.$emit('onOpenLocation');
 			},
 			// 改变定位授权提示状态
-			changePositionTipState(state){
+			changeOpenLocationTisStatus(state){
 				this.positionTipState = state;
 			},
 		}

+ 347 - 345
uni_modules/ai-speak/utils/permission.js

@@ -1,346 +1,348 @@
-/**
- * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
- */
-
-var isIos
-// #ifdef APP-PLUS
-isIos = (plus.os.name == "iOS")
-// #endif
-
-// 判断推送权限是否开启
-function judgeIosPermissionPush() {
-	var result = false;
-	var UIApplication = plus.ios.import("UIApplication");
-	var app = UIApplication.sharedApplication();
-	var enabledTypes = 0;
-	if (app.currentUserNotificationSettings) {
-		var settings = app.currentUserNotificationSettings();
-		enabledTypes = settings.plusGetAttribute("types");
-		if (enabledTypes == 0) {
-			console.log("推送权限没有开启");
-		} else {
-			result = true;
-			console.log("已经开启推送功能!")
-		}
-		plus.ios.deleteObject(settings);
-	} else {
-		enabledTypes = app.enabledRemoteNotificationTypes();
-		if (enabledTypes == 0) {
-			console.log("推送权限没有开启!");
-		} else {
-			result = true;
-			console.log("已经开启推送功能!")
-		}
-		console.log("enabledTypes2:" + enabledTypes);
-	}
-	plus.ios.deleteObject(app);
-	plus.ios.deleteObject(UIApplication);
-	return result;
-}
-
-// 判断定位权限是否开启
-function judgeIosPermissionLocation() {
-	var result = false;
-	var cllocationManger = plus.ios.import("CLLocationManager");
-	var status = cllocationManger.authorizationStatus();
-	result = (status != 2)
-	//console.log("定位权限开启:" + result);
-	// 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
-	/* var enable = cllocationManger.locationServicesEnabled();
-	var status = cllocationManger.authorizationStatus();
-	console.log("enable:" + enable);
-	console.log("status:" + status);
-	if (enable && status != 2) {
-		result = true;
-		console.log("手机定位服务已开启且已授予定位权限");
-	} else {
-		console.log("手机系统的定位没有打开或未给予定位权限");
-	} */
-	plus.ios.deleteObject(cllocationManger);
-	return result;
-}
-
-function judgeAndroidPermissionLocation() {
-	console.log('judgeAndroidPermissionLocation');
-	var galleryPermission = plus.navigator.checkPermission('android.permission.ACCESS_FINE_LOCATION');
-	//console.log(galleryPermission)
-	if (galleryPermission === 'undetermined') {
-		return false;
-	} else {
-		return true;
-	}
-}
-
-function judgeAndroidPermissionRecord() {
-	var galleryPermission = plus.navigator.checkPermission('android.permission.RECORD_AUDIO');
-	//console.log(galleryPermission)
-	if (galleryPermission === 'undetermined') {
-		return false;
-	} else {
-		return true;
-	}
-}
-
-function judgeAndroidPermissionStorage() {
-	var galleryPermission = plus.navigator.checkPermission('android.permission.READ_EXTERNAL_STORAGE');
-	//console.log(galleryPermission)
-	if (galleryPermission === 'undetermined') {
-		return false;
-	} else {
-		return true;
-	}
-}
-
-// 判断麦克风权限是否开启
-function judgeIosPermissionRecord() {
-	var result = false;
-	var avaudiosession = plus.ios.import("AVAudioSession");
-	var avaudio = avaudiosession.sharedInstance();
-	var permissionStatus = avaudio.recordPermission();
-	//console.log("permissionStatus:" + permissionStatus);
-	if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
-		//console.log("麦克风权限没有开启");
-	} else {
-		result = true;
-		//console.log("麦克风权限已经开启");
-	}
-	plus.ios.deleteObject(avaudiosession);
-	return result;
-}
-
-// 判断相机权限是否开启
-function judgeIosPermissionCamera() {
-	var result = false;
-	var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
-	var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
-	console.log("authStatus:" + authStatus);
-	if (authStatus == 3) {
-		result = true;
-		console.log("相机权限已经开启");
-	} else {
-		console.log("相机权限没有开启");
-	}
-	plus.ios.deleteObject(AVCaptureDevice);
-	return result;
-}
-
-// 判断相册权限是否开启
-function judgeIosPermissionPhotoLibrary() {
-	var result = false;
-	var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
-	var authStatus = PHPhotoLibrary.authorizationStatus();
-	console.log("authStatus:" + authStatus);
-	if (authStatus == 3) {
-		result = true;
-		console.log("相册权限已经开启");
-	} else {
-		console.log("相册权限没有开启");
-	}
-	plus.ios.deleteObject(PHPhotoLibrary);
-	return result;
-}
-
-// 判断通讯录权限是否开启
-function judgeIosPermissionContact() {
-	var result = false;
-	var CNContactStore = plus.ios.import("CNContactStore");
-	var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
-	if (cnAuthStatus == 3) {
-		result = true;
-		console.log("通讯录权限已经开启");
-	} else {
-		console.log("通讯录权限没有开启");
-	}
-	plus.ios.deleteObject(CNContactStore);
-	return result;
-}
-
-// 判断日历权限是否开启
-function judgeIosPermissionCalendar() {
-	var result = false;
-	var EKEventStore = plus.ios.import("EKEventStore");
-	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
-	if (ekAuthStatus == 3) {
-		result = true;
-		console.log("日历权限已经开启");
-	} else {
-		console.log("日历权限没有开启");
-	}
-	plus.ios.deleteObject(EKEventStore);
-	return result;
-}
-
-// 判断备忘录权限是否开启
-function judgeIosPermissionMemo() {
-	var result = false;
-	var EKEventStore = plus.ios.import("EKEventStore");
-	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
-	if (ekAuthStatus == 3) {
-		result = true;
-		console.log("备忘录权限已经开启");
-	} else {
-		console.log("备忘录权限没有开启");
-	}
-	plus.ios.deleteObject(EKEventStore);
-	return result;
-}
-
-// Android权限查询
-function requestAndroidPermission(permissionID) {
-	return new Promise((resolve, reject) => {
-		plus.android.requestPermissions(
-			[permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
-			function(resultObj) {
-				var result = 0;
-				for (var i = 0; i < resultObj.granted.length; i++) {
-					var grantedPermission = resultObj.granted[i];
-					//console.log('已获取的权限:' + grantedPermission);
-					result = 1
-				}
-				for (var i = 0; i < resultObj.deniedPresent.length; i++) {
-					var deniedPresentPermission = resultObj.deniedPresent[i];
-					//console.log('拒绝本次申请的权限:' + deniedPresentPermission);
-					result = 0
-				}
-				for (var i = 0; i < resultObj.deniedAlways.length; i++) {
-					var deniedAlwaysPermission = resultObj.deniedAlways[i];
-					//console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
-					result = -1
-				}
-				resolve(result);
-				// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
-				// if (result != 1) {
-				// gotoAppPermissionSetting()
-				// }
-			},
-			function(error) {
-				console.log('申请权限错误:' + error.code + " = " + error.message);
-				resolve({
-					code: error.code,
-					message: error.message
-				});
-			}
-		);
-	});
-}
-
-// 使用一个方法,根据参数判断权限
-function judgeIosPermission(permissionID) {
-	if (permissionID == "location") {
-		return judgeIosPermissionLocation()
-	} else if (permissionID == "camera") {
-		return judgeIosPermissionCamera()
-	} else if (permissionID == "photoLibrary") {
-		return judgeIosPermissionPhotoLibrary()
-	} else if (permissionID == "record") {
-		return judgeIosPermissionRecord()
-	} else if (permissionID == "push") {
-		return judgeIosPermissionPush()
-	} else if (permissionID == "contact") {
-		return judgeIosPermissionContact()
-	} else if (permissionID == "calendar") {
-		return judgeIosPermissionCalendar()
-	} else if (permissionID == "memo") {
-		return judgeIosPermissionMemo()
-	}
-	return false;
-}
-
-// 跳转到**应用**的权限页面
-// function gotoAppPermissionSetting() {
-// 	if (isIos) {
-// 		var UIApplication = plus.ios.import("UIApplication");
-// 		var application2 = UIApplication.sharedApplication();
-// 		var NSURL2 = plus.ios.import("NSURL");
-// 		// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
-// 		var setting2 = NSURL2.URLWithString("app-settings:");
-// 		application2.openURL(setting2);
-
-// 		plus.ios.deleteObject(setting2);
-// 		plus.ios.deleteObject(NSURL2);
-// 		plus.ios.deleteObject(application2);
-// 	} else {
-// 		// console.log(plus.device.vendor);
-// 		var Intent = plus.android.importClass("android.content.Intent");
-// 		var Settings = plus.android.importClass("android.provider.Settings");
-// 		var Uri = plus.android.importClass("android.net.Uri");
-// 		var mainActivity = plus.android.runtimeMainActivity();
-// 		var intent = new Intent();
-// 		intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
-// 		var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
-// 		intent.setData(uri);
-// 		mainActivity.startActivity(intent);
-// 	}
-// }
-
-function gotoAppPermissionSetting(type = 1) {
-	if (isIos) {
-		var UIApplication = plus.ios.import("UIApplication");
-		var application2 = UIApplication.sharedApplication();
-		var NSURL2 = plus.ios.import("NSURL");
-		var setting2;
-
-		if (type === 1) {
-			setting2 = NSURL2.URLWithString("app-settings:");
-		} else if (type === 2) {
-			setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
-		}
-
-		if (setting2) {
-			application2.openURL(setting2);
-			plus.ios.deleteObject(setting2);
-		}
-
-		plus.ios.deleteObject(NSURL2);
-		plus.ios.deleteObject(application2);
-	} else {
-		var Intent = plus.android.importClass("android.content.Intent");
-		var Settings = plus.android.importClass("android.provider.Settings");
-		var Uri = plus.android.importClass("android.net.Uri");
-		var mainActivity = plus.android.runtimeMainActivity();
-		var intent = new Intent();
-
-		if (type === 1) {
-			intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
-			var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
-			intent.setData(uri);
-		} else if (type === 2) {
-			intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
-		}
-
-		mainActivity.startActivity(intent);
-	}
-}
-
-
-// 检查系统的设备服务是否开启
-// var checkSystemEnableLocation = async function () {
-function checkSystemEnableLocation() {
-	if (isIos) {
-		var result = false;
-		var cllocationManger = plus.ios.import("CLLocationManager");
-		var result = cllocationManger.locationServicesEnabled();
-		console.log("系统定位开启:" + result);
-		plus.ios.deleteObject(cllocationManger);
-		return result;
-	} else {
-		var context = plus.android.importClass("android.content.Context");
-		var locationManager = plus.android.importClass("android.location.LocationManager");
-		var main = plus.android.runtimeMainActivity();
-		var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
-		var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
-		console.log("系统定位开启:" + result);
-		return result
-	}
-}
-
-module.exports = {
-	judgeIosPermissionRecord: judgeIosPermissionRecord,
-	judgeAndroidPermissionRecord: judgeAndroidPermissionRecord,
-	judgeAndroidPermissionStorage: judgeAndroidPermissionStorage,
-	judgeAndroidPermissionLocation: judgeAndroidPermissionLocation,
-	judgeIosPermission: judgeIosPermission,
-	requestAndroidPermission: requestAndroidPermission,
-	checkSystemEnableLocation: checkSystemEnableLocation,
-	gotoAppPermissionSetting: gotoAppPermissionSetting
+/**
+ * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
+ */
+
+var isIos
+// #ifdef APP-PLUS
+isIos = (plus.os.name == "iOS")
+// #endif
+
+// 判断推送权限是否开启
+function judgeIosPermissionPush() {
+	var result = false;
+	var UIApplication = plus.ios.import("UIApplication");
+	var app = UIApplication.sharedApplication();
+	var enabledTypes = 0;
+	if (app.currentUserNotificationSettings) {
+		var settings = app.currentUserNotificationSettings();
+		enabledTypes = settings.plusGetAttribute("types");
+		if (enabledTypes == 0) {
+			console.log("推送权限没有开启");
+		} else {
+			result = true;
+			console.log("已经开启推送功能!")
+		}
+		plus.ios.deleteObject(settings);
+	} else {
+		enabledTypes = app.enabledRemoteNotificationTypes();
+		if (enabledTypes == 0) {
+			console.log("推送权限没有开启!");
+		} else {
+			result = true;
+			console.log("已经开启推送功能!")
+		}
+		console.log("enabledTypes2:" + enabledTypes);
+	}
+	plus.ios.deleteObject(app);
+	plus.ios.deleteObject(UIApplication);
+	return result;
+}
+
+// 判断定位权限是否开启
+function judgeIosPermissionLocation() {
+	// 	var result = false;
+	// 	var cllocationManger = plus.ios.import("CLLocationManager");
+	// 	var status = cllocationManger.authorizationStatus();
+	// 	result = (status != 2)
+	// 	//console.log("定位权限开启:" + result);
+	// 	// 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
+	// 	var enable = cllocationManger.locationServicesEnabled();
+	// 	var status = cllocationManger.authorizationStatus();
+	// 	console.log("enable:" + enable);
+	// 	console.log("status:" + status);
+	// 	if (enable && status != 2) {
+	// 		result = true;
+	// 		console.log("手机定位服务已开启且已授予定位权限");
+	// 	} else {
+	// 		console.log("手机系统的定位没有打开或未给予定位权限");
+	// 	}
+	// 	plus.ios.deleteObject(cllocationManger);
+	// 	console.log(result);
+	// 	return result;
+	return true;
+}
+
+function judgeAndroidPermissionLocation() {
+	console.log('judgeAndroidPermissionLocation');
+	var galleryPermission = plus.navigator.checkPermission('android.permission.ACCESS_FINE_LOCATION');
+	//console.log(galleryPermission)
+	if (galleryPermission === 'undetermined') {
+		return false;
+	} else {
+		return true;
+	}
+}
+
+function judgeAndroidPermissionRecord() {
+	var galleryPermission = plus.navigator.checkPermission('android.permission.RECORD_AUDIO');
+	//console.log(galleryPermission)
+	if (galleryPermission === 'undetermined') {
+		return false;
+	} else {
+		return true;
+	}
+}
+
+function judgeAndroidPermissionStorage() {
+	var galleryPermission = plus.navigator.checkPermission('android.permission.READ_EXTERNAL_STORAGE');
+	//console.log(galleryPermission)
+	if (galleryPermission === 'undetermined') {
+		return false;
+	} else {
+		return true;
+	}
+}
+
+// 判断麦克风权限是否开启
+function judgeIosPermissionRecord() {
+	var result = false;
+	var avaudiosession = plus.ios.import("AVAudioSession");
+	var avaudio = avaudiosession.sharedInstance();
+	var permissionStatus = avaudio.recordPermission();
+	//console.log("permissionStatus:" + permissionStatus);
+	if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
+		//console.log("麦克风权限没有开启");
+	} else {
+		result = true;
+		//console.log("麦克风权限已经开启");
+	}
+	plus.ios.deleteObject(avaudiosession);
+	return result;
+}
+
+// 判断相机权限是否开启
+function judgeIosPermissionCamera() {
+	var result = false;
+	var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
+	var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
+	console.log("authStatus:" + authStatus);
+	if (authStatus == 3) {
+		result = true;
+		console.log("相机权限已经开启");
+	} else {
+		console.log("相机权限没有开启");
+	}
+	plus.ios.deleteObject(AVCaptureDevice);
+	return result;
+}
+
+// 判断相册权限是否开启
+function judgeIosPermissionPhotoLibrary() {
+	var result = false;
+	var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
+	var authStatus = PHPhotoLibrary.authorizationStatus();
+	console.log("authStatus:" + authStatus);
+	if (authStatus == 3) {
+		result = true;
+		console.log("相册权限已经开启");
+	} else {
+		console.log("相册权限没有开启");
+	}
+	plus.ios.deleteObject(PHPhotoLibrary);
+	return result;
+}
+
+// 判断通讯录权限是否开启
+function judgeIosPermissionContact() {
+	var result = false;
+	var CNContactStore = plus.ios.import("CNContactStore");
+	var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
+	if (cnAuthStatus == 3) {
+		result = true;
+		console.log("通讯录权限已经开启");
+	} else {
+		console.log("通讯录权限没有开启");
+	}
+	plus.ios.deleteObject(CNContactStore);
+	return result;
+}
+
+// 判断日历权限是否开启
+function judgeIosPermissionCalendar() {
+	var result = false;
+	var EKEventStore = plus.ios.import("EKEventStore");
+	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
+	if (ekAuthStatus == 3) {
+		result = true;
+		console.log("日历权限已经开启");
+	} else {
+		console.log("日历权限没有开启");
+	}
+	plus.ios.deleteObject(EKEventStore);
+	return result;
+}
+
+// 判断备忘录权限是否开启
+function judgeIosPermissionMemo() {
+	var result = false;
+	var EKEventStore = plus.ios.import("EKEventStore");
+	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
+	if (ekAuthStatus == 3) {
+		result = true;
+		console.log("备忘录权限已经开启");
+	} else {
+		console.log("备忘录权限没有开启");
+	}
+	plus.ios.deleteObject(EKEventStore);
+	return result;
+}
+
+// Android权限查询
+function requestAndroidPermission(permissionID) {
+	return new Promise((resolve, reject) => {
+		plus.android.requestPermissions(
+			[permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
+			function(resultObj) {
+				var result = 0;
+				for (var i = 0; i < resultObj.granted.length; i++) {
+					var grantedPermission = resultObj.granted[i];
+					//console.log('已获取的权限:' + grantedPermission);
+					result = 1
+				}
+				for (var i = 0; i < resultObj.deniedPresent.length; i++) {
+					var deniedPresentPermission = resultObj.deniedPresent[i];
+					//console.log('拒绝本次申请的权限:' + deniedPresentPermission);
+					result = 0
+				}
+				for (var i = 0; i < resultObj.deniedAlways.length; i++) {
+					var deniedAlwaysPermission = resultObj.deniedAlways[i];
+					//console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
+					result = -1
+				}
+				resolve(result);
+				// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
+				// if (result != 1) {
+				// gotoAppPermissionSetting()
+				// }
+			},
+			function(error) {
+				console.log('申请权限错误:' + error.code + " = " + error.message);
+				resolve({
+					code: error.code,
+					message: error.message
+				});
+			}
+		);
+	});
+}
+
+// 使用一个方法,根据参数判断权限
+function judgeIosPermission(permissionID) {
+	if (permissionID == "location") {
+		return judgeIosPermissionLocation()
+	} else if (permissionID == "camera") {
+		return judgeIosPermissionCamera()
+	} else if (permissionID == "photoLibrary") {
+		return judgeIosPermissionPhotoLibrary()
+	} else if (permissionID == "record") {
+		return judgeIosPermissionRecord()
+	} else if (permissionID == "push") {
+		return judgeIosPermissionPush()
+	} else if (permissionID == "contact") {
+		return judgeIosPermissionContact()
+	} else if (permissionID == "calendar") {
+		return judgeIosPermissionCalendar()
+	} else if (permissionID == "memo") {
+		return judgeIosPermissionMemo()
+	}
+	return false;
+}
+
+// 跳转到**应用**的权限页面
+// function gotoAppPermissionSetting() {
+// 	if (isIos) {
+// 		var UIApplication = plus.ios.import("UIApplication");
+// 		var application2 = UIApplication.sharedApplication();
+// 		var NSURL2 = plus.ios.import("NSURL");
+// 		// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
+// 		var setting2 = NSURL2.URLWithString("app-settings:");
+// 		application2.openURL(setting2);
+
+// 		plus.ios.deleteObject(setting2);
+// 		plus.ios.deleteObject(NSURL2);
+// 		plus.ios.deleteObject(application2);
+// 	} else {
+// 		// console.log(plus.device.vendor);
+// 		var Intent = plus.android.importClass("android.content.Intent");
+// 		var Settings = plus.android.importClass("android.provider.Settings");
+// 		var Uri = plus.android.importClass("android.net.Uri");
+// 		var mainActivity = plus.android.runtimeMainActivity();
+// 		var intent = new Intent();
+// 		intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+// 		var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
+// 		intent.setData(uri);
+// 		mainActivity.startActivity(intent);
+// 	}
+// }
+
+function gotoAppPermissionSetting(type = 1) {
+	if (isIos) {
+		var UIApplication = plus.ios.import("UIApplication");
+		var application2 = UIApplication.sharedApplication();
+		var NSURL2 = plus.ios.import("NSURL");
+		var setting2;
+
+		if (type === 1) {
+			setting2 = NSURL2.URLWithString("app-settings:");
+		} else if (type === 2) {
+			setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
+		}
+
+		if (setting2) {
+			application2.openURL(setting2);
+			plus.ios.deleteObject(setting2);
+		}
+
+		plus.ios.deleteObject(NSURL2);
+		plus.ios.deleteObject(application2);
+	} else {
+		var Intent = plus.android.importClass("android.content.Intent");
+		var Settings = plus.android.importClass("android.provider.Settings");
+		var Uri = plus.android.importClass("android.net.Uri");
+		var mainActivity = plus.android.runtimeMainActivity();
+		var intent = new Intent();
+
+		if (type === 1) {
+			intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+			var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
+			intent.setData(uri);
+		} else if (type === 2) {
+			intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+		}
+
+		mainActivity.startActivity(intent);
+	}
+}
+
+
+// 检查系统的设备服务是否开启
+// var checkSystemEnableLocation = async function () {
+function checkSystemEnableLocation() {
+	if (isIos) {
+		var result = false;
+		var cllocationManger = plus.ios.import("CLLocationManager");
+		var result = cllocationManger.locationServicesEnabled();
+		console.log("系统定位开启:" + result);
+		plus.ios.deleteObject(cllocationManger);
+		return result;
+	} else {
+		var context = plus.android.importClass("android.content.Context");
+		var locationManager = plus.android.importClass("android.location.LocationManager");
+		var main = plus.android.runtimeMainActivity();
+		var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
+		var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
+		console.log("系统定位开启:" + result);
+		return result
+	}
+}
+
+module.exports = {
+	judgeIosPermissionRecord: judgeIosPermissionRecord,
+	judgeAndroidPermissionRecord: judgeAndroidPermissionRecord,
+	judgeAndroidPermissionStorage: judgeAndroidPermissionStorage,
+	judgeAndroidPermissionLocation: judgeAndroidPermissionLocation,
+	judgeIosPermission: judgeIosPermission,
+	requestAndroidPermission: requestAndroidPermission,
+	checkSystemEnableLocation: checkSystemEnableLocation,
+	gotoAppPermissionSetting: gotoAppPermissionSetting
 }

+ 13 - 0
uni_modules/ai-speak/utils/tools.js

@@ -48,6 +48,19 @@ class Tools {
 		});
 		// 开始播放音频
 		innerAudioContext.play();
+	}
+
+	/**
+	 * 判断是否有定位权限
+	 */
+	static async checkLocationPermissions() {
+		let platform = uni.getSystemInfoSync().platform;
+		if (platform === 'android') { // 判断平台
+			return Permission.judgeAndroidPermissionLocation()
+		} else if (platform == 'ios') {
+			return Permission.judgeIosPermission('location');
+		}
+		return false;
 	}
 
 	/**