Marking.Client.Moblie/marking_app/lib/utils/app_upgrade/UpgradePermission.dart

171 lines
6.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Descripttion: 获取本地权限
* @version: UpgradePermission
* @Author: wy
* @Date: 2020-07-30 15:41:39
* @LastEditors: wangyang 1147192855@qq.com
* @LastEditTime: 2022-08-01 14:08:57
*/
import 'package:app_installer/app_installer.dart';
import 'package:flutter/material.dart';
import 'package:marking_app/utils/index.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:url_launcher/url_launcher.dart';
import 'model/UpdateAppEvent.dart';
class UpgradePermission {
final String _flatform;
const UpgradePermission(this._flatform);
/// 检查是否有权限,用于安卓
/// noExecutions 执行次数
Future<bool> checkPermission(BuildContext context, UpdateAppEvent updateAppEvent, [int? noExecutions]) async {
noExecutions ??= 1;
if (_flatform != 'android') return true; // 非安卓
var status = await Permission.storage.request();
if (status.isGranted) return true;
if (status.isDenied) {
// 普通拒绝 可以再进行提示
if (noExecutions == 3) {
// 拒绝并不再提示 或者某些机型不会提示
await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("提示"),
content: const Text("若“拒绝并不再提示”或“没有弹出权限询问对话框”,再次点击同意按钮出现其他更新方式。"),
actions: [
MaterialButton(
color: Theme.of(context).primaryColor,
child: const Text("确定", style: TextStyle(color: Colors.white)),
onPressed: () => Navigator.of(context).pop(),
)
],
);
},
);
}
await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("权限提示"),
content: const Text("无法获取存储权限,请同意获取设备存储权限"),
actions: [
MaterialButton(
color: Theme.of(context).primaryColor,
child: const Text("同意", style: TextStyle(color: Colors.white)),
onPressed: () => Navigator.of(context).pop(),
),
],
);
},
);
// if (isPad()) {
// // 平板无法发起权限询问 直接进入APP权限设置页面
// await openAppSettings();
// return false;
// }
if (noExecutions <= 2) return checkPermission(context, updateAppEvent, ++noExecutions);
// 执行次数大于3次就不再询问直接打开设置权限页面防止某些机型不会弹起权限询问交互弹框
}
// 拒绝并不再提示
bool? res = await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("权限提示"),
content: const Text("储存权限被永久拒绝,并且不再提示。请前往设置页面同意储存权限"),
actions: [
MaterialButton(
color: Colors.green.shade900,
child: const Text("其它方式更新", style: TextStyle(color: Colors.white)),
onPressed: () => Navigator.of(context).pop(false),
),
MaterialButton(
color: Theme.of(context).primaryColor,
child: const Text("前往设置", style: TextStyle(color: Colors.white)),
onPressed: () => Navigator.of(context).pop(true),
),
],
);
},
);
if (res == null || !res) {
// 其他方式下载
// await SystemNavigator.pop(); // 退出APP
var options = ['应用市场更新APP', '浏览器下载并安装APP'];
var uri = Uri.parse('market://details?id=com.example.marking_app'); // 应用市场URI
// if (!await canLaunchUrl(uri)) options.removeAt(0); // 如果不能打开应用市场 就屏蔽掉 这个安装方式
String? option = await showCustomModalBottomSheet(context, options);
if (option == '应用市场更新APP') {
if (await canLaunchUrl(uri))
await launchUrl(uri);
else
await AppInstaller.goStore('com.example.marking_app', 'iOSAppId');
}
if (option == '浏览器下载并安装APP') await launchUrl(Uri.parse(updateAppEvent.link));
} else
await openAppSettings();
return false;
}
// 其他方式下载选择
static Future<String?> showCustomModalBottomSheet(context, List<String> options) async {
return showModalBottomSheet<String>(
backgroundColor: Colors.transparent,
isScrollControlled: true,
context: context,
builder: (BuildContext context) {
return Container(
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: const Radius.circular(20.0),
topRight: const Radius.circular(20.0),
),
),
height: MediaQuery.of(context).size.height / 4.0,
child: Column(children: [
SizedBox(
height: 50,
child: Stack(
textDirection: TextDirection.rtl,
children: [
Center(child: Text('选择其它方式更新APP', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16.0))),
IconButton(icon: Icon(Icons.close), onPressed: () => Navigator.of(context).pop()),
],
),
),
Divider(height: 1.0),
Expanded(
child: ListView.builder(
itemCount: options.length,
itemBuilder: (BuildContext context, int index) {
var name = options[index];
return ListTile(
title: Text(name),
trailing: Icon(name.contains('浏览器') ? Icons.browser_updated_outlined : Icons.local_grocery_store_outlined),
onTap: () => Navigator.of(context).pop(name),
);
},
),
),
]),
);
},
);
}
}