feat:封装权限弹出库,并替换头像上传的权限判断逻辑
This commit is contained in:
parent
40818eaf99
commit
12217db6d3
1
star_lock/.fvm/flutter_sdk
Symbolic link
1
star_lock/.fvm/flutter_sdk
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/Users/mac/fvm/versions/3.16.5
|
||||||
3
star_lock/.fvm/fvm_config.json
Normal file
3
star_lock/.fvm/fvm_config.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"flutterSdkVersion": "3.16.5"
|
||||||
|
}
|
||||||
1
star_lock/.fvm/release
Normal file
1
star_lock/.fvm/release
Normal file
@ -0,0 +1 @@
|
|||||||
|
3.16.5
|
||||||
1
star_lock/.fvm/version
Normal file
1
star_lock/.fvm/version
Normal file
@ -0,0 +1 @@
|
|||||||
|
3.16.5
|
||||||
1
star_lock/.fvm/versions/3.16.5
Symbolic link
1
star_lock/.fvm/versions/3.16.5
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/Users/mac/fvm/versions/3.16.5
|
||||||
@ -613,5 +613,23 @@
|
|||||||
"地图加载中,请稍候。。": "The map is loading, please wait...",
|
"地图加载中,请稍候。。": "The map is loading, please wait...",
|
||||||
"跳过": "Skip",
|
"跳过": "Skip",
|
||||||
"还未获取到位置信息哦,请耐心等待一下!": "The location information has not been obtained yet, please wait patiently!",
|
"还未获取到位置信息哦,请耐心等待一下!": "The location information has not been obtained yet, please wait patiently!",
|
||||||
"请填写信息": "Please fill in the information"
|
"请填写信息": "Please fill in the information",
|
||||||
|
|
||||||
|
|
||||||
|
"permission_dialog_camera": "camera",
|
||||||
|
"permission_dialog_photos": "photos",
|
||||||
|
"permission_dialog_storage": "storage",
|
||||||
|
"permission_dialog_location": "location",
|
||||||
|
"permission_dialog_camera_text": "Access to the camera is required to take photos and upload files, such as uploading a profile picture",
|
||||||
|
"permission_dialog_photos_text": "Access to camera is required to upload files and avatars using album images",
|
||||||
|
"permission_dialog_storage_text": "Access to read and write permissions is required to upload avatars using local images",
|
||||||
|
"permission_dialog_location_text": "Access to location information is required to use the add key function",
|
||||||
|
"permission_dialog_application": "application",
|
||||||
|
"permission_dialog_authority": "permission",
|
||||||
|
"permission_dialog_not_allowed": "Not Allowed",
|
||||||
|
"permission_dialog_allowed": "Allowed",
|
||||||
|
"permission_dialog_permission_denied": "Permission denied",
|
||||||
|
"permission_dialog_open_permissions": "Please manually enable it in the system settings",
|
||||||
|
"permission_dialog_permission_continue_text": "Permission to continue using the application.",
|
||||||
|
"permission_dialog_go_set_up": "Go set it up"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -614,5 +614,22 @@
|
|||||||
"地图加载中,请稍候。。": "地图加载中,请稍候。。",
|
"地图加载中,请稍候。。": "地图加载中,请稍候。。",
|
||||||
"跳过": "跳过",
|
"跳过": "跳过",
|
||||||
"还未获取到位置信息哦,请耐心等待一下!": "还未获取到位置信息哦,请耐心等待一下!",
|
"还未获取到位置信息哦,请耐心等待一下!": "还未获取到位置信息哦,请耐心等待一下!",
|
||||||
"请填写信息": "请填写信息"
|
"请填写信息": "请填写信息",
|
||||||
|
|
||||||
|
"permission_dialog_camera": "相机",
|
||||||
|
"permission_dialog_photos": "相册",
|
||||||
|
"permission_dialog_storage": "读写",
|
||||||
|
"permission_dialog_location": "定位",
|
||||||
|
"permission_dialog_camera_text": "需要访问相机权限才能拍照上传文件例如头像上传",
|
||||||
|
"permission_dialog_photos_text": "需要访问相机权限才能使用相册图片上传文件上传头像",
|
||||||
|
"permission_dialog_storage_text": "需要访问读写权限才能使用本地图片上传头像",
|
||||||
|
"permission_dialog_location_text": "需要访问定位权限才能使用添加钥匙功能的位置信息",
|
||||||
|
"permission_dialog_application": "申请",
|
||||||
|
"permission_dialog_authority": "权限",
|
||||||
|
"permission_dialog_not_allowed": "不允许",
|
||||||
|
"permission_dialog_allowed": "允许",
|
||||||
|
"permission_dialog_permission_denied": "权限被拒绝",
|
||||||
|
"permission_dialog_open_permissions": "请手动在系统设置中开启",
|
||||||
|
"permission_dialog_permission_continue_text": "权限以继续使用应用。",
|
||||||
|
"permission_dialog_go_set_up": "去设置"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -615,5 +615,22 @@
|
|||||||
"地图加载中,请稍候。。": "地图加载中,请稍候。。",
|
"地图加载中,请稍候。。": "地图加载中,请稍候。。",
|
||||||
"跳过": "跳过",
|
"跳过": "跳过",
|
||||||
"还未获取到位置信息哦,请耐心等待一下!": "还未获取到位置信息哦,请耐心等待一下!",
|
"还未获取到位置信息哦,请耐心等待一下!": "还未获取到位置信息哦,请耐心等待一下!",
|
||||||
"请填写信息": "请填写信息"
|
"请填写信息": "请填写信息",
|
||||||
|
|
||||||
|
"permission_dialog_camera": "相机",
|
||||||
|
"permission_dialog_photos": "相册",
|
||||||
|
"permission_dialog_storage": "读写",
|
||||||
|
"permission_dialog_location": "定位",
|
||||||
|
"permission_dialog_camera_text": "需要访问相机权限才能拍照上传文件例如头像上传",
|
||||||
|
"permission_dialog_photos_text": "需要访问相机权限才能使用相册图片上传文件上传头像",
|
||||||
|
"permission_dialog_storage_text": "需要访问读写权限才能使用本地图片上传头像",
|
||||||
|
"permission_dialog_location_text": "需要访问定位权限才能使用添加钥匙功能的位置信息",
|
||||||
|
"permission_dialog_application": "申请",
|
||||||
|
"permission_dialog_authority": "权限",
|
||||||
|
"permission_dialog_not_allowed": "不允许",
|
||||||
|
"permission_dialog_allowed": "允许",
|
||||||
|
"permission_dialog_permission_denied": "权限被拒绝",
|
||||||
|
"permission_dialog_open_permissions": "请手动在系统设置中开启",
|
||||||
|
"permission_dialog_permission_continue_text": "权限以继续使用应用。",
|
||||||
|
"permission_dialog_go_set_up": "去设置"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,8 +2,12 @@ import 'dart:async';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:image_picker/image_picker.dart';
|
||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
import 'package:star_lock/app_settings/app_settings.dart';
|
||||||
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart';
|
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart';
|
||||||
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_state.dart';
|
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_state.dart';
|
||||||
|
import 'package:star_lock/permission/permission_dialog.dart';
|
||||||
import '../../../../network/api_repository.dart';
|
import '../../../../network/api_repository.dart';
|
||||||
import '../../../../tools/baseGetXController.dart';
|
import '../../../../tools/baseGetXController.dart';
|
||||||
import '../../../tools/eventBusEventManage.dart';
|
import '../../../tools/eventBusEventManage.dart';
|
||||||
@ -30,20 +34,24 @@ class MinePersonInfoLogic extends GetConnect {
|
|||||||
size: size);
|
size: size);
|
||||||
if (entity.errorCode!.codeIsSuccessful) {
|
if (entity.errorCode!.codeIsSuccessful) {
|
||||||
uploadFile(entity);
|
uploadFile(entity);
|
||||||
// print("aaaaa:$loginEntity");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 上传头像
|
// 上传头像
|
||||||
void uploadFile(MinePersonGetUploadFileInfoEntity minePersonGetUploadFileInfoEntity) async {
|
void uploadFile(
|
||||||
Map<String, dynamic> user = minePersonGetUploadFileInfoEntity.data!.formData!;
|
MinePersonGetUploadFileInfoEntity
|
||||||
|
minePersonGetUploadFileInfoEntity) async {
|
||||||
|
Map<String, dynamic> user =
|
||||||
|
minePersonGetUploadFileInfoEntity.data!.formData!;
|
||||||
var bytes = File(state.image!.path);
|
var bytes = File(state.image!.path);
|
||||||
var enc = await bytes.readAsBytes();
|
var enc = await bytes.readAsBytes();
|
||||||
user[minePersonGetUploadFileInfoEntity.data!.fileField!] = enc;
|
user[minePersonGetUploadFileInfoEntity.data!.fileField!] = enc;
|
||||||
final form = FormData({
|
final form = FormData({
|
||||||
'file': MultipartFile(enc, filename: minePersonGetUploadFileInfoEntity.data!.formData!["key"]),
|
'file': MultipartFile(enc,
|
||||||
|
filename: minePersonGetUploadFileInfoEntity.data!.formData!["key"]),
|
||||||
});
|
});
|
||||||
var entity = await ApiRepository.to.uploadFile(url: minePersonGetUploadFileInfoEntity.data!.uploadUrl!, body: form);
|
var entity = await ApiRepository.to.uploadFile(
|
||||||
|
url: minePersonGetUploadFileInfoEntity.data!.uploadUrl!, body: form);
|
||||||
if (entity.errorCode! == -1) {
|
if (entity.errorCode! == -1) {
|
||||||
// 没有返回 返回null成功
|
// 没有返回 返回null成功
|
||||||
updateUserInfoRequest(minePersonGetUploadFileInfoEntity.data!.fileUrl!);
|
updateUserInfoRequest(minePersonGetUploadFileInfoEntity.data!.fileUrl!);
|
||||||
@ -52,12 +60,10 @@ class MinePersonInfoLogic extends GetConnect {
|
|||||||
|
|
||||||
//更新个人信息-头像
|
//更新个人信息-头像
|
||||||
Future<void> updateUserInfoRequest(String headUrl) async {
|
Future<void> updateUserInfoRequest(String headUrl) async {
|
||||||
var entity = await ApiRepository.to.updateUserHeadUrlInfo(
|
var entity = await ApiRepository.to.updateUserHeadUrlInfo(headUrl: headUrl);
|
||||||
headUrl: headUrl
|
|
||||||
);
|
|
||||||
if (entity.errorCode!.codeIsSuccessful) {
|
if (entity.errorCode!.codeIsSuccessful) {
|
||||||
state.headUrl.value = headUrl;
|
state.headUrl.value = headUrl;
|
||||||
state.mineInfoData.value.headUrl = state.headUrl.value!;
|
state.mineInfoData.value.headUrl = state.headUrl.value;
|
||||||
final loginData = await Storage.getLoginData();
|
final loginData = await Storage.getLoginData();
|
||||||
loginData!.headUrl = headUrl;
|
loginData!.headUrl = headUrl;
|
||||||
await Storage.saveLoginData(loginData);
|
await Storage.saveLoginData(loginData);
|
||||||
@ -66,11 +72,67 @@ class MinePersonInfoLogic extends GetConnect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//上传头像选择
|
||||||
|
Future<void> chooseCallback(int index) async {
|
||||||
|
if (index == 0) {
|
||||||
|
//拍照选项
|
||||||
|
_checkCameraPermission();
|
||||||
|
} else if (index == 1) {
|
||||||
|
_checkPhotoPermission();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///拍摄照片
|
||||||
|
Future<void> selectCamera() async {
|
||||||
|
XFile? photo = await state.imagePicker.pickImage(
|
||||||
|
source: ImageSource.camera, preferredCameraDevice: CameraDevice.rear);
|
||||||
|
if (photo != null) {
|
||||||
|
state.image = photo;
|
||||||
|
var bytes = File(state.image!.path);
|
||||||
|
var enc = await bytes.readAsBytes();
|
||||||
|
getUpTokenRequest(state.image!.name, enc.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///从相册选取
|
||||||
|
Future<void> selectImage() async {
|
||||||
|
XFile? image = await state.imagePicker.pickImage(
|
||||||
|
source: ImageSource.gallery,
|
||||||
|
maxHeight: 250,
|
||||||
|
maxWidth: 250,
|
||||||
|
);
|
||||||
|
if (image != null) {
|
||||||
|
state.image = image;
|
||||||
|
var bytes = File(state.image!.path);
|
||||||
|
var enc = await bytes.readAsBytes();
|
||||||
|
getUpTokenRequest(state.image!.name, enc.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//权限判断 访问相机
|
||||||
|
Future<void> _checkCameraPermission() async {
|
||||||
|
var status = await PermissionDialog.request(Permission.camera);
|
||||||
|
if (status) {
|
||||||
|
selectCamera();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//权限判断 访问相册
|
||||||
|
Future<void> _checkPhotoPermission() async {
|
||||||
|
bool isAndroid33 =
|
||||||
|
AppPlatform.isAndroid && AppPlatform.getSdkIntValue() >= 33;
|
||||||
|
var status = isAndroid33
|
||||||
|
? await PermissionDialog.request(Permission.photos)
|
||||||
|
: await PermissionDialog.request(Permission.storage);
|
||||||
|
if (status) {
|
||||||
|
selectImage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onReady() {
|
void onReady() {
|
||||||
// TODO: implement onReady
|
// TODO: implement onReady
|
||||||
super.onReady();
|
super.onReady();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@ -25,31 +25,15 @@ class MinePersonInfoPage extends StatefulWidget {
|
|||||||
State<MinePersonInfoPage> createState() => _MinePersonInfoPageState();
|
State<MinePersonInfoPage> createState() => _MinePersonInfoPageState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _MinePersonInfoPageState extends State<MinePersonInfoPage>
|
class _MinePersonInfoPageState extends State<MinePersonInfoPage> {
|
||||||
// with WidgetsBindingObserver
|
|
||||||
{
|
|
||||||
final logic = Get.put(MinePersonInfoLogic());
|
final logic = Get.put(MinePersonInfoLogic());
|
||||||
final state = Get.find<MinePersonInfoLogic>().state;
|
final state = Get.find<MinePersonInfoLogic>().state;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
initState() {
|
initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
// WidgetsBinding.instance.addObserver(this); // 添加观察者
|
|
||||||
// logic.getUserInfoRequest();
|
|
||||||
// _checkCameraPermission();
|
|
||||||
// _checkPhotoPermission();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// // 当应用生命周期状态变化时调用
|
|
||||||
// @override
|
|
||||||
// void didChangeAppLifecycleState(AppLifecycleState state) {
|
|
||||||
// super.didChangeAppLifecycleState(state);
|
|
||||||
// if (state == AppLifecycleState.resumed) {
|
|
||||||
// // 当应用从后台返回前台时检查相机权限
|
|
||||||
// checkCameraPermission();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
@ -71,32 +55,8 @@ class _MinePersonInfoPageState extends State<MinePersonInfoPage>
|
|||||||
borderRadius: BorderRadius.circular(36.w),
|
borderRadius: BorderRadius.circular(36.w),
|
||||||
child: CustomNetworkImage(url:state.headUrl.value, defaultUrl: 'images/controls_user.png', width:72.w, height:72.w),
|
child: CustomNetworkImage(url:state.headUrl.value, defaultUrl: 'images/controls_user.png', width:72.w, height:72.w),
|
||||||
),
|
),
|
||||||
// ClipOval(
|
|
||||||
// child: state.image != null
|
|
||||||
// ? Image.file(
|
|
||||||
// File(state.image!.path),
|
|
||||||
// width: 72.w,
|
|
||||||
// height: 72.w,
|
|
||||||
// fit: BoxFit.fill,
|
|
||||||
// )
|
|
||||||
// : Image.asset(
|
|
||||||
// 'images/controls_user.png',
|
|
||||||
// width: 72.w,
|
|
||||||
// height: 72.w,
|
|
||||||
// fit: BoxFit.fill,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
action: () async {
|
action: () async {
|
||||||
//安卓平台下首次进入应用需向用户告知获取权限用途弹窗
|
_openModalBottomSheet();
|
||||||
if (Platform.isAndroid) {
|
|
||||||
AppFirstEnterHandle().getAppFirstEnter(context, isAgreeCamera);
|
|
||||||
var getFlag = await Storage.getString(isAgreeCamera);
|
|
||||||
if (getFlag == isAgreeCamera) {
|
|
||||||
_openModalBottomSheet();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_openModalBottomSheet();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
)),
|
)),
|
||||||
Obx(() => CommonItem(
|
Obx(() => CommonItem(
|
||||||
@ -177,70 +137,9 @@ class _MinePersonInfoPageState extends State<MinePersonInfoPage>
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Future<void> requestCameraPermission() async {
|
|
||||||
// var status = await Permission.camera.status;
|
|
||||||
// if (status.isGranted) {
|
|
||||||
// selectCamera();
|
|
||||||
// } else {
|
|
||||||
// status = await Permission.camera.request();
|
|
||||||
// if (status.isGranted) {
|
|
||||||
// selectCamera();
|
|
||||||
// } else {
|
|
||||||
// showPermissionDeniedDialog();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
Future<void> _requestCameraPermission() async {
|
|
||||||
var status = await Permission.camera.request();
|
|
||||||
if (status.isGranted) {
|
|
||||||
setState(() {
|
|
||||||
state.hasCameraPermission.value = true; // 如果权限被授予,更新状态变量
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// 如果权限被拒绝,你可以选择在这里处理相应逻辑,比如显示一个提示框
|
|
||||||
showPermissionDeniedDialog();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _requestPhotoPermission() async {
|
|
||||||
//针对andriud33以下的设备兼容
|
|
||||||
bool isAndroid33 = AppPlatform.isAndroid && AppPlatform.getSdkIntValue() >= 33;
|
|
||||||
var status = isAndroid33 ? await Permission.photos.request() : await Permission.storage.request();
|
|
||||||
if (status.isGranted) {
|
|
||||||
setState(() {
|
|
||||||
state.hasPhotoPermission.value = true; // 如果权限被授予,更新状态变量
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// 如果权限被拒绝,你可以选择在这里处理相应逻辑,比如显示一个提示框
|
|
||||||
showPermissionDeniedDialog();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 请求相册权限
|
|
||||||
// PermissionStatus photosStatus = await Permission.photos.request();
|
|
||||||
//
|
|
||||||
// if (photosStatus.isGranted) {
|
|
||||||
// // 相册权限已被授予
|
|
||||||
// state.hasPhotoPermission.value = true;
|
|
||||||
// } else {
|
|
||||||
// // 如果权限被拒绝,你可以选择在这里处理相应逻辑,比如显示一个提示框
|
|
||||||
// showPermissionDeniedDialog();
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Future<void> requestPhotoPermission() async {
|
|
||||||
// var status = await Permission.photos.status;
|
|
||||||
// if (status.isGranted) {
|
|
||||||
// selectImage();
|
|
||||||
// } else {
|
|
||||||
// status = await Permission.photos.request();
|
|
||||||
// if (status.isGranted) {
|
|
||||||
// selectImage();
|
|
||||||
// } else {
|
|
||||||
// showPermissionDeniedDialog();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// 显示权限被永久拒绝的提示对话框
|
// 显示权限被永久拒绝的提示对话框
|
||||||
void showPermissionDeniedDialog() {
|
void showPermissionDeniedDialog() {
|
||||||
@ -272,67 +171,13 @@ class _MinePersonInfoPageState extends State<MinePersonInfoPage>
|
|||||||
return AlertBottomWidget(
|
return AlertBottomWidget(
|
||||||
topTitle: '',
|
topTitle: '',
|
||||||
items: const ['拍照', '从相册选择'],
|
items: const ['拍照', '从相册选择'],
|
||||||
chooseCallback: (value) {
|
chooseCallback: logic.chooseCallback,
|
||||||
int getSelectIndex = value;
|
|
||||||
if (getSelectIndex == 0) {
|
|
||||||
//拍照选项
|
|
||||||
// state.hasCameraPermission.value == true ? selectCamera() : _requestCameraPermission();
|
|
||||||
_checkCameraPermission();
|
|
||||||
} else if (getSelectIndex == 1) {
|
|
||||||
// state.hasPhotoPermission.value == true ? selectImage() : _requestPhotoPermission();
|
|
||||||
_checkPhotoPermission();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
///拍摄照片
|
|
||||||
selectCamera() async {
|
|
||||||
XFile? photo = await state.imagePicker.pickImage(source: ImageSource.camera, preferredCameraDevice: CameraDevice.rear);
|
|
||||||
if (photo != null) {
|
|
||||||
state.image = photo;
|
|
||||||
var bytes = File(state.image!.path);
|
|
||||||
var enc = await bytes.readAsBytes();
|
|
||||||
logic.getUpTokenRequest(state.image!.name, enc.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///从相册选取
|
|
||||||
selectImage() async {
|
|
||||||
XFile? image = await state.imagePicker.pickImage(
|
|
||||||
source: ImageSource.gallery,
|
|
||||||
maxHeight: 250,
|
|
||||||
maxWidth: 250,
|
|
||||||
);
|
|
||||||
if (image != null) {
|
|
||||||
state.image = image;
|
|
||||||
var bytes = File(state.image!.path);
|
|
||||||
var enc = await bytes.readAsBytes();
|
|
||||||
logic.getUpTokenRequest(state.image!.name, enc.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _checkCameraPermission() async {
|
|
||||||
var status = await Permission.camera.status;
|
|
||||||
if (status.isGranted) {
|
|
||||||
selectCamera();
|
|
||||||
} else {
|
|
||||||
_requestCameraPermission();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _checkPhotoPermission() async {
|
|
||||||
var status = await Permission.photos.status;
|
|
||||||
if (status.isGranted) {
|
|
||||||
selectImage();
|
|
||||||
} else {
|
|
||||||
// setState(() {
|
|
||||||
// state.hasPhotoPermission.value = false; // 如果权限未被授予,更新状态变量
|
|
||||||
// });
|
|
||||||
_requestPhotoPermission();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
|||||||
9
star_lock/lib/permission/README.md
Normal file
9
star_lock/lib/permission/README.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
## [permission_dialog.dart](permission_dialog.dart) 权限弹出的使用
|
||||||
|
```bash
|
||||||
|
//判断是否被拒绝,判断有权限后返回 true
|
||||||
|
var status = await PermissionDialog.request(Permission.camera);
|
||||||
|
if (status) {
|
||||||
|
selectCamera();
|
||||||
|
}
|
||||||
|
```
|
||||||
@ -1,21 +1,28 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
import 'package:star_lock/app_settings/app_settings.dart';
|
import 'package:star_lock/app_settings/app_settings.dart';
|
||||||
|
import 'package:star_lock/tools/storage.dart';
|
||||||
|
import 'package:star_lock/translations/trans_lib.dart';
|
||||||
|
|
||||||
class PermissionDialog {
|
class PermissionDialog {
|
||||||
static Map<Permission, String> titles = {
|
static Map<Permission, String> titles = {
|
||||||
Permission.camera: '相机',
|
Permission.camera: TranslationLoader.lanKeys!.permissionDialogCamera!.tr,
|
||||||
Permission.photos: '相册',
|
Permission.photos: TranslationLoader.lanKeys!.permissionDialogPhotos!.tr,
|
||||||
Permission.storage: '读写',
|
Permission.storage: TranslationLoader.lanKeys!.permissionDialogStorage!.tr,
|
||||||
Permission.location: '定位',
|
Permission.location:
|
||||||
|
TranslationLoader.lanKeys!.permissionDialogLocation!.tr,
|
||||||
};
|
};
|
||||||
|
|
||||||
static Map<Permission, String> contents = {
|
static Map<Permission, String> contents = {
|
||||||
Permission.camera: '需要访问相机权限才能拍照上传文件例如头像上传',
|
Permission.camera:
|
||||||
Permission.photos: '需要访问相机权限才能使用相册图片上传文件上传头像',
|
TranslationLoader.lanKeys!.permissionDialogCameraText!.tr,
|
||||||
Permission.storage: '需要访问读写权限才能使用本地图片上传头像',
|
Permission.photos: TranslationLoader.lanKeys!.permissionDialogPhotos!.tr,
|
||||||
Permission.location: '需要访问定位权限才能使用添加钥匙功能的位置信息',
|
Permission.storage:
|
||||||
|
TranslationLoader.lanKeys!.permissionDialogStorageText!.tr,
|
||||||
|
Permission.location:
|
||||||
|
TranslationLoader.lanKeys!.permissionDialogLocationText!.tr,
|
||||||
};
|
};
|
||||||
|
|
||||||
//显示权限判断申请框
|
//显示权限判断申请框
|
||||||
@ -24,37 +31,51 @@ class PermissionDialog {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool application = true;
|
bool application = true;
|
||||||
if (AppPlatform.isAndroid) {
|
PermissionStatus status = await permission.status;
|
||||||
application = await showDialog(
|
dynamic cache = await Storage.getString(titles[permission]);
|
||||||
|
if (AppPlatform.isAndroid && !status.isGranted && cache is! String) {
|
||||||
|
application = await showCupertinoDialog(
|
||||||
context: Get.context!,
|
context: Get.context!,
|
||||||
builder: (BuildContext context) {
|
builder: (context) {
|
||||||
return AlertDialog(
|
return PopScope(
|
||||||
title: Text('申请${titles[permission] ?? ''}权限'),
|
canPop: false,
|
||||||
content: Text(contents[permission] ?? ''),
|
child: CupertinoAlertDialog(
|
||||||
actions: <Widget>[
|
title: Text(
|
||||||
TextButton(
|
'${TranslationLoader.lanKeys!.permissionDialogApplication!.tr}${titles[permission] ?? ''}${TranslationLoader.lanKeys!.permissionDialogAuthority!.tr}'),
|
||||||
child: const Text('不允许'),
|
content: Text(contents[permission] ?? ''),
|
||||||
onPressed: () {
|
actions: [
|
||||||
Get.back(result: false);
|
CupertinoDialogAction(
|
||||||
},
|
child: Text(TranslationLoader
|
||||||
),
|
.lanKeys!.permissionDialogNotAllowed!.tr),
|
||||||
TextButton(
|
onPressed: () {
|
||||||
child: const Text('允许'),
|
Get.back(result: false);
|
||||||
onPressed: () {
|
},
|
||||||
Get.back(result: true);
|
),
|
||||||
},
|
CupertinoDialogAction(
|
||||||
),
|
child: Text(
|
||||||
],
|
TranslationLoader.lanKeys!.permissionDialogAllowed!.tr),
|
||||||
);
|
onPressed: () {
|
||||||
|
Get.back(result: true);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
if(application){
|
||||||
|
await Storage.setString(titles[permission], titles[permission]);
|
||||||
|
}
|
||||||
|
} else if (cache is String) {
|
||||||
|
if (status.isDenied) {
|
||||||
|
showSet(permission);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!application) {
|
if (application) {
|
||||||
showSet(permission);
|
PermissionStatus status = await permission.request();
|
||||||
return false;
|
return status.isGranted;
|
||||||
} else {
|
|
||||||
return await permission.request().isGranted;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//显示设置页面
|
//显示设置页面
|
||||||
@ -62,22 +83,27 @@ class PermissionDialog {
|
|||||||
if (Get.context == null) {
|
if (Get.context == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
showDialog(
|
showCupertinoDialog(
|
||||||
context: Get.context!,
|
context: Get.context!,
|
||||||
builder: (BuildContext context) {
|
builder: (context) {
|
||||||
return AlertDialog(
|
return PopScope(
|
||||||
title: Text('${titles[permission] ?? ''}权限被拒绝'),
|
canPop: false,
|
||||||
content: Text('${contents[permission] ?? ''},请手动在系统设置中开启${titles[permission]}权限以继续使用应用。'),
|
child: CupertinoAlertDialog(
|
||||||
actions: <Widget>[
|
title: Text(
|
||||||
TextButton(
|
'${titles[permission] ?? ''}${TranslationLoader.lanKeys!.permissionDialogPermissionDenied!.tr}'),
|
||||||
child: Text('去设置'),
|
content: Text(
|
||||||
onPressed: () {
|
'${contents[permission] ?? ''},${TranslationLoader.lanKeys!.permissionDialogOpenPermissions!.tr}${titles[permission]}${TranslationLoader.lanKeys!.permissionDialogCameraText!.tr}'),
|
||||||
Get.back(); // 关闭对话框
|
actions: [
|
||||||
openAppSettings(); // 打开系统设置页面
|
CupertinoDialogAction(
|
||||||
},
|
child: Text(
|
||||||
),
|
TranslationLoader.lanKeys!.permissionDialogGoSetUp!.tr),
|
||||||
],
|
onPressed: () {
|
||||||
);
|
Get.back(); // 关闭对话框
|
||||||
|
openAppSettings(); // 打开系统设置页面
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -946,6 +946,24 @@ class LanKeyEntity {
|
|||||||
judgmentMethodContent = json['judgmentMethodContent'];
|
judgmentMethodContent = json['judgmentMethodContent'];
|
||||||
stressPassword = json['stressPassword'];
|
stressPassword = json['stressPassword'];
|
||||||
stressCard = json['stressCard'];
|
stressCard = json['stressCard'];
|
||||||
|
|
||||||
|
permissionDialogCamera = json['permission_dialog_camera'];
|
||||||
|
permissionDialogPhotos = json['permission_dialog_photos'];
|
||||||
|
permissionDialogStorage = json['permission_dialog_storage'];
|
||||||
|
permissionDialogLocation = json['permission_dialog_location'];
|
||||||
|
permissionDialogCameraText = json['permission_dialog_camera_text'];
|
||||||
|
permissionDialogPhotosText = json['permission_dialog_photos_text'];
|
||||||
|
permissionDialogStorageText = json['permission_dialog_storage_text'];
|
||||||
|
permissionDialogLocationText = json['permission_dialog_location_text'];
|
||||||
|
permissionDialogApplication = json['permission_dialog_application'];
|
||||||
|
permissionDialogAuthority = json['permission_dialog_authority'];
|
||||||
|
permissionDialogNotAllowed = json['permission_dialog_not_allowed'];
|
||||||
|
permissionDialogAllowed = json['permission_dialog_allowed'];
|
||||||
|
permissionDialogPermissionDenied = json['permission_dialog_permission_denied'];
|
||||||
|
permissionDialogOpenPermissions = json['permission_dialog_open_permissions'];
|
||||||
|
permissionDialogPermissionContinueText = json['permission_dialog_permission_continue_text'];
|
||||||
|
permissionDialogGoSetUp = json['permission_dialog_go_set_up'];
|
||||||
|
|
||||||
}
|
}
|
||||||
String? starLock;
|
String? starLock;
|
||||||
String? clickUnlockAndHoldDownClose;
|
String? clickUnlockAndHoldDownClose;
|
||||||
@ -1424,6 +1442,23 @@ class LanKeyEntity {
|
|||||||
String? stressPassword;
|
String? stressPassword;
|
||||||
String? stressCard;
|
String? stressCard;
|
||||||
|
|
||||||
|
String? permissionDialogCamera;
|
||||||
|
String? permissionDialogPhotos;
|
||||||
|
String? permissionDialogStorage;
|
||||||
|
String? permissionDialogLocation;
|
||||||
|
String? permissionDialogCameraText;
|
||||||
|
String? permissionDialogPhotosText;
|
||||||
|
String? permissionDialogStorageText;
|
||||||
|
String? permissionDialogLocationText;
|
||||||
|
String? permissionDialogApplication;
|
||||||
|
String? permissionDialogAuthority;
|
||||||
|
String? permissionDialogNotAllowed;
|
||||||
|
String? permissionDialogAllowed;
|
||||||
|
String? permissionDialogPermissionDenied;
|
||||||
|
String? permissionDialogOpenPermissions;
|
||||||
|
String? permissionDialogPermissionContinueText;
|
||||||
|
String? permissionDialogGoSetUp;
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final map = <String, dynamic>{};
|
final map = <String, dynamic>{};
|
||||||
map['starLock'] = starLock;
|
map['starLock'] = starLock;
|
||||||
@ -1913,6 +1948,23 @@ class LanKeyEntity {
|
|||||||
map['stressPassword'] = stressPassword;
|
map['stressPassword'] = stressPassword;
|
||||||
map['stressCard'] = stressCard;
|
map['stressCard'] = stressCard;
|
||||||
|
|
||||||
|
map['permission_dialog_camera'] = permissionDialogCamera;
|
||||||
|
map['permission_dialog_photos'] = permissionDialogPhotos;
|
||||||
|
map['permission_dialog_storage'] = permissionDialogStorage;
|
||||||
|
map['permission_dialog_location'] = permissionDialogLocation;
|
||||||
|
map['permission_dialog_camera_text'] = permissionDialogCameraText;
|
||||||
|
map['permission_dialog_photos_text'] = permissionDialogPhotosText;
|
||||||
|
map['permission_dialog_storage_text'] = permissionDialogStorageText;
|
||||||
|
map['permission_dialog_location_text'] = permissionDialogLocationText;
|
||||||
|
map['permission_dialog_application'] = permissionDialogApplication;
|
||||||
|
map['permission_dialog_authority'] = permissionDialogAuthority;
|
||||||
|
map['permission_dialog_not_allowed'] = permissionDialogNotAllowed;
|
||||||
|
map['permission_dialog_allowed'] = permissionDialogAllowed;
|
||||||
|
map['permission_dialog_permission_denied'] = permissionDialogPermissionDenied;
|
||||||
|
map['permission_dialog_open_permissions'] = permissionDialogOpenPermissions;
|
||||||
|
map['permission_dialog_permission_continue_text'] = permissionDialogPermissionContinueText;
|
||||||
|
map['permission_dialog_go_set_up'] = permissionDialogGoSetUp;
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user