unknown
7 days ago
30 changed files with 830 additions and 80 deletions
-
46App.vue
-
7components/callPhone/callPhone.vue
-
4config/api.js
-
2config/site.config.js
-
12config/utils.js
-
12manifest.json
-
8pages/indexEntry/consult/pubComplaint/pubComplaint.vue
-
9pages/indexEntry/consult/pubConsult/pubConsult.vue
-
7pages/indexEntry/signIn/signAndOut/signAndOut.vue
-
7pages/indexEntry/signIn/signAndOut/signAndOutSubjiect1.vue
-
27pages/indexEntry/signIn/signIn.vue
-
27pages/indexEntry/theory/theory.vue
-
8pages/indexEntry/theory/webView.vue
-
6pages/mineEntry/personaInfo/personaInfo.vue
-
6pages/tabbar/index/comp/schoolItem.vue
-
24pages/tabbar/index/index.vue
-
7pages/tabbar/mine/index.vue
-
3store/index.js
-
230store/modules/permissionToast.js
-
50store/modules/user.js
-
8uni_modules/uni-registerRequestPermissionTips/changelog.md
-
115uni_modules/uni-registerRequestPermissionTips/package.json
-
95uni_modules/uni-registerRequestPermissionTips/readme.md
-
3uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/AndroidManifest.xml
-
3uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/config.json
-
148uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/index.uts
-
6uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_enter.xml
-
5uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_exit.xml
-
6uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/drawable/dcloud_permission_background.xml
-
19uni_modules/uni-registerRequestPermissionTips/utssdk/interface.uts
@ -0,0 +1,230 @@ |
|||||
|
// 页面路径:store/index.js
|
||||
|
|
||||
|
const permissionToast = { |
||||
|
// 初始化状态
|
||||
|
state: { |
||||
|
// 处理应用程序权限请求
|
||||
|
WRITE_EXTERNAL_STORAGE: false, |
||||
|
ACCESS_FINE_LOCATION: false, |
||||
|
CAMERA: false, |
||||
|
CALL_PHONE: false, |
||||
|
/* #ifdef APP-PLUS */ |
||||
|
isIos: plus.os.name == "iOS", |
||||
|
/* #endif */ |
||||
|
mapping: { |
||||
|
'CAMERA': { |
||||
|
title: "洛阳学车对扫开相机/摄像头权限申请说明", |
||||
|
content: "便于您使用该功能拍照,扫码,打卡签到签退等功能", |
||||
|
methods: 'SET_CAMERA' |
||||
|
}, |
||||
|
'WRITE_EXTERNAL_STORAGE': { |
||||
|
title: "洛阳学车对存储空间/照片权限申请说明", |
||||
|
content: "便于您使用该功能上传您的照片/图片/视频及用于更换头像、下载、投诉与咨询等场景中读取和写入相册和文件内容。", |
||||
|
methods: 'SET_WRITE_EXTERNAL_STORAGE' |
||||
|
}, |
||||
|
'ACCESS_FINE_LOCATION': { |
||||
|
title: "洛阳学车对地理位置权限申请说明", |
||||
|
content: "洛阳学车应用程序可以提供基于位置的服务、定位导航、计算距离、扫码场地打卡等功能。", |
||||
|
methods: 'SET_ACCESS_FINE_LOCATION' |
||||
|
}, |
||||
|
'CALL_PHONE': { |
||||
|
title: "洛阳学车拨打/管理电话权限申请说明", |
||||
|
content: "便于您使用该功能联系驾校、教练场景下使用", |
||||
|
methods: 'SET_CALL_PHONE' |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
mutations: { |
||||
|
// 管理权限告知目的
|
||||
|
SET_WRITE_EXTERNAL_STORAGE(state, val) { |
||||
|
state.WRITE_EXTERNAL_STORAGE = val |
||||
|
}, |
||||
|
SET_CALL_PHONE(state, val) { |
||||
|
state.CALL_PHONE = val |
||||
|
}, |
||||
|
SET_ACCESS_FINE_LOCATION(state, val) { |
||||
|
state.ACCESS_FINE_LOCATION = val |
||||
|
}, |
||||
|
SET_CAMERA(state,val) { |
||||
|
state.CAMERA = val |
||||
|
} |
||||
|
}, |
||||
|
actions: { |
||||
|
//权限获取
|
||||
|
async requestPermissions({state,dispatch,commit}, permissionID) { |
||||
|
console.log('gogogoog来了没??') |
||||
|
try { |
||||
|
if (!state[permissionID] && !state.isIos) { |
||||
|
var viewObj = await dispatch('nativeObjView', permissionID); |
||||
|
viewObj.show(); |
||||
|
} |
||||
|
console.log('android.permission.' + permissionID, '当前手机权限'); |
||||
|
return new Promise(async (resolve, reject) => { |
||||
|
//苹果不需要这个
|
||||
|
if (state.isIos) { |
||||
|
resolve(1); |
||||
|
return |
||||
|
} |
||||
|
// 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); |
||||
|
}, |
||||
|
function(error) { |
||||
|
console.log('申请权限错误:' + error.code + " = " + error |
||||
|
.message); |
||||
|
resolve({ |
||||
|
code: error.code, |
||||
|
message: error.message |
||||
|
}); |
||||
|
} |
||||
|
); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
const result = await requestAndroidPermission( |
||||
|
'android.permission.' + permissionID |
||||
|
); |
||||
|
if (result === 1) { |
||||
|
//'已获得授权'
|
||||
|
commit(state.mapping[permissionID].methods, true) |
||||
|
} else if (result === 0) { |
||||
|
//'未获得授权'
|
||||
|
commit(state.mapping[permissionID].methods, false) |
||||
|
} else { |
||||
|
commit(state.mapping[permissionID].methods, true) |
||||
|
uni.showModal({ |
||||
|
title: '提示', |
||||
|
content: '操作权限已被拒绝,请手动前往设置', |
||||
|
confirmText: "立即设置", |
||||
|
success: (res) => { |
||||
|
if (res.confirm) { |
||||
|
dispatch('gotoAppPermissionSetting') |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
if (viewObj) viewObj.close() |
||||
|
resolve(result); |
||||
|
}); |
||||
|
} catch (error) { |
||||
|
console.log(error); |
||||
|
uni.$u.toast('应用定位权限已关闭,请手动打开') |
||||
|
uni.hideLoading() |
||||
|
reject(error); |
||||
|
} |
||||
|
}, |
||||
|
//提示框
|
||||
|
nativeObjView({state}, permissionID) { |
||||
|
const systemInfo = uni.getSystemInfoSync(); |
||||
|
const statusBarHeight = systemInfo.statusBarHeight; |
||||
|
const navigationBarHeight = systemInfo.platform === 'android' ? 48 : |
||||
|
44; // Set the navigation bar height based on the platform
|
||||
|
const totalHeight = statusBarHeight + navigationBarHeight; |
||||
|
let view = new plus.nativeObj.View('per-modal', { |
||||
|
top: '0px', |
||||
|
left: '0px', |
||||
|
width: '100%', |
||||
|
backgroundColor: '#444', |
||||
|
//opacity: .5;
|
||||
|
}) |
||||
|
view.drawRect({ |
||||
|
color: '#fff', |
||||
|
radius: '5px' |
||||
|
}, { |
||||
|
top: totalHeight + 'px', |
||||
|
left: '5%', |
||||
|
width: '90%', |
||||
|
height: "100px", |
||||
|
}) |
||||
|
view.drawText(state.mapping[permissionID].title, { |
||||
|
top: totalHeight + 5 + 'px', |
||||
|
left: "8%", |
||||
|
height: "30px" |
||||
|
}, { |
||||
|
align: "left", |
||||
|
color: "#000", |
||||
|
}, { |
||||
|
onClick: function(e) { |
||||
|
console.log(e); |
||||
|
} |
||||
|
}) |
||||
|
view.drawText(state.mapping[permissionID].content, { |
||||
|
top: totalHeight + 35 + 'px', |
||||
|
height: "60px", |
||||
|
left: "8%", |
||||
|
width: "84%" |
||||
|
}, { |
||||
|
whiteSpace: 'normal', |
||||
|
size: "14px", |
||||
|
align: "left", |
||||
|
color: "#656563" |
||||
|
}) |
||||
|
|
||||
|
function show() { |
||||
|
view = plus.nativeObj.View.getViewById('per-modal'); |
||||
|
view.show() |
||||
|
view = null //展示的时候也得清空,不然影响下次的关闭,不知道为啥
|
||||
|
} |
||||
|
|
||||
|
function close() { |
||||
|
view = plus.nativeObj.View.getViewById('per-modal'); |
||||
|
view.close(); |
||||
|
view = null |
||||
|
} |
||||
|
return { |
||||
|
show, |
||||
|
close |
||||
|
} |
||||
|
}, |
||||
|
// 跳转到**应用**的权限页面
|
||||
|
gotoAppPermissionSetting({state}) { |
||||
|
if (state.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); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
// 导出 store
|
||||
|
export default permissionToast |
@ -0,0 +1,8 @@ |
|||||
|
## 1.0.3(2024-10-18) |
||||
|
修复4.25版引起的插件回调只触发一次的问题。 |
||||
|
## 1.0.2(2024-09-05) |
||||
|
修复uni.chooseImage或者其他部分情况下弹窗不显示的bug。 |
||||
|
## 1.0.1(2024-05-30) |
||||
|
修复云打包可能报错的bug |
||||
|
## 1.0.0(2024-03-09) |
||||
|
支持全局监听权限申请。当申请权限时,会在页面顶部显示申请权限的目的。 |
@ -0,0 +1,115 @@ |
|||||
|
{ |
||||
|
"id": "uni-registerRequestPermissionTips", |
||||
|
"displayName": "uni-registerRequestPermissionTips", |
||||
|
"version": "1.0.3", |
||||
|
"description": "支持android平台全局监听权限的申请。当申请权限时,会在页面顶部显示申请权限的目的。主要解决上架华为应用市场审核要求:APP在调用终端权限时,应同步告知用户申请该权限的目的。", |
||||
|
"keywords": [ |
||||
|
"权限", |
||||
|
"权限申请", |
||||
|
"上架", |
||||
|
"华为" |
||||
|
], |
||||
|
"repository": "", |
||||
|
"engines": { |
||||
|
"HBuilderX": "^4.0" |
||||
|
}, |
||||
|
"dcloudext": { |
||||
|
"type": "uts", |
||||
|
"sale": { |
||||
|
"regular": { |
||||
|
"price": "0.00" |
||||
|
}, |
||||
|
"sourcecode": { |
||||
|
"price": "0.00" |
||||
|
} |
||||
|
}, |
||||
|
"contact": { |
||||
|
"qq": "" |
||||
|
}, |
||||
|
"declaration": { |
||||
|
"ads": "无", |
||||
|
"data": "无", |
||||
|
"permissions": "无" |
||||
|
}, |
||||
|
"npmurl": "" |
||||
|
}, |
||||
|
"uni_modules": { |
||||
|
"dependencies": [ |
||||
|
], |
||||
|
"uni-ext-api": { |
||||
|
"uni": { |
||||
|
"registerRequestPermissionTipsListener": { |
||||
|
"name": "registerRequestPermissionTipsListener", |
||||
|
"app": { |
||||
|
"js": false, |
||||
|
"kotlin": true, |
||||
|
"swift": false |
||||
|
} |
||||
|
}, |
||||
|
"unregisterRequestPermissionTipsListener": { |
||||
|
"name": "unregisterRequestPermissionTipsListener", |
||||
|
"app": { |
||||
|
"js": false, |
||||
|
"kotlin": true, |
||||
|
"swift": false |
||||
|
} |
||||
|
}, |
||||
|
"setRequestPermissionTips": { |
||||
|
"name": "setRequestPermissionTips", |
||||
|
"app": { |
||||
|
"js": false, |
||||
|
"kotlin": true, |
||||
|
"swift": false |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"encrypt": [], |
||||
|
"platforms": { |
||||
|
"cloud": { |
||||
|
"tcb": "y", |
||||
|
"aliyun": "y", |
||||
|
"alipay": "y" |
||||
|
}, |
||||
|
"client": { |
||||
|
"Vue": { |
||||
|
"vue2": "y", |
||||
|
"vue3": "y" |
||||
|
}, |
||||
|
"App": { |
||||
|
"app-android": "y", |
||||
|
"app-ios": "n", |
||||
|
"app-harmony": "u" |
||||
|
}, |
||||
|
"H5-mobile": { |
||||
|
"Safari": "n", |
||||
|
"Android Browser": "n", |
||||
|
"微信浏览器(Android)": "n", |
||||
|
"QQ浏览器(Android)": "n" |
||||
|
}, |
||||
|
"H5-pc": { |
||||
|
"Chrome": "n", |
||||
|
"IE": "n", |
||||
|
"Edge": "n", |
||||
|
"Firefox": "n", |
||||
|
"Safari": "n" |
||||
|
}, |
||||
|
"小程序": { |
||||
|
"微信": "n", |
||||
|
"阿里": "n", |
||||
|
"百度": "n", |
||||
|
"字节跳动": "n", |
||||
|
"QQ": "n", |
||||
|
"钉钉": "n", |
||||
|
"快手": "n", |
||||
|
"飞书": "n", |
||||
|
"京东": "n" |
||||
|
}, |
||||
|
"快应用": { |
||||
|
"华为": "n", |
||||
|
"联盟": "n" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,95 @@ |
|||||
|
## registerRequestPermissionTipsListener(listener?) |
||||
|
注册权限监听事件 |
||||
|
## unregisterRequestPermissionTipsListener(listener?) |
||||
|
取消注册权限监听事件 |
||||
|
|
||||
|
## RequestPermissionTipsListener的属性值 |
||||
|
|名称 |类型 |描述 |必填 | |
||||
|
|:-- |:-- |:-- |:-- | |
||||
|
|onRequest |(permissions:Array<string>)=>void |申请系统权限回调,permissions为触发权限申请的所有权限 |否 | |
||||
|
|onConfirm |(permissions:Array<string>)=>void |弹出系统权限授权框回调,permissions为触发弹出权限授权框的所有权限 |否 | |
||||
|
|onComplete |(permissions:UTSJSONObject)=>void |权限申请完成回调,permissions包括权限及权限的状态。`grant`为权限已获取,`denied`为权限已拒绝 |否 | |
||||
|
|
||||
|
## setRequestPermissionTips(UTSJSONObject) |
||||
|
设置权限监听的说明。支持针对权限设置具体的说明。 |
||||
|
|
||||
|
参考:`{"android.permission.CAMERA":"<p>相机权限申请说明</p>"}` |
||||
|
|
||||
|
安卓权限列表可参考[谷歌官方文档](https://developer.android.com/reference/android/Manifest.permission)。 |
||||
|
|
||||
|
权限申请说明基于原生TextView实现,可以实现加载html内容,支持的标签及属性可参考: |
||||
|
``` |
||||
|
<b> 或 <strong>:加粗文本。 |
||||
|
<i> 或 <em>:斜体文本。 |
||||
|
<u>:下划线文本。 |
||||
|
<sup>:上标文本。 |
||||
|
<sub>:下标文本。 |
||||
|
<tt>:等宽字体文本。 |
||||
|
<big>:放大字体。 |
||||
|
<small>:缩小字体。 |
||||
|
<strike> 或 <s> 或 <del>:带有删除线的文本。 |
||||
|
<p>:段落。 |
||||
|
<div>:块级容器。 |
||||
|
<h1>,<h2>,<h3>,<h4>,<h5>,<h6>:区域标题元素。 |
||||
|
<ul>, <ol>, <li>:无序列表和有序列表。 |
||||
|
<br>:换行。 |
||||
|
<font color="..."> 和 <font size="...">:设置文本颜色和大小。 |
||||
|
``` |
||||
|
|
||||
|
## 示例 |
||||
|
|
||||
|
``` |
||||
|
<script> |
||||
|
import { |
||||
|
registerRequestPermissionTipsListener, |
||||
|
unregisterRequestPermissionTipsListener, |
||||
|
setRequestPermissionTips |
||||
|
} from "@/uni_modules/uni-registerRequestPermissionTips" |
||||
|
var PermissionTips = { |
||||
|
"android.permission.CAMERA": "<h4 style=\"font-size:40px;\">正在读取通讯录权限</h4><font color=#cccccc>通讯录权限不会获取任何信息,请注意</font>", |
||||
|
"android.permission.READ_PHONE_STATE": "<h4 style=\"font-size:40px;\">正在读取网络状态权限</h4><font color=#cccccc>通讯录权限不会获取任何信息,请注意通讯录权限不会获取任何信息,请注意通讯录权限不会获取任何信息,请注意</font>" |
||||
|
} |
||||
|
export default { |
||||
|
onLaunch: function() { |
||||
|
var brand = uni.getSystemInfoSync().deviceBrand |
||||
|
setRequestPermissionTips(PermissionTips) |
||||
|
registerRequestPermissionTipsListener({ |
||||
|
onRequest: (e) => { |
||||
|
console.log(e) |
||||
|
}, |
||||
|
onConfirm: (e) => { |
||||
|
console.log(e) |
||||
|
}, |
||||
|
onComplete: (e) => { |
||||
|
// 华为手机在权限禁止之后,再次申请权限不会出现权限申请框。此时应该引导用户去系统设置开启此权限,不应该频繁申请。 |
||||
|
if (brand.toLowerCase() == "huawei") { |
||||
|
var tips = {} |
||||
|
var hasDeniedPermission = false |
||||
|
for (var k in PermissionTips) { |
||||
|
if (e[k] != "denied") { |
||||
|
tips[k] = PermissionTips[k] |
||||
|
} else { |
||||
|
hasDeniedPermission = true |
||||
|
} |
||||
|
} |
||||
|
setRequestPermissionTips(tips) // 更新弹框提醒,防止华为手机不出现权限申请框时权限提醒框闪烁的情况 |
||||
|
if (hasDeniedPermission) |
||||
|
uni.showModal({ |
||||
|
content: "权限已经被拒绝,请前往设置中开启" |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
onShow: function() { |
||||
|
console.log('App Show') |
||||
|
}, |
||||
|
onHide: function() { |
||||
|
console.log('App Hide') |
||||
|
}, |
||||
|
onExit: function() { |
||||
|
unregisterRequestPermissionTipsListener(null) |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
``` |
@ -0,0 +1,3 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="io.dcloud.uts.permissionrequest"> |
||||
|
</manifest> |
@ -0,0 +1,3 @@ |
|||||
|
{ |
||||
|
"minSdkVersion": "21" |
||||
|
} |
@ -0,0 +1,148 @@ |
|||||
|
import { UnregisterRequestPermissionTipsListener, RegisterRequestPermissionTipsListener, RequestPermissionTipsListener, SetRequestPermissionTips } from "../interface"; |
||||
|
import RelativeLayout from 'android.widget.RelativeLayout'; |
||||
|
import LinearLayout from 'android.widget.LinearLayout'; |
||||
|
import Color from 'android.graphics.Color'; |
||||
|
import TextView from 'android.widget.TextView'; |
||||
|
import ViewGroup from 'android.view.ViewGroup'; |
||||
|
import Activity from 'android.app.Activity'; |
||||
|
import HashMap from 'java.util.HashMap'; |
||||
|
import AnimationUtils from 'android.view.animation.AnimationUtils'; |
||||
|
import R from 'io.dcloud.uts.permissionrequest.R' |
||||
|
import Html from 'android.text.Html'; |
||||
|
import View from 'android.view.View'; |
||||
|
import Runnable from "java.lang.Runnable" |
||||
|
|
||||
|
let PermissionTipsView : View | null = null |
||||
|
let permissionTips : HashMap<String, String> = new HashMap<String, String>() |
||||
|
var permissionListener : RequestPermissionListener | null = null |
||||
|
var listener : RequestPermissionTipsListener | null = null |
||||
|
|
||||
|
@UTSJS.keepAlive |
||||
|
export function unregisterRequestPermissionTipsListener(e : RequestPermissionTipsListener | null) { |
||||
|
listener = null; |
||||
|
if (permissionListener != null) { |
||||
|
permissionListener!.stop() |
||||
|
permissionListener = null |
||||
|
} |
||||
|
if (PermissionTipsView != null) { |
||||
|
if (PermissionTipsView!.getParent() != null) { |
||||
|
PermissionTipsView!.setAnimation(null); |
||||
|
((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView) |
||||
|
} |
||||
|
PermissionTipsView = null |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@UTSJS.keepAlive |
||||
|
export function registerRequestPermissionTipsListener(l : RequestPermissionTipsListener | null) { |
||||
|
listener = l |
||||
|
if (permissionListener == null) { |
||||
|
permissionListener = uni.createRequestPermissionListener() |
||||
|
permissionListener!.onRequest((permissions : Array<string>) => { |
||||
|
if (listener != null) |
||||
|
listener!.onRequest?.invoke(permissions) |
||||
|
}) |
||||
|
permissionListener!.onConfirm((permissions : Array<string>) => { |
||||
|
UTSAndroid.getUniActivity()!.runOnUiThread(new ConfirmRunnable(permissions)) |
||||
|
}) |
||||
|
permissionListener!.onComplete((permissions : Array<string>) => { |
||||
|
UTSAndroid.getUniActivity()!.runOnUiThread(new CompleteRunnable(permissions)) |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
class ConfirmRunnable implements Runnable { |
||||
|
permissions : Array<string> |
||||
|
constructor(permissions : Array<string>) { |
||||
|
this.permissions = permissions |
||||
|
} |
||||
|
override run() { |
||||
|
let activity = UTSAndroid.getUniActivity()! |
||||
|
if (PermissionTipsView != null && PermissionTipsView!.getParent() != null) { |
||||
|
PermissionTipsView!.setAnimation(null); |
||||
|
((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView) |
||||
|
} |
||||
|
if (this.permissions.length > 0) { |
||||
|
try { |
||||
|
PermissionTipsView = createPermissionWindow(activity, this.permissions); |
||||
|
if (PermissionTipsView != null) { |
||||
|
(activity.findViewById(android.R.id.content) as ViewGroup).addView(PermissionTipsView!) |
||||
|
} |
||||
|
} catch (e) { |
||||
|
console.log(e) |
||||
|
} |
||||
|
} |
||||
|
if (listener != null) |
||||
|
listener!.onConfirm?.invoke(this.permissions) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
class CompleteRunnable implements Runnable { |
||||
|
permissions : Array<string> |
||||
|
constructor(permissions : Array<string>) { |
||||
|
this.permissions = permissions |
||||
|
} |
||||
|
override run() { |
||||
|
let activity = UTSAndroid.getUniActivity()! |
||||
|
if (PermissionTipsView != null) { |
||||
|
PermissionTipsView!.setAnimation(AnimationUtils.loadAnimation(activity, R.anim.popupwindow_exit)); |
||||
|
((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView!) |
||||
|
PermissionTipsView = null |
||||
|
} |
||||
|
if (listener != null) { |
||||
|
var permissionStatus = {} |
||||
|
for (var p in this.permissions) { |
||||
|
permissionStatus[p] = UTSAndroid.checkSystemPermissionGranted(UTSAndroid.getUniActivity()!, [p]) ? "grant" : "denied" |
||||
|
} |
||||
|
listener!.onComplete?.invoke(permissionStatus) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export const setRequestPermissionTips : SetRequestPermissionTips = (tips : UTSJSONObject) => { |
||||
|
permissionTips.clear() |
||||
|
for (var k in tips) { |
||||
|
permissionTips.put(k, tips[k] != null ? tips[k].toString() : "") |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function createPermissionWindow(activity : Activity, permissions : Array<string>) : ViewGroup | null { |
||||
|
let rootView = new RelativeLayout(activity); |
||||
|
rootView.setBackgroundColor(Color.TRANSPARENT); |
||||
|
let backgroundView = new LinearLayout(activity); |
||||
|
backgroundView.setPadding(30, 0, 30, 30); |
||||
|
backgroundView.setOrientation(1) |
||||
|
backgroundView.setBackgroundResource(R.drawable.dcloud_permission_background); |
||||
|
let permissionTipsList : Array<string> = new Array<string>() |
||||
|
for (var p in permissions) { |
||||
|
if (permissionTips.containsKey(p) && permissionTipsList.indexOf(permissionTips.get(p)) == -1) { |
||||
|
permissionTipsList.push(permissionTips.get(p)!) |
||||
|
} |
||||
|
} |
||||
|
for (var p in permissionTipsList) { |
||||
|
let text = new TextView(activity); |
||||
|
text.setText(Html.fromHtml(p, Html.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING)) |
||||
|
text.setPadding(0, 30, 0, 0) |
||||
|
text.setTextSize((5 * getScale()).toFloat()) |
||||
|
text.setTextColor(Color.BLACK) |
||||
|
backgroundView.addView(text) |
||||
|
} |
||||
|
if (backgroundView.getChildCount() == 0) { |
||||
|
return null; |
||||
|
} |
||||
|
let rll = new RelativeLayout.LayoutParams(-1, -2) |
||||
|
rll.topMargin = (UTSAndroid.getStatusBarHeight() * getScale()).toInt(); |
||||
|
rll.leftMargin = 30; |
||||
|
rll.rightMargin = 30; |
||||
|
rll.bottomMargin = 30; |
||||
|
rootView.addView(backgroundView, rll) |
||||
|
rootView.setAnimation(AnimationUtils.loadAnimation(activity, R.anim.popupwindow_enter)); |
||||
|
return rootView; |
||||
|
} |
||||
|
|
||||
|
function getScale() : Float { |
||||
|
if (UTSAndroid.getUniActivity() != null) { |
||||
|
return UTSAndroid.getUniActivity()!.resources.displayMetrics.scaledDensity |
||||
|
} |
||||
|
return (0 as number).toFloat(); |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<translate xmlns:android="http://schemas.android.com/apk/res/android" |
||||
|
android:duration="200" |
||||
|
android:fromYDelta="-100%" |
||||
|
android:toYDelta="0" > |
||||
|
</translate> |
@ -0,0 +1,5 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<translate xmlns:android="http://schemas.android.com/apk/res/android" |
||||
|
android:duration="200" |
||||
|
android:fromYDelta="0" |
||||
|
android:toYDelta="-100%" /> |
@ -0,0 +1,6 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android" > |
||||
|
<corners android:radius="8dp" /> |
||||
|
<!-- <stroke android:color="@color/black" android:width="2dp"/>--> |
||||
|
<solid android:color="#ffffff"/> |
||||
|
</shape> |
@ -0,0 +1,19 @@ |
|||||
|
export type RequestPermissionTipsListener = { |
||||
|
onRequest ?: ((permissions : Array<string>) => void) | null, |
||||
|
onConfirm ?: ((permission : Array<string>) => void) | null, |
||||
|
onComplete ?: ((permissions : UTSJSONObject) => void) | null |
||||
|
} |
||||
|
|
||||
|
|
||||
|
export type RegisterRequestPermissionTipsListener = (listener : RequestPermissionTipsListener | null) => void |
||||
|
export type UnregisterRequestPermissionTipsListener = (listener : RequestPermissionTipsListener | null) => void |
||||
|
export type SetRequestPermissionTips = (tips : UTSJSONObject) => void |
||||
|
|
||||
|
export interface Uni { |
||||
|
|
||||
|
registerRequestPermissionTipsListener : RegisterRequestPermissionTipsListener, |
||||
|
|
||||
|
unregisterRequestPermissionTipsListener : UnregisterRequestPermissionTipsListener |
||||
|
|
||||
|
setRequestPermissionTips : SetRequestPermissionTips |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue