uniapp_05_权限检测和跳转到设置

这篇具有很好参考价值的文章主要介绍了uniapp_05_权限检测和跳转到设置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于 uniapp 权限申请和跳转系统页面

  • 测试环境
  • 查询权限
  • 跳转到应用详情
  • 跳转到系统设置
  • 参考

测试环境

  • Android 测试环境1:雷电模拟器 HUAWEI LIO-AN00 系统版本 9
  • Android 测试环境2:1+ace2 系统版本 13

查询权限

uni.authorize 获取权限只支持微信小程序不支持app,只能用 Native.js 来实现

  1. android 查询权限

    • 安卓

      太多不想写

    • uniapp

      plus.android.requestPermissions(permissions, successCb, errorCB)

      • permissions: 需要查询的权限数组 ps 此文中只封装了一次查询一个权限,需要的自己改
      • successCb:成功回调 有三个参数
        • granted - Array[String]字符串数组,已获取权限列表
        • deniedPresent - Array[String]字符串数据,已拒绝(临时)的权限列表
        • deniedAlways - Array[String]字符串数据,永久拒绝的权限列表
      • errorCB: 失败回调
        // permissionID:传入对应的权限常量
        // 1: 授权 -1:永久拒绝 0:暂时拒绝
        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})}
                )
            })
        }
    
  2. android 只验证权限

    • 安卓

      网上讲验证的 api 是 android.support.v4.content.ContextCompat 下面的 checkSelfPermission 方法,但是我导入后,使用时报错提示没有这个方法。查找文档之后发现在 android.core.app.ActivityCompat 下存在 checkSelfPermission 方法但是导入后使用,依旧报错。仔细看包之后发现 content,ActivityCompat 有些方法好像被 Native.js 整合进入 plus.android.runtimeMainActivity() 里面了,这样的话等下我想下我以前是不是导入了很多不需要导入的包emmm

    • uniapp

      plus.android.runtimeMainActivity().checkSelfPermission('权限')
      返回: 0: 无授权 1: 以授权

          // 验证是否存在定位权限
          const main = plus.android.runtimeMainActivity();
          main.checkSelfPermission('android.permission.ACCESS_FINE_LOCATION')
      
  3. ios 查询权限

    看最后的代码,很烦要导入不同的包

跳转到应用详情

  1. android 跳转

    setData : 传入的是uri,用于数据的过滤。setData可以被系统用来寻找匹配目标组件。
    putExtra: 只是用来设定各种不同类型的附加数据。不被系统用来寻找匹配目标组件。
    直接跳转应用详情里的权限页需要适配不同品牌的手机 (用雷电模拟器试了华为的发现没用)

    • 安卓
          Intent intent = new Intent();
          intent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
          intent.setData(Uri.parse("package:" + this.getPackageName()));
          startActivity(intent);
      
    • uniapp
          // 跳转到应用详情
          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);
      
      
          // 跳转到应用详情对应权限设置
          // 华为 (不生效)
          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);
      
  2. IOS 跳转

        // 跳转应用详情
        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); 
    

跳转到系统设置

  1. android 跳转系统设置页面

        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);
    
  2. android 跳转具体服务设置页面

        // 跳转到 打开系统定位服务页面
        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); // 打开系统设置GPS服务页面
    
  3. IOS 跳转系统设置页面

    看跳转应用

// 权限js
// #ifdef APP

// 判断推送权限是否开启
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;
}

// 判断定位权限是否开启
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;
}

// 判断麦克风权限是否开启
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;
}

// 判断相机权限是否开启
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('请先允许使用相机权限')
		}
	}
	plus.ios.deleteObject(AVCaptureDevice);
	return result;
}

// 判断相册权限是否开启
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('请先允许访问相册权限')
		}
	}
	plus.ios.deleteObject(PHPhotoLibrary);
	return result;
}

// 判断通讯录权限是否开启
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;
}

// 判断日历权限是否开启
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;
}

// 判断备忘录权限是否开启
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': { // 发-信息
            'android': 'android.permission.SEND_SMS',
            'ios': ''
        },
        'storage': { // 外部存储和相册-写
            'android': 'android.permission.WRITE_EXTERNAL_STORAGE',
            'ios': 'PHPhotoLibrary'
        },
        'camera': { // 摄像头
            'android': 'android.permission.CAMERA',
            'ios': 'AVCaptureDevice'
        },
        'record': { // 麦克风
            'android': 'android.permission.RECORD_AUDIO',
            'ios': 'AVAudioSession'
        },
    },
    #_androidAppActionList: { // 跳转应用的
        'push': 'android.settings.APP_NOTIFICATION_SETTINGS', // app的通知权限开关页面
        
    },
    #_systemActionList: { // 跳转系统设置页面
        'location': { // gps开关页面
            'android': 'android.settings.LOCATION_SOURCE_SETTINGS',
            'ios': ''
        }
    },
    
    constructor () {
        // 判断手机系统和系统版本
        let os = plus.os.name; // 系统名称
        this.isIos = os == 'iOS'; // 是否是ios系统
        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 安卓的权限
     * @description android 动态申请权限
     * @return {Number | Object} -1: 拒绝权限(永久) 0: 拒绝权限(临时)1:授权 || { code:'错误码', message:"错误描述" }
     */
    requestAndroidPermission (permissionID) {
        return new Promise((resolve, reject)=>{
            // TODO 需要添加验证权限的函数 
            // FIXME ContextCompat.checkSelfPermission() 可以验证是否存某权限
            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)=>{
                	// message: 错误信息描述 code   : 错误编码
                	resolve({...err});
                }
            )
        })
    }
    
    /**
     * @method verifyNotification
     * @return {Boolean} true: 存在权限 false: 无权限
     * @description 获取**app**推送授权状态
     */
    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 权限名称
     * @description 验证是否存在授权
     * @return {boolean} false: 拒绝 true:授权
     */
    verifyPermission (name='') {
        if(this.isIos) {
            // 需要单独处理 去调用上面方法
        } else {
            const main = plus.android.runtimeMainActivity();
            const state = main.checkSelfPermission(this.#_permissonList[name]['android']);
            return state == 1;
        }
    }
    
    /**
     * @method jumpAppDataPage
     * @description 跳转到**应用**的信息页面
     */
    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 跳转到**应用**的授权开关页面 (ps: 这里也可以用来到设置页面啥的毕竟核心代码一样,但是懒得改了 )
     */
    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 验证**系统**定位服务是否开启
     */
    verifySystemLocationServe () {
        if (this.isIos)  {
            // TODO 需要更具不同服务进行封装
            
            // 验证定位服务是否开启的
            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 跳转到指定的**系统**设置页面 (使用之前先确定 页面是可以直接跳转的)
     */
    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); // 打开系统设置GPS服务页面
        }
    }
    
    /**
     * @method jumpSystemPage
     * @description 跳转到系统设置页面
     */
    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

参考

  1. Android跳转系统界面_大全集

  2. Android之APP跳转到权限设置界面适配华为、小米、vivo等

  3. Android跳转具体应用权限管理,三种方式

  4. iOS调用系统功能与跳转到系统设置

  5. iOS 从应用中跳转至系统设置页面里的多种设置页面

  6. UIApplication方法和OpenUrl的基本用法

  7. 5+ App开发Native.js入门指南

  8. IOS10 打开系统设置

  9. iOS开发中的各种权限获取和检查

  10. android如何从应用程序进入设置的各个页面

  11. Android系统设置— android.provider.Settings

  12. Android中action启动方法大全

  13. Native.js示例汇总文章来源地址https://www.toymoban.com/news/detail-640516.html

到了这里,关于uniapp_05_权限检测和跳转到设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp 小程序 跳转到外部链接

    场景 :点击“积分列表”中的“积分兑换”,需要跳转到三方的“积分商城”链接进行兑换,兑换完成后,跳回小程序“积分列表”。 结论 :无法离开小程序,跳转到其他地址。只能通过web-view内嵌的形式,将三方链接内嵌进小程序。 参数传递方式 :拼接到src上 ,web-vie

    2024年02月11日
    浏览(79)
  • uniapp小程序跳转到外部页面

    方案1 使用uni-app的扩展组件 uni-link ,使用参考文档uni-app官网 该组件的行为是在app内打开外部浏览器,在h5打开新网页。 方案2: 通过先跳转到web-view页面,通过web-view这个标签进行动态绑定接收来的有效可访问网址,即可实现跳转功能 在pages中新建一个webview页面 如下。 然后

    2024年02月11日
    浏览(53)
  • uniapp中点击跳转到tabBar的页面

    今天在工作中用到需要从pages页面点击按钮跳转到底部栏的tabBar页面中的情况 最初代码是这样写的,路径正确,微信开发者工具也没有报错,但就是页面不跳转  后来经过阅读uniapp的官方文档,找到了从普通页面点击跳转至tabBar页面的方法:switchTab 话不多说,直接上代码,调

    2024年02月13日
    浏览(52)
  • uniapp微信小程序跳转到另外一个小程序

    uni.navigateToMiniProgram 功能:打开另一个小程序。 App平台打开微信小程序,使用plus.share的launchMiniProgram。注意uni-app不需要plus ready,将plus ready里的代码写到页面的onLoad生命周期即可。使用此功能需在manifest中配置微信分享SDK信息,打包后生效。 各小程序平台对跳转到其他小程序

    2024年02月12日
    浏览(50)
  • uniapp 小程序如何从主包页面跳转到分包页面

    在uniapp开发小程序的时候,“分包”概念一定要提前了解下,具体我就不多说了,自己看下关网的相关配置。 那么,如果从主包页面,跳转至分包的页面呢?如图所示 我的页面-详情页  在我的页面创建好自己的链接,我使用的是方法创建的 注: 1、一定要注意跳转的路径,

    2024年02月16日
    浏览(56)
  • uniapp实现点击A页面按钮,跳转到B页面的指定位置

    uniapp实现点击A页面按钮,跳转到B页面的指定位置 第一种方式: 必须必须要注意! scroll-into-view 即使是测试也不可写死(组件布局完成后,动态的改变这个scroll-into-view的值,才会跳到索引位置) scroll-y=“true” 固定高度 A页面 B.页面 第二种方式: 在A页面的按钮点击事件中,

    2024年01月20日
    浏览(107)
  • uniapp微信公众号跳转到小程序(是点击微信页面上面的按钮/菜单跳转)

    先看效果 先贴代码: 1、先下载依赖 2、main.js 3、使用的页面引入(或者main引入) 4、初始化、注册 5、html 接下来才是重点: 要在公众号后台配置JS接口安全域名、网页授权域名、IP白名单,而且域名需要备案,在微信开发者工具中不能通过ip调试,可以修改本地hosts代理一下

    2024年02月09日
    浏览(116)
  • 如何Uniapp中嵌入H5,并且在H5中跳转到APP的指定页面

    有一个需求是,在app中嵌入一个H5页面,H5是一个网络页面,不在app项目里,APP可以打开H5页面,实现单点登录,并且在H5 页面中打开APP指定的页面 在uniapp中,有一个web-view组件,这就相当于一个浏览器组件,可以用来承载网页的容器,会自动铺满整个页面 web-view的详细文档参

    2024年02月04日
    浏览(70)
  • 若依:如何去掉首页,设置登录后跳转到第一个路由菜单

    若依系统是一个很好用的,开源的前端后台管理系统。 最近公司有一个需求,需要把默认的首页隐藏,登录后直接跳转到路由菜单返回的第一个页面。 查找了不少资料,但是都没有实际的解决方案。  不过最好自己还是实现了这个功能。 步骤如下: 1、首先应当找到项目里

    2023年04月09日
    浏览(223)
  • android webview 打开腾讯文档不跳转到申请权限界面显示ERR_UNKNOWN_URL_SCHEME

    webview 只识别https和http开头的地址 webview调用setWebViewClient方法,重写shouldOverrideUrlLoading方法,返回return super.shouldOverrideUrlLoading(view, url);就可以跳转到申请权限界面了,要登录QQ去申请权限的时候报错,因为这里会返回一个带intent://的地址,只能跳转到外部。要设置 以下是具体

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包