26 changed files with 1765 additions and 651 deletions
@ -0,0 +1,3 @@ |
|||
{ |
|||
"prompt" : "none" |
|||
} |
|||
@ -0,0 +1,296 @@ |
|||
/** |
|||
* 本模块封装了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"); |
|||
console.log("enabledTypes1:" + enabledTypes); |
|||
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 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 |
|||
}); |
|||
} |
|||
); |
|||
}); |
|||
} |
|||
|
|||
//权限设置专用检查(解决onShow循环问题)
|
|||
function queryRightsSettingPermission(permissionID){ |
|||
plus.android.requestPermissions([permissionID], function(e){ |
|||
if(e.granted.length>0){ //权限被允许
|
|||
//调用依赖获取定位权限的代码
|
|||
console.log('granted!!! '+e.granted.toString()); |
|||
return 1; |
|||
} |
|||
if(e.deniedAlways.length>0){ //权限被永久拒绝
|
|||
// 弹出提示框解释为何需要定位权限,引导用户打开设置页面开启
|
|||
console.log('Always Denied!!! '+e.deniedAlways.toString()); |
|||
return -1; |
|||
} |
|||
if(e.deniedPresent.length>0){ //权限被临时拒绝
|
|||
// 弹出提示框解释为何需要定位权限,可再次调用plus.android.requestPermissions申请权限
|
|||
console.log('Present Denied!!! '+e.deniedPresent.toString()); |
|||
return 0; |
|||
} |
|||
}, function(e){ |
|||
console.log('Request Permissions error:'+JSON.stringify(e)); |
|||
}); |
|||
} |
|||
|
|||
// 使用一个方法,根据参数判断权限
|
|||
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); |
|||
} |
|||
} |
|||
|
|||
// 检查系统的设备服务是否开启
|
|||
// 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 = { |
|||
judgeIosPermission: judgeIosPermission, |
|||
requestAndroidPermission: requestAndroidPermission, |
|||
checkSystemEnableLocation: checkSystemEnableLocation, |
|||
gotoAppPermissionSetting: gotoAppPermissionSetting, |
|||
queryRightsSettingPermission: queryRightsSettingPermission |
|||
} |
|||
@ -0,0 +1,119 @@ |
|||
<template> |
|||
<view class="content"> |
|||
<!-- <view class="radioStyle"> |
|||
<tn-radio-group v-model="radioValue" width="100%" wrap :size="radioGroupSize"> |
|||
<tn-radio :iconSize="iconSize" :labelSize="labelSize" v-for="(item, index) in radioList" :key="index" :name="item.name" :disabled="item.disabled"> |
|||
<view class="radioFont">{{ item.name }}</view> |
|||
</tn-radio> |
|||
</tn-radio-group> |
|||
</view> |
|||
<view class="radioBtn"> |
|||
<tn-button @click="submitFeedback()" backgroundColor="#0186ff" width="600rpx" height="100rpx" |
|||
:fontSize="btnFontSize">Submit</tn-button> |
|||
</view> |
|||
<tn-toast ref="toast"></tn-toast> --> |
|||
<text style="color: #fff; font-size: 48rpx;"> this is policy</text> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
radioGroupSize: 45, |
|||
labelSize: 45, |
|||
iconSize: 40, |
|||
btnFontSize: 36, |
|||
radioValue: '', |
|||
radioList:[ |
|||
{ |
|||
'name': 'Scan faild', |
|||
'disabled': false |
|||
}, |
|||
{ |
|||
'name': 'Too many ads', |
|||
'disabled': false |
|||
}, |
|||
{ |
|||
'name': 'Need more infomation', |
|||
'disabled': false |
|||
}, |
|||
{ |
|||
'name': 'Bugs', |
|||
'disabled': false |
|||
}, |
|||
{ |
|||
'name': 'Other', |
|||
'disabled': false |
|||
} |
|||
] |
|||
} |
|||
}, |
|||
onLoad() { |
|||
//更改starTipStatus状态 |
|||
//this.setStarTipStatus(false); |
|||
}, |
|||
onHide() { |
|||
|
|||
}, |
|||
methods: { |
|||
|
|||
//设置弹窗状态结果 |
|||
// setStarTipStatus(value){ |
|||
// uni.setStorageSync('starTipStatus', value); |
|||
// }, |
|||
|
|||
//提交反馈 |
|||
// submitFeedback(){ |
|||
// let that = this; |
|||
// if(that.radioValue == '' || that.radioValue == null){ |
|||
// that.$refs.toast.show({ |
|||
// title: 'Fail', |
|||
// content: 'please select one!', |
|||
// icon: 'fail', |
|||
// duration: 3000 |
|||
// }) |
|||
// }else{ |
|||
// that.$refs.toast.show({ |
|||
// title: 'Success', |
|||
// content: 'Thanks for feedback!', |
|||
// icon: 'success', |
|||
// duration: 3000 |
|||
// }) |
|||
// //返回上一个页面 |
|||
// setTimeout(() =>{ |
|||
// uni.navigateBack(); |
|||
// }, 3000); |
|||
// } |
|||
// } |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.content { |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-content: flex-start; |
|||
background-color: #1F222B; |
|||
height:100vh; |
|||
} |
|||
|
|||
.radioStyle{ |
|||
//border: 1px solid red; |
|||
margin-top: 50rpx; |
|||
margin-left: 50rpx; |
|||
padding-top: 100rpx; |
|||
} |
|||
|
|||
.radioFont{ |
|||
color: #fff; |
|||
//margin-top: 50rpx; |
|||
} |
|||
|
|||
.radioBtn{ |
|||
//border: 1px solid yellow; |
|||
margin-top: 600rpx; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,75 @@ |
|||
<template> |
|||
<view class="content"> |
|||
<view class="textBoard"> |
|||
<text style="color: #fff; font-size: 48rpx;">Need permissions?</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<text style="color: #fff; font-size: 36rpx;">Camera permission is requeired to</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<text style="color: #0186FF; font-size: 36rpx;">QR Code Scanner & barcode Reader.</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<tn-button @click="openPermission()" :backgroundColor="btnBackgroundColor" :fontColor="btnFontColor" width="300rpx" height="100rpx" |
|||
:fontSize="btnFontSize">Allow</tn-button> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import permision from "@/js_sdk/wa-permission/permission.js" |
|||
export default { |
|||
data() { |
|||
return { |
|||
btnFontSize: 36, |
|||
btnBackgroundColor: '#0186ff', |
|||
btnFontColor: '#fff' |
|||
} |
|||
}, |
|||
onLoad() { |
|||
|
|||
}, |
|||
onHide() { |
|||
|
|||
}, |
|||
methods: { |
|||
|
|||
//打开授权 |
|||
async openPermission(){ |
|||
let that = this; |
|||
console.log('打开授权') |
|||
var result = await permision.requestAndroidPermission('android.permission.CAMERA') |
|||
if (result == 1) { |
|||
//有权限,跳转到扫码界面 |
|||
that.jumpToRights('/pages/scan/Scan'); |
|||
}else if(result == -1) { |
|||
//禁止权限,跳转到权限设置页面 |
|||
that.jumpToRights('/pages/rights/RightsSetting'); |
|||
} |
|||
}, |
|||
|
|||
//跳转到授权设置页面 |
|||
jumpToRights(url){ |
|||
uni.switchTab({ |
|||
url: url |
|||
}) |
|||
} |
|||
|
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.content { |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-content: center; |
|||
background-color: #1F222B; |
|||
height:100vh; |
|||
} |
|||
|
|||
.textBoard{ |
|||
margin-top: 1vh; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,100 @@ |
|||
<template> |
|||
<view class="content"> |
|||
<view class="textBoard"> |
|||
<text style="color: #fff; font-size: 48rpx;">Need permissions?</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<text style="color: #fff; font-size: 36rpx;">Camera permission is requeired to</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<text style="color: #0186FF; font-size: 36rpx;">QR Code Scanner & barcode Reader.</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<text style="color: #fff; font-size: 36rpx;">1.Open settings</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<text style="color: #fff; font-size: 36rpx;">2.Tap permissions</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<text style="color: #fff; font-size: 36rpx;">3.Turn on Camera</text> |
|||
</view> |
|||
<view class="textBoard"> |
|||
<tn-button @click="setPermission()" :backgroundColor="btnBackgroundColor" :fontColor="btnFontColor" width="300rpx" height="100rpx" |
|||
:fontSize="btnFontSize">Open settings</tn-button> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import permision from "@/js_sdk/wa-permission/permission.js" |
|||
export default { |
|||
data() { |
|||
return { |
|||
btnFontSize: 36, |
|||
btnBackgroundColor: '#0186ff', |
|||
btnFontColor: '#fff', |
|||
hasRequestedPermission: false |
|||
} |
|||
}, |
|||
async onShow(){ |
|||
let that = this; |
|||
if (!that.hasRequestedPermission) { |
|||
console.log('进入了判断setting权限',that.hasRequestedPermission) |
|||
await that.requestAndroidPermission('android.permission.CAMERA'); |
|||
} |
|||
// else{ |
|||
// console.log('setting权限状态已变更为true,进入扫码页',that.hasRequestedPermission) |
|||
// that.jumpToRights('/pages/scan/Scan'); |
|||
// } |
|||
}, |
|||
onHide() { |
|||
this.hasRequestedPermission = false; |
|||
console.log('onHide') |
|||
}, |
|||
onUnload(){ |
|||
console.log('onUnload') |
|||
}, |
|||
methods: { |
|||
|
|||
//打开设置权限界面 |
|||
setPermission(){ |
|||
permision.gotoAppPermissionSetting(); |
|||
}, |
|||
|
|||
//判断是否有相机权限 |
|||
async requestAndroidPermission(permisionID) { |
|||
let that = this; |
|||
var result = await permision.requestAndroidPermission(permisionID) |
|||
console.log('setting判断权限结果',result) |
|||
that.hasRequestedPermission = true; |
|||
if (result == 1) { |
|||
//有权限,跳转到扫码界面 |
|||
that.jumpToRights('/pages/scan/Scan'); |
|||
} |
|||
}, |
|||
|
|||
//跳转到授权设置页面 |
|||
jumpToRights(url){ |
|||
uni.switchTab({ |
|||
url: url |
|||
}) |
|||
} |
|||
|
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
.content { |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-content: center; |
|||
background-color: #1F222B; |
|||
height:100vh; |
|||
} |
|||
|
|||
.textBoard{ |
|||
margin-top: 1vh; |
|||
} |
|||
</style> |
|||
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 968 B |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 863 B |
@ -0,0 +1,186 @@ |
|||
export async function addSchedule(data) { |
|||
//#ifdef APP-PLUS
|
|||
const {platform} = uni.getSystemInfoSync() |
|||
if (platform == 'android') { |
|||
return androidSchedule(data) |
|||
} else if (platform == 'ios') { |
|||
return iosSchedule(data) |
|||
} |
|||
//#endif
|
|||
} |
|||
|
|||
async function androidSchedule (data) { |
|||
const calendarURL = 'content://com.android.calendar/calendars' |
|||
const calendarEventURL = 'content://com.android.calendar/events' |
|||
const calendarRemiderURL = 'content://com.android.calendar/reminders' |
|||
const CalendarContract = plus.android.import('android.provider.CalendarContract') |
|||
const account = await createAccountData() |
|||
const main = plus.android.runtimeMainActivity() |
|||
const timeZone = plus.android.invoke('java.util.TimeZone', 'getDefault') |
|||
const timeZoneId = plus.android.invoke(timeZone, 'getID') |
|||
await checkPermission() |
|||
let accountId = getAccount() |
|||
if (!accountId) { |
|||
accountId = addAccount() |
|||
} |
|||
if (!accountId) return |
|||
const calendarId = insertCalendar({ |
|||
calendar_id: accountId, |
|||
title: data.title, |
|||
description: data.description, |
|||
dtstart: data.dtstart, |
|||
dtend: data.dtend, |
|||
}) |
|||
if (!calendarId) return |
|||
insertReminder({event_id: calendarId}) |
|||
// insertAlarm(data.dtstart)
|
|||
|
|||
async function checkPermission() { |
|||
return new Promise((resolve) => { |
|||
plus.android.requestPermissions(['android.permission.READ_CALENDAR', 'android.permission.WRITE_CALENDAR'], ({deniedAlways, deniedPresent, granted}) => { |
|||
if (deniedAlways.length > 0) { //权限被永久拒绝
|
|||
// 弹出提示框解释为何需要权限,引导用户打开设置页面开启
|
|||
uni.showModal({ |
|||
title: '提示', |
|||
content: '请打开日历权限', |
|||
success: ({confirm}) => { |
|||
if (!confirm) return |
|||
const intent = plus.android.newObject("android.content.Intent") |
|||
const Settings = plus.android.newObject("android.provider.Settings") |
|||
const action = plus.android.getAttribute(Settings, 'ACTION_APPLICATION_DETAILS_SETTINGS') |
|||
plus.android.invoke(intent, 'setAction', action) |
|||
const uri = plus.android.invoke('android.net.Uri', 'fromParts', 'package', main.getPackageName(), null) |
|||
plus.android.invoke(intent, 'setData', uri) |
|||
main.startActivity(intent) |
|||
} |
|||
}) |
|||
} else if (deniedPresent.length > 0) { //权限被临时拒绝
|
|||
uni.showToast({title: '您拒绝了日历写入权限', icon: 'none'}) |
|||
} else if (granted.length > 0) { //权限被允许
|
|||
resolve() |
|||
} |
|||
}, err => { |
|||
uni.showToast({title: `申请权限错误:${err.code} ${err.message}`, icon: 'none'}) |
|||
}) |
|||
}) |
|||
} |
|||
function createAccountData() { |
|||
return new Promise((resolve) => { |
|||
plus.runtime.getProperty(plus.runtime.appid, ({appid, name}) => { |
|||
resolve({ |
|||
name, |
|||
account_name: appid, |
|||
account_type: CalendarContract.ACCOUNT_TYPE_LOCAL, |
|||
display_name: name, |
|||
}) |
|||
}) |
|||
}) |
|||
} |
|||
function getAccount() { |
|||
const uri = plus.android.invoke('android.net.Uri', 'parse', calendarURL) |
|||
const userCursor = plus.android.invoke(main.getContentResolver(), "query", uri, null, null, null, null) |
|||
while (plus.android.invoke(userCursor, 'moveToNext')) { |
|||
const _account_name = plus.android.invoke(userCursor, 'getString', plus.android.invoke(userCursor, 'getColumnIndex', 'account_name')) |
|||
const _account_type = plus.android.invoke(userCursor, 'getString', plus.android.invoke(userCursor, 'getColumnIndex', 'account_type')) |
|||
const _id = plus.android.invoke(userCursor, 'getString', plus.android.invoke(userCursor, 'getColumnIndex', '_id')) |
|||
if (_account_name == account.account_name && _account_type == account.account_type) { |
|||
return _id |
|||
} |
|||
} |
|||
} |
|||
function addAccount() { |
|||
const value = plus.android.newObject('android.content.ContentValues') |
|||
plus.android.invoke(value, 'put', 'name', account.name) |
|||
plus.android.invoke(value, 'put', 'account_name', account.account_name) |
|||
plus.android.invoke(value, 'put', 'account_type', account.account_type) |
|||
plus.android.invoke(value, 'put', 'calendar_displayName', account.display_name) |
|||
plus.android.invoke(value, 'put', 'visible', 1) |
|||
plus.android.invoke(value, 'put', 'sync_events', 1) |
|||
plus.android.invoke(value, 'put', 'calendar_timezone', timeZoneId) |
|||
plus.android.invoke(value, 'put', 'ownerAccount', account.account_name) |
|||
// plus.android.invoke(value, 'put', 'canOrganizerRespond', 0)
|
|||
// plus.android.invoke(value, 'put', 'calendar_color', -9206951)
|
|||
// plus.android.invoke(value, 'put', 'calendar_access_level', 700)
|
|||
const calendarUri = plus.android.invoke('android.net.Uri', 'parse', calendarURL) |
|||
const buildUpon = plus.android.invoke(calendarUri, "buildUpon") |
|||
plus.android.invoke(buildUpon, "appendQueryParameter", CalendarContract.CALLER_IS_SYNCADAPTER, "true") |
|||
plus.android.invoke(buildUpon, "appendQueryParameter", "account_name", account.account_name) |
|||
plus.android.invoke(buildUpon, "appendQueryParameter", "account_type", account.account_type) |
|||
const build = plus.android.invoke(buildUpon, "build") |
|||
const newAccoutList = plus.android.invoke(main.getContentResolver(), "insert", build, value) |
|||
const newAccout_id = plus.android.invoke(plus.android.invoke(newAccoutList, "getPathSegments"), "get", 1) |
|||
return newAccout_id |
|||
} |
|||
function insertCalendar({calendar_id, title, description, dtstart, dtend}) { |
|||
const value = plus.android.newObject('android.content.ContentValues') |
|||
const systemInfo = uni.getSystemInfoSync() |
|||
plus.android.invoke(value, 'put', 'calendar_id', (systemInfo.brand || '').toLowerCase() == 'xiaomi' ? 1 : calendar_id) |
|||
plus.android.invoke(value, 'put', 'title', title) |
|||
plus.android.invoke(value, 'put', 'description', description) |
|||
plus.android.invoke(value, 'put', 'dtstart', dtstart) |
|||
plus.android.invoke(value, 'put', 'dtend', dtend) |
|||
plus.android.invoke(value, 'put', 'eventTimezone', timeZoneId) |
|||
// plus.android.invoke(value, 'put', 'allDay', 1)
|
|||
// plus.android.invoke(value, 'put', 'rrule', 'FREQ=MONTHLY;BYMONTHDAY=24')
|
|||
//rrule参考 https://www.cnblogs.com/ice5/p/14023771.html
|
|||
plus.android.invoke(value, 'put', 'hasAlarm', 1) //是否闹钟提醒 默认提醒 因为大部分手机未实现此功能 故未实现
|
|||
const calendarEventUri = plus.android.invoke('android.net.Uri', 'parse', calendarEventURL) |
|||
const newEvent = plus.android.invoke(main.getContentResolver(), 'insert', calendarEventUri, value) |
|||
const id = plus.android.invoke(newEvent, 'getLastPathSegment') |
|||
return id |
|||
} |
|||
function insertReminder({event_id}) { |
|||
const value = plus.android.newObject('android.content.ContentValues') |
|||
plus.android.invoke(value, 'put', 'event_id', event_id) |
|||
plus.android.invoke(value, 'put', 'minutes', 5) |
|||
plus.android.invoke(value, 'put', 'method', 1) |
|||
const calendarRemiderUri = plus.android.invoke('android.net.Uri', 'parse', calendarRemiderURL) |
|||
const res = plus.android.invoke(main.getContentResolver(), 'insert', calendarRemiderUri, value) |
|||
return res |
|||
} |
|||
function insertAlarm(dtstart) { |
|||
const AlarmManager = plus.android.importClass("android.app.AlarmManager") |
|||
const Context = plus.android.importClass("android.content.Context") |
|||
const alarm = main.getSystemService(Context.ALARM_SERVICE) |
|||
const intent = plus.android.newObject("android.content.Intent") |
|||
const PendingIntent = plus.android.importClass("android.app.PendingIntent") |
|||
const pendingIntent = PendingIntent.getActivity(main, 0, intent, 0) |
|||
alarm.set(AlarmManager.RTC_WAKEUP, dtstart, pendingIntent) |
|||
} |
|||
} |
|||
function iosSchedule(data) { |
|||
return new Promise((resolve) => { |
|||
const eventStore = plus.ios.newObject('EKEventStore') |
|||
// const hasMethod = plus.ios.invoke(eventStore, 'respondsToSelector:', plus.ios.newObject('@selector', 'requestAccessToEntityType:completion:'))
|
|||
plus.ios.invoke(eventStore, 'requestAccessToEntityType:completion:', 0, () => { |
|||
const calendar = plus.ios.invoke(eventStore, 'defaultCalendarForNewEvents') |
|||
if (!calendar) { |
|||
// uni.showModal({
|
|||
// title: '提示',
|
|||
// content: '请打开日历权限',
|
|||
// success: ({confirm}) => {
|
|||
// if (!confirm) return
|
|||
// plus.runtime.openURL('app-settings://')
|
|||
// }
|
|||
// })
|
|||
return |
|||
} |
|||
const event = plus.ios.invoke('EKEvent', 'eventWithEventStore:', eventStore) |
|||
// const date = plus.ios.newObject('NSDate')
|
|||
event.plusSetAttribute('title', data.title) |
|||
// event.plusSetAttribute('location', 'location')
|
|||
event.plusSetAttribute('notes', data.description) |
|||
const startDate = plus.ios.invoke('NSDate', 'dateWithTimeIntervalSince1970:', data.dtstart /1000) |
|||
event.plusSetAttribute('startDate', startDate) |
|||
const endDate = plus.ios.invoke('NSDate', 'dateWithTimeIntervalSince1970:', data.dtend /1000) |
|||
event.plusSetAttribute('endDate', endDate) |
|||
const alarm = plus.ios.invoke('EKAlarm', 'alarmWithRelativeOffset:', -5) |
|||
plus.ios.invoke(event, 'addAlarm:', alarm) |
|||
plus.ios.invoke(event, 'setCalendar:', calendar) |
|||
const res = plus.ios.invoke(eventStore, 'saveEvent:span:error:', event, 0, null) |
|||
if (res) { |
|||
return resolve(res) |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
# vv-schedule |
|||
### 用法: |
|||
``` |
|||
import {addSchedule} from '@/uni_modules/vv-schedule' |
|||
|
|||
await addSchedule({ |
|||
title: 'vvv', |
|||
description: 'eee', |
|||
dtstart: new Date('2021/8/28 5:00').getTime(), |
|||
dtend: new Date('2021/8/28 6:00').getTime(), |
|||
}) |
|||
uni.showToast({title: '日程添加成功'}) |
|||
``` |
|||
Loading…
Reference in new issue