unknown
6 days ago
21 changed files with 576 additions and 17 deletions
-
20App - 副本.vue
-
47App.vue
-
42manifest.json
-
9pages.json
-
2pages/recordEntry/student/studentDetail/comp/info.vue
-
45pages/userCenter/aboutUs/aboutUs.vue
-
8pages/userCenter/personaInfo/personaInfo.vue
-
8pages/userCenter/personaInfo/setLatLng.vue
-
2pages/userCenter/scanCode/scanCodeSubjiect1.vue
-
BINstatic/images/userCenter/minIcon (2).png
-
2store/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,20 @@ |
|||
<script> |
|||
export default { |
|||
onLaunch: function() { |
|||
console.log('App Launch') |
|||
}, |
|||
onShow: function() { |
|||
console.log('App Show') |
|||
}, |
|||
onHide: function() { |
|||
console.log('App Hide') |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
/*每个页面公共css */ |
|||
@import '@/uni_modules/uview-ui/index.scss'; |
|||
@import 'common/css/app.scss'; |
|||
|
|||
</style> |
@ -0,0 +1,45 @@ |
|||
<template> |
|||
<view class="main"> |
|||
<view class="logo"> |
|||
<image src="@/static/images/userCenter/minIcon (2).png" mode="widthFix"></image> |
|||
</view> |
|||
<view class="text"> |
|||
版本号: {{version}} |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script > |
|||
export default { |
|||
data() { |
|||
return { |
|||
version: '1.0.0' |
|||
} |
|||
}, |
|||
onLoad() { |
|||
// #ifdef APP-PLUS |
|||
this.version = plus.runtime.version |
|||
// #endif |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.main { |
|||
padding: 230rpx 0 0 0; |
|||
.logo { |
|||
display: flex; |
|||
justify-content: center; |
|||
image { |
|||
display: block; |
|||
width: 120rpx; |
|||
} |
|||
} |
|||
.text { |
|||
margin-top: 20rpx; |
|||
font-size: 32rpx; |
|||
color: #666; |
|||
text-align: center; |
|||
} |
|||
} |
|||
</style> |
After Width: 54 | Height: 51 | Size: 2.3 KiB |
@ -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