123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- import 'package:flutter/material.dart';
- import 'package:permission_handler/permission_handler.dart';
- import 'package:photo_manager/photo_manager.dart';
- import 'package:shared/utils/device_utils.dart';
- import 'package:shared/utils/log_utils.dart';
- import 'package:widgets/dialog/app_default_dialog.dart';
- import 'package:widgets/dialog/permission_desc_dialog.dart';
- import '../dialog/dialog_engine.dart';
- /*
- * 动态权限的申请与校验
- */
- class PermissionEngine {
- // 私有构造函数
- PermissionEngine._privateConstructor();
- // 单例实例
- static final PermissionEngine _instance = PermissionEngine._privateConstructor();
- // 获取单例实例的访问点
- factory PermissionEngine() {
- return _instance;
- }
- /// 申请多媒体相册权限
- void requestPhotosPermission(void Function() success) async {
- //相册的选项
- if (DeviceUtils.isIOS) {
- //申请授权
- final value = await PhotoManager.requestPermissionExtend();
- if (value.hasAccess) {
- //已授权
- Log.d("相册已授权");
- success();
- } else if (value == PermissionState.limited) {
- Log.d("相册访问受限,去设置受限");
- PhotoManager.presentLimited();
- } else {
- Log.d("相册无授权,去设置");
- DialogEngine.show(
- widget: AppDefaultDialog(
- title: "提示",
- message: '无相册权限,前往设置',
- confirmAction: () {
- PhotoManager.openSetting();
- },
- ),
- );
- }
- } else {
- //Android是否有SD卡权限
- var status = await Permission.storage.status;
- late PermissionState ps;
- if (status.isGranted) {
- // 已经授权
- success();
- } else {
- // 未授权,则准备发起一次申请
- var permissionRequestFuture = PhotoManager.requestPermissionExtend();
- // 延迟500毫秒的Future
- var delayFuture = Future.delayed(Duration(milliseconds: 500), () => 'delay');
- // 使用Future.any等待上述两个Future中的任何一个完成
- var firstCompleted = await Future.any([permissionRequestFuture, delayFuture]);
- // 判断响应结果
- if (firstCompleted == 'delay') {
- Log.d("判断响应结果:1");
- // 如果是延迟Future完成了,表示500毫秒内没有获得权限响应,显示对话框
- _showPermissionDialog("“YYBusiness”想访问你的多媒体相册 用于图片上传,图片保存等功能,请允许我获取您的权限");
- // 再次等待权限请求结果
- ps = await permissionRequestFuture;
- DialogEngine.dismiss(tag: "permission");
- } else {
- Log.d("判断响应结果:2");
- // 权限请求已完成,立刻取消对话框展示(如果已经展示的话)
- DialogEngine.dismiss(tag: "permission");
- ps = firstCompleted as PermissionState;
- }
- if (ps.isAuth) {
- // 用户授权
- success();
- } else {
- // 权限被拒绝
- await DialogEngine.show(
- widget: AppDefaultDialog(
- message: "请到您的手机设置打开相册的权限",
- title: "提醒",
- confirmAction: () {
- openAppSettings();
- }),
- );
- }
- }
- }
- }
- /// 申请相机权限
- void requestCameraPermission(void Function() success) async {
- // 获取当前的权限
- var status = await Permission.camera.status;
- if (status.isGranted) {
- // 已经授权
- success();
- } else {
- // 未授权,则准备发起一次申请
- var permissionRequestFuture = Permission.camera.request();
- // 延迟500毫秒的Future
- var delayFuture = Future.delayed(Duration(milliseconds: 500), () => 'delay');
- // 使用Future.any等待上述两个Future中的任何一个完成
- var firstCompleted = await Future.any([permissionRequestFuture, delayFuture]);
- // 判断响应结果
- if (firstCompleted == 'delay') {
- // 如果是延迟Future完成了,表示500毫秒内没有获得权限响应,显示对话框
- _showPermissionDialog("“YYBusiness”申请调用您的相机权限 用于使用拍摄头像,图片上传保存等功能,请允许我获取您的权限");
- // 再次等待权限请求结果
- status = await permissionRequestFuture;
- DialogEngine.dismiss(tag: "permission");
- } else {
- // 权限请求已完成,立刻取消对话框展示(如果已经展示的话)
- DialogEngine.dismiss(tag: "permission");
- status = firstCompleted as PermissionStatus;
- }
- if (status.isGranted) {
- // 用户授权
- success();
- } else {
- // 权限被拒绝
- await DialogEngine.show(
- widget: AppDefaultDialog(
- message: "请到您的手机设置打开相机的权限",
- title: "提醒",
- confirmAction: () {
- openAppSettings();
- }),
- );
- }
- }
- }
- /// 校验并申请定位权限
- Future<bool> requestLocationPermission() async {
- // 获取当前的权限
- var status = await Permission.location.status;
- if (status.isGranted) {
- // 已经授权
- return true;
- } else {
- // 未授权,则准备发起一次申请
- var permissionRequestFuture = Permission.location.request();
- // 延迟500毫秒的Future
- var delayFuture = Future.delayed(Duration(milliseconds: 500), () => 'delay');
- // 使用Future.any等待上述两个Future中的任何一个完成
- var firstCompleted = await Future.any([permissionRequestFuture, delayFuture]);
- // 判断响应结果
- if (firstCompleted == 'delay') {
- // 如果是延迟Future完成了,表示500毫秒内没有获得权限响应,显示对话框
- _showPermissionDialog("“YYBusiness”想访问您的定位权限获取您的位置来推荐附近的工作");
- // 再次等待权限请求结果
- status = await permissionRequestFuture;
- DialogEngine.dismiss(tag: "permission");
- } else {
- Log.d("权限请求已完成,立刻取消对话框展示");
- // 权限请求已完成,立刻取消对话框展示(如果已经展示的话)
- DialogEngine.dismiss(tag: "permission");
- status = firstCompleted as PermissionStatus;
- }
- if (status.isGranted) {
- // 用户授权
- return true;
- } else {
- // 权限被拒绝
- await DialogEngine.show(
- widget: AppDefaultDialog(
- message: "请到您的手机设置打开定位的权限",
- title: "提醒",
- confirmAction: () {
- openAppSettings();
- }),
- );
- return false;
- }
- }
- }
- //顶部展示权限声明详情弹窗
- void _showPermissionDialog(String desc) {
- DialogEngine.show(
- clickMaskDismiss: false,
- backDismiss: true,
- tag: "permission",
- maskColor: Colors.transparent,
- widget: PermissionDescDialog(desc),
- );
- }
- }
|