關(guān)于 uniapp 權(quán)限申請和跳轉(zhuǎn)系統(tǒng)頁面
- 測試環(huán)境
- 查詢權(quán)限
- 跳轉(zhuǎn)到應(yīng)用詳情
- 跳轉(zhuǎn)到系統(tǒng)設(shè)置
- 參考
測試環(huán)境
- Android 測試環(huán)境1:雷電模擬器 HUAWEI LIO-AN00 系統(tǒng)版本 9
- Android 測試環(huán)境2:1+ace2 系統(tǒng)版本 13
查詢權(quán)限
uni.authorize 獲取權(quán)限只支持微信小程序不支持app,只能用 Native.js 來實(shí)現(xiàn)
-
android 查詢權(quán)限
- 安卓
太多不想寫
- uniapp
plus.android.requestPermissions(permissions, successCb, errorCB)
- permissions: 需要查詢的權(quán)限數(shù)組 ps 此文中只封裝了一次查詢一個(gè)權(quán)限,需要的自己改
- successCb:成功回調(diào) 有三個(gè)參數(shù)
- granted - Array[String]字符串?dāng)?shù)組,已獲取權(quán)限列表
- deniedPresent - Array[String]字符串?dāng)?shù)據(jù),已拒絕(臨時(shí))的權(quán)限列表
- deniedAlways - Array[String]字符串?dāng)?shù)據(jù),永久拒絕的權(quán)限列表
- errorCB: 失敗回調(diào)
// permissionID:傳入對應(yīng)的權(quán)限常量 // 1: 授權(quán) -1:永久拒絕 0:暫時(shí)拒絕 requestAndroidPermission(permissionID) { return new Promise((resolve, reject)=>{ plus.android.requestPermissions( [permissionID], (res)=>{ const { granted, deniedPresent, deniedAlways } = res; if(granted.length) resolve(1); if(deniedPresent.length) resolve(0); if(deniedAlways.length) resolve(-1); }, (err)=>{ resolve({...err})} ) }) }
- 安卓
-
android 只驗(yàn)證權(quán)限
-
安卓
網(wǎng)上講驗(yàn)證的 api 是 android.support.v4.content.ContextCompat 下面的 checkSelfPermission 方法,但是我導(dǎo)入后,使用時(shí)報(bào)錯(cuò)提示沒有這個(gè)方法。查找文檔之后發(fā)現(xiàn)在 android.core.app.ActivityCompat 下存在 checkSelfPermission 方法但是導(dǎo)入后使用,依舊報(bào)錯(cuò)。仔細(xì)看包之后發(fā)現(xiàn) content,ActivityCompat 有些方法好像被 Native.js 整合進(jìn)入 plus.android.runtimeMainActivity() 里面了,這樣的話等下我想下我以前是不是導(dǎo)入了很多不需要導(dǎo)入的包emmm
-
uniapp
plus.android.runtimeMainActivity().checkSelfPermission('權(quán)限')
返回: 0: 無授權(quán) 1: 以授權(quán)// 驗(yàn)證是否存在定位權(quán)限 const main = plus.android.runtimeMainActivity(); main.checkSelfPermission('android.permission.ACCESS_FINE_LOCATION')
-
-
ios 查詢權(quán)限
看最后的代碼,很煩要導(dǎo)入不同的包
跳轉(zhuǎn)到應(yīng)用詳情
-
android 跳轉(zhuǎn)
setData : 傳入的是uri,用于數(shù)據(jù)的過濾。setData可以被系統(tǒng)用來尋找匹配目標(biāo)組件。
putExtra: 只是用來設(shè)定各種不同類型的附加數(shù)據(jù)。不被系統(tǒng)用來尋找匹配目標(biāo)組件。直接跳轉(zhuǎn)應(yīng)用詳情里的權(quán)限頁需要適配不同品牌的手機(jī) (用雷電模擬器試了華為的發(fā)現(xiàn)沒用)
- 安卓
Intent intent = new Intent(); intent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + this.getPackageName())); startActivity(intent);
- uniapp
// 跳轉(zhuǎn)到應(yīng)用詳情 const main = plus.android.runtimeMainActivity(); const Intent = plus.android.newObject("android.content.Intent"); // const Settings = plus.android.importClass("android.provider.Settings"); const pkName = main.getPackageName(); const uri = plus.android.invoke("android.net.Uri", 'fromParts', 'package', pkName, null); // plus.android.invoke(Intent, 'setAction', Settings.ACTION_APPLICATION_DETAILS_SETTINGS); // 直接用 android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTING 不行 我也不知道為啥 plus.android.invoke(Intent, 'setAction', 'android.settings.APPLICATION_DETAILS_SETTINGS'); plus.android.invoke(Intent, 'setData', uri); plus.android.invoke(main, 'startActivity', Intent); // 跳轉(zhuǎn)到應(yīng)用詳情對應(yīng)權(quán)限設(shè)置 // 華為 (不生效) const main = plus.android.runtimeMainActivity(); const Intent = plus.android.importClass('android.content.Intent'); let _intent = new Intent(); _intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); const pkName = main.getPackageName(); _intent.putExtra("packageName", pkName); const ComponentName = plus.android.importClass('android.content.ComponentName'); const _comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"); _intent.setComponent(_comp); main.startActivity(_intent);
- 安卓
-
IOS 跳轉(zhuǎn)
// 跳轉(zhuǎn)應(yīng)用詳情 const app = plus.ios.invoke('UIApplication', 'sharedApplication'); const setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:'); plus.ios.invoke(app, 'openURL:', setting); plus.ios.deleteObject(setting); plus.ios.deleteObject(app);
跳轉(zhuǎn)到系統(tǒng)設(shè)置
-
android 跳轉(zhuǎn)系統(tǒng)設(shè)置頁面
const main = plus.android.runtimeMainActivity(), Settings = plus.android.importClass("android.provider.Settings"); const Intent = plus.android.newObject('android.content.Intent', Settings.ACTION_SETTINGS); main.startActivity(Intent);
-
android 跳轉(zhuǎn)具體服務(wù)設(shè)置頁面
// 跳轉(zhuǎn)到 打開系統(tǒng)定位服務(wù)頁面 const main = plus.android.runtimeMainActivity(), Intent = plus.android.importClass('android.content.Intent'); const Settings = plus.android.importClass('android.provider.Settings'); // let _intent = new Intent('android.settings.LOCATION_SOURCE_SETTINGS'); // 也可不需要Settings 直接這么寫 let _intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); main.startActivity(_intent); // 打開系統(tǒng)設(shè)置GPS服務(wù)頁面
-
IOS 跳轉(zhuǎn)系統(tǒng)設(shè)置頁面
看跳轉(zhuǎn)應(yīng)用
// 權(quán)限js
// #ifdef APP
// 判斷推送權(quán)限是否開啟
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) {
} else {
result = true;
}
plus.ios.deleteObject(settings);
} else {
enabledTypes = app.enabledRemoteNotificationTypes();
if (enabledTypes == 0) {
} else {
result = true;
}
}
plus.ios.deleteObject(app);
plus.ios.deleteObject(UIApplication);
return result;
}
// 判斷定位權(quán)限是否開啟
function judgeIosPermissionLocation() {
var result = false;
var cllocationManger = plus.ios.import("CLLocationManager");
var status = cllocationManger.authorizationStatus();
if (status == 0 || status == 3) {
result = true;
} else {
if (status == 2) {
// gotoAppSetting('我們需要訪問您的位置,方便更加迅速的給您解決問題')
}
}
plus.ios.deleteObject(cllocationManger);
return result;
}
// 判斷麥克風(fēng)權(quán)限是否開啟
function judgeIosPermissionRecord() {
var result = false;
var avaudiosession = plus.ios.import("AVAudioSession");
var avaudio = avaudiosession.sharedInstance();
var permissionStatus = avaudio.recordPermission();
if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
} else {
result = true;
}
plus.ios.deleteObject(avaudiosession);
return result;
}
// 判斷相機(jī)權(quán)限是否開啟
function judgeIosPermissionCamera() {
var result = false;
var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
if (authStatus == 0 || authStatus == 3) {
result = true
} else {
if (authStatus == 2) {
// gotoAppSetting('請先允許使用相機(jī)權(quán)限')
}
}
plus.ios.deleteObject(AVCaptureDevice);
return result;
}
// 判斷相冊權(quán)限是否開啟
function judgeIosPermissionPhotoLibrary() {
var result = false;
var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
var authStatus = PHPhotoLibrary.authorizationStatus();
if (authStatus == 0 || authStatus == 3) {
result = true;
} else {
if (authStatus == 2) {
// gotoAppSetting('請先允許訪問相冊權(quán)限')
}
}
plus.ios.deleteObject(PHPhotoLibrary);
return result;
}
// 判斷通訊錄權(quán)限是否開啟
function judgeIosPermissionContact() {
var result = false;
var CNContactStore = plus.ios.import("CNContactStore");
var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
if (cnAuthStatus == 0 || cnAuthStatus == 3) {
result = true;
} else {
}
plus.ios.deleteObject(CNContactStore);
return result;
}
// 判斷日歷權(quán)限是否開啟
function judgeIosPermissionCalendar() {
var result = false;
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
if (ekAuthStatus == 0 || ekAuthStatus == 3) {
result = true;
} else {
}
plus.ios.deleteObject(EKEventStore);
return result;
}
// 判斷備忘錄權(quán)限是否開啟
function judgeIosPermissionMemo() {
var result = false;
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
if (ekAuthStatus == 0 || ekAuthStatus == 3) {
result = true;
} else {
}
plus.ios.deleteObject(EKEventStore);
return result;
}
class Permission {
#_permissonList: {
'contact': { // 通訊錄
'android': 'android.permission.WRITE_CONTACTS',
'ios': 'CNContactStore'
},
'calendar': { // 日歷-寫
'android': 'android.permission.WRITE_CALENDAR',
'ios': 'CNContactStore'
},
'location': { // 定位
'android': 'android.permission.ACCESS_FINE_LOCATION',
'ios': 'CLLocationManager'
},
'sms': { // 發(fā)-信息
'android': 'android.permission.SEND_SMS',
'ios': ''
},
'storage': { // 外部存儲和相冊-寫
'android': 'android.permission.WRITE_EXTERNAL_STORAGE',
'ios': 'PHPhotoLibrary'
},
'camera': { // 攝像頭
'android': 'android.permission.CAMERA',
'ios': 'AVCaptureDevice'
},
'record': { // 麥克風(fēng)
'android': 'android.permission.RECORD_AUDIO',
'ios': 'AVAudioSession'
},
},
#_androidAppActionList: { // 跳轉(zhuǎn)應(yīng)用的
'push': 'android.settings.APP_NOTIFICATION_SETTINGS', // app的通知權(quán)限開關(guān)頁面
},
#_systemActionList: { // 跳轉(zhuǎn)系統(tǒng)設(shè)置頁面
'location': { // gps開關(guān)頁面
'android': 'android.settings.LOCATION_SOURCE_SETTINGS',
'ios': ''
}
},
constructor () {
// 判斷手機(jī)系統(tǒng)和系統(tǒng)版本
let os = plus.os.name; // 系統(tǒng)名稱
this.isIos = os == 'iOS'; // 是否是ios系統(tǒng)
if(this.isIos) {
this.version = plus.os.version; // 版本
} else {
const Build = plus.android.importClass("android.os.Build");
this.version = Build?.VERSION?.SDK_INT ?? 0;
}
}
/**
* @method requestAndroidPermission
* @param {String} permissionID 安卓的權(quán)限
* @description android 動(dòng)態(tài)申請權(quán)限
* @return {Number | Object} -1: 拒絕權(quán)限(永久) 0: 拒絕權(quán)限(臨時(shí))1:授權(quán) || { code:'錯(cuò)誤碼', message:"錯(cuò)誤描述" }
*/
requestAndroidPermission (permissionID) {
return new Promise((resolve, reject)=>{
// TODO 需要添加驗(yàn)證權(quán)限的函數(shù)
// FIXME ContextCompat.checkSelfPermission() 可以驗(yàn)證是否存某權(quán)限
plus.android.requestPermissions(
[permissionID],
(res)=>{
const { granted, deniedPresent, deniedAlways } = res;
if(granted.length) resolve(1); // 以獲取到權(quán)限
if(deniedPresent.length) resolve(0); // 已拒絕權(quán)限(臨時(shí))
if(deniedAlways.length) resolve(-1); // 已拒絕權(quán)限(永久)
},
(err)=>{
// message: 錯(cuò)誤信息描述 code : 錯(cuò)誤編碼
resolve({...err});
}
)
})
}
/**
* @method verifyNotification
* @return {Boolean} true: 存在權(quán)限 false: 無權(quán)限
* @description 獲取**app**推送授權(quán)狀態(tài)
*/
verifyNotification() {
if (this.isIos) {
let types = 0;
const app = plus.ios.invoke('UIApplication', 'sharedApplication');
const settings = plus.ios.invoke(app, 'currentUserNotificationSettings');
if(settings) {
types = settings.plusGetAttribute('types');
} else {
types = plus.ios.invoke(app, 'enabledRemoteNotificationTypes');
}
plus.ios.deleteObject(settings);
plus.ios.deleteObject(app);
return types != 0;
} else {
const main = plus.android.runtimeMainActivity();
let NotificationManagerCompat = plus.android.importClass("android.support.v4.app.NotificationManagerCompat");
if (NotificationManagerCompat == null) {
NotificationManagerCompat = plus.android.importClass("androidx.core.app.NotificationManagerCompat");
}
const areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled();
return areNotificationsEnabled;
}
},
/**
* @method verifyPermission
* @param {String} name 權(quán)限名稱
* @description 驗(yàn)證是否存在授權(quán)
* @return {boolean} false: 拒絕 true:授權(quán)
*/
verifyPermission (name='') {
if(this.isIos) {
// 需要單獨(dú)處理 去調(diào)用上面方法
} else {
const main = plus.android.runtimeMainActivity();
const state = main.checkSelfPermission(this.#_permissonList[name]['android']);
return state == 1;
}
}
/**
* @method jumpAppDataPage
* @description 跳轉(zhuǎn)到**應(yīng)用**的信息頁面
*/
jumpAppInfoPage () {
if (this.isIos) {
const app = plus.ios.invoke('UIApplication', 'sharedApplication');
const setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
plus.ios.invoke(app, 'openURL:', setting);
plus.ios.deleteObject(setting);
plus.ios.deleteObject(app);
} else {
const main = plus.android.runtimeMainActivity();
const Intent = plus.android.newObject("android.content.Intent");
// const Settings = plus.android.importClass("android.provider.Settings");
const uri = plus.android.invoke("android.net.Uri", 'fromParts', 'package', main.getPackageName(), null);
// plus.android.invoke(Intent, 'setAction', Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
plus.android.invoke(Intent, 'setAction', `android.settings.APPLICATION_DETAILS_SETTINGS`);
plus.android.invoke(Intent, 'setData', uri);
plus.android.invoke(main, 'startActivity', Intent);
}
}
/**
* @method JumpAppPermissionPage
* @description 跳轉(zhuǎn)到**應(yīng)用**的授權(quán)開關(guān)頁面 (ps: 這里也可以用來到設(shè)置頁面啥的畢竟核心代碼一樣,但是懶得改了 )
*/
JumpAppPermissionPage (action='push') {
if(this.isIos) {
this.jumpAppInfoPage();
} else {
const main = plus.android.runtimeMainActivity();
const pkName = main.getPackageName();
const uid = main.getApplicationInfo().plusGetAttribute("uid");
const Intent = plus.android.newObject('android.content.Intent', this.#_androidActionList[action]);
if(this.version >= 26) { // 8.0
Intent.putExtra('android.provider.extra.APP_PACKAGE', pkName);
Intent.putExtra('android.provider.extra.CHANNEL_ID', uid);
main.startActivity(Intent);
} else if(this.version >= 21) { // 5.0-7.1
Intent.putExtra("app_package", pkName);
Intent.putExtra("app_uid", uid);
main.startActivity(Intent);
} else {
this.jumpAppInfoPage();
}
}
},
/**
* @method verifySystemLocationServe
* @description 驗(yàn)證**系統(tǒng)**定位服務(wù)是否開啟
*/
verifySystemLocationServe () {
if (this.isIos) {
// TODO 需要更具不同服務(wù)進(jìn)行封裝
// 驗(yàn)證定位服務(wù)是否開啟的
var result = false;
var cllocationManger = plus.ios.import("CLLocationManager");
var result = cllocationManger.locationServicesEnabled();
plus.ios.deleteObject(cllocationManger);
return result;
} else {
const main = plus.android.runtimeMainActivity(),
context = plus.android.importClass("android.content.Context"),
locationManager = plus.android.importClass("android.location.LocationManager");
const mainSvr = main.getSystemService(context.LOCATION_SERVICE);
return mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)
}
},
/**
* @method jumpSystemAppointPage
* @description 跳轉(zhuǎn)到指定的**系統(tǒng)**設(shè)置頁面 (使用之前先確定 頁面是可以直接跳轉(zhuǎn)的)
*/
jumpSystemAppointPage (action="location") {
if (this.isIos) {
} else {
const main = plus.android.runtimeMainActivity();
const Intent = plus.android.newObject('android.content.Intent', this.#_systemActionList[action]['android']);
main.startActivity(Intent); // 打開系統(tǒng)設(shè)置GPS服務(wù)頁面
}
}
/**
* @method jumpSystemPage
* @description 跳轉(zhuǎn)到系統(tǒng)設(shè)置頁面
*/
jumpSystemPage () {
if (this.isIos) {
this.jumpAppInfoPage();
} else {
const main = plus.android.runtimeMainActivity();
// const Settings = plus.android.importClass("android.provider.Settings");
// const Intent = plus.android.newObject('android.content.Intent', Settings.ACTION_SETTINGS);
const Intent = plus.android.newObject('android.content.Intent',`android.settings.SETTINGS`);
main.startActivity(Intent);
}
}
}
// #endif
參考
-
Android跳轉(zhuǎn)系統(tǒng)界面_大全集
-
Android之APP跳轉(zhuǎn)到權(quán)限設(shè)置界面適配華為、小米、vivo等
-
Android跳轉(zhuǎn)具體應(yīng)用權(quán)限管理,三種方式
-
iOS調(diào)用系統(tǒng)功能與跳轉(zhuǎn)到系統(tǒng)設(shè)置
-
iOS 從應(yīng)用中跳轉(zhuǎn)至系統(tǒng)設(shè)置頁面里的多種設(shè)置頁面
-
UIApplication方法和OpenUrl的基本用法
-
5+ App開發(fā)Native.js入門指南
-
IOS10 打開系統(tǒng)設(shè)置
-
iOS開發(fā)中的各種權(quán)限獲取和檢查
-
android如何從應(yīng)用程序進(jìn)入設(shè)置的各個(gè)頁面
-
Android系統(tǒng)設(shè)置— android.provider.Settings
-
Android中action啟動(dòng)方法大全文章來源:http://www.zghlxwxcb.cn/news/detail-640516.html
-
Native.js示例匯總文章來源地址http://www.zghlxwxcb.cn/news/detail-640516.html
到了這里,關(guān)于uniapp_05_權(quán)限檢測和跳轉(zhuǎn)到設(shè)置的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!