1,获取相机、相册、位置权限前弹窗
2,斯凯环境下屏蔽增值服务(用于上架) 3,修复:存在修改最近任务列表名称的行为,不符合华为应用市场审核标准。
This commit is contained in:
parent
e78c5a22d3
commit
a9b48d4b5e
@ -4,6 +4,7 @@ import 'package:flutter_localizations/flutter_localizations.dart';
|
|||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.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/flavors.dart';
|
||||||
import 'package:star_lock/tools/app_manager.dart';
|
import 'package:star_lock/tools/app_manager.dart';
|
||||||
import 'package:star_lock/tools/bindings/app_binding.dart';
|
import 'package:star_lock/tools/bindings/app_binding.dart';
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GetMaterialApp _initMaterialApp() => GetMaterialApp(
|
GetMaterialApp _initMaterialApp() => GetMaterialApp(
|
||||||
title: 'Star Lock',
|
title: F.navTitle,
|
||||||
navigatorObservers: [AppRouteObserver().routeObserver],
|
navigatorObservers: [AppRouteObserver().routeObserver],
|
||||||
translations: TranslationMessage(),
|
translations: TranslationMessage(),
|
||||||
supportedLocales: appDept.deptSupportedLocales,
|
supportedLocales: appDept.deptSupportedLocales,
|
||||||
|
|||||||
@ -5,6 +5,8 @@ import 'package:flutter_screenutil/flutter_screenutil.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/mine/addLock/addLock/addLock_logic.dart';
|
import 'package:star_lock/mine/addLock/addLock/addLock_logic.dart';
|
||||||
|
import 'package:star_lock/tools/appFirstEnterHandle.dart';
|
||||||
|
import 'package:star_lock/tools/storage.dart';
|
||||||
|
|
||||||
import '../../../appRouters.dart';
|
import '../../../appRouters.dart';
|
||||||
import '../../../app_settings/app_colors.dart';
|
import '../../../app_settings/app_colors.dart';
|
||||||
@ -79,19 +81,7 @@ class _AddLockPageState extends State<AddLockPage> with BaseWidget {
|
|||||||
btnName: TranslationLoader.lanKeys!.next!.tr,
|
btnName: TranslationLoader.lanKeys!.next!.tr,
|
||||||
borderRadius: 20.w,
|
borderRadius: 20.w,
|
||||||
onClick: () {
|
onClick: () {
|
||||||
if (Platform.isIOS) {
|
getNearByLimits();
|
||||||
Navigator.pushNamed(context, Routers.nearbyLockPage);
|
|
||||||
} else {
|
|
||||||
getMicrophonePermission().then((value) {
|
|
||||||
if (value) {
|
|
||||||
// 有权限
|
|
||||||
Navigator.pushNamed(context, Routers.nearbyLockPage);
|
|
||||||
} else {
|
|
||||||
//没有权限
|
|
||||||
openAppSettings(); //打开app系统设置
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -99,6 +89,19 @@ class _AddLockPageState extends State<AddLockPage> with BaseWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onShow() {}
|
||||||
|
|
||||||
|
void onHide() {}
|
||||||
|
|
||||||
|
//跳转到附近的锁页面先判断权限
|
||||||
|
void getNearByLimits() {
|
||||||
|
if (Platform.isIOS) {
|
||||||
|
Navigator.pushNamed(context, Routers.nearbyLockPage);
|
||||||
|
} else {
|
||||||
|
positionPermissionAlert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///请求权限
|
///请求权限
|
||||||
Future<bool> getMicrophonePermission() async {
|
Future<bool> getMicrophonePermission() async {
|
||||||
// You can request multiple permissions at once.
|
// You can request multiple permissions at once.
|
||||||
@ -117,7 +120,28 @@ class _AddLockPageState extends State<AddLockPage> with BaseWidget {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onShow() {}
|
Future<void> positionPermissionAlert() async {
|
||||||
|
//安卓平台下首次进入应用需向用户告知获取权限用途弹窗
|
||||||
|
if (Platform.isAndroid) {
|
||||||
|
AppFirstEnterHandle().getAppFirstEnter(context, isAgreePosition);
|
||||||
|
var getFlag = await Storage.getString(isAgreePosition);
|
||||||
|
if (getFlag == isAgreePosition) {
|
||||||
|
onPermissionPush();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onPermissionPush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void onHide() {}
|
void onPermissionPush() {
|
||||||
|
getMicrophonePermission().then((value) {
|
||||||
|
if (value) {
|
||||||
|
// 有权限
|
||||||
|
Navigator.pushNamed(context, Routers.nearbyLockPage);
|
||||||
|
} else {
|
||||||
|
//没有权限
|
||||||
|
openAppSettings(); //打开app系统设置
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.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/tools/appFirstEnterHandle.dart';
|
||||||
|
import 'package:star_lock/tools/storage.dart';
|
||||||
|
|
||||||
import '../../../appRouters.dart';
|
import '../../../appRouters.dart';
|
||||||
import '../../../app_settings/app_colors.dart';
|
import '../../../app_settings/app_colors.dart';
|
||||||
@ -188,15 +190,16 @@ class _SelectLockTypePageState extends State<SelectLockTypePage>
|
|||||||
if (Platform.isIOS) {
|
if (Platform.isIOS) {
|
||||||
Navigator.pushNamed(context, Routers.nearbyLockPage);
|
Navigator.pushNamed(context, Routers.nearbyLockPage);
|
||||||
} else {
|
} else {
|
||||||
getMicrophonePermission().then((value) {
|
positionPermissionAlert();
|
||||||
if (value) {
|
// getMicrophonePermission().then((value) {
|
||||||
// 有权限
|
// if (value) {
|
||||||
Navigator.pushNamed(context, Routers.nearbyLockPage);
|
// // 有权限
|
||||||
} else {
|
// Navigator.pushNamed(context, Routers.nearbyLockPage);
|
||||||
//没有权限
|
// } else {
|
||||||
openAppSettings(); //打开app系统设置
|
// //没有权限
|
||||||
}
|
// openAppSettings(); //打开app系统设置
|
||||||
});
|
// }
|
||||||
|
// });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,6 +221,31 @@ class _SelectLockTypePageState extends State<SelectLockTypePage>
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> positionPermissionAlert() async {
|
||||||
|
//安卓平台下首次进入应用需向用户告知获取权限用途弹窗
|
||||||
|
if (Platform.isAndroid) {
|
||||||
|
AppFirstEnterHandle().getAppFirstEnter(context, isAgreePosition);
|
||||||
|
var getFlag = await Storage.getString(isAgreePosition);
|
||||||
|
if (getFlag == isAgreePosition) {
|
||||||
|
onPermissionPush();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onPermissionPush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void onPermissionPush() {
|
||||||
|
getMicrophonePermission().then((value) {
|
||||||
|
if (value) {
|
||||||
|
// 有权限
|
||||||
|
Navigator.pushNamed(context, Routers.nearbyLockPage);
|
||||||
|
} else {
|
||||||
|
//没有权限
|
||||||
|
openAppSettings(); //打开app系统设置
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void onShow() {}
|
void onShow() {}
|
||||||
|
|
||||||
void onHide() {}
|
void onHide() {}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:star_lock/flavors.dart';
|
||||||
|
|
||||||
import '../../appRouters.dart';
|
import '../../appRouters.dart';
|
||||||
import '../../app_settings/app_colors.dart';
|
import '../../app_settings/app_colors.dart';
|
||||||
@ -144,11 +145,13 @@ class StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
|
|||||||
Get.back();
|
Get.back();
|
||||||
Get.toNamed(Routers.mineSetPage);
|
Get.toNamed(Routers.mineSetPage);
|
||||||
}),
|
}),
|
||||||
mineItem('images/mine/icon_mine_main_vip.png',
|
F.appFlavor == Flavor.sky
|
||||||
TranslationLoader.lanKeys!.valueAddedServices!.tr, () {
|
? Container()
|
||||||
Get.back();
|
: mineItem('images/mine/icon_mine_main_vip.png',
|
||||||
Get.toNamed(Routers.valueAddedServicesPage);
|
TranslationLoader.lanKeys!.valueAddedServices!.tr, () {
|
||||||
}),
|
Get.back();
|
||||||
|
Get.toNamed(Routers.valueAddedServicesPage);
|
||||||
|
}),
|
||||||
mineItem('images/mine/icon_mine_main_shoppingcart.png', "配件商城".tr,
|
mineItem('images/mine/icon_mine_main_shoppingcart.png', "配件商城".tr,
|
||||||
() {
|
() {
|
||||||
Get.back();
|
Get.back();
|
||||||
|
|||||||
@ -8,7 +8,9 @@ import 'package:image_picker/image_picker.dart';
|
|||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
import 'package:star_lock/app_settings/app_colors.dart';
|
import 'package:star_lock/app_settings/app_colors.dart';
|
||||||
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart';
|
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart';
|
||||||
|
import 'package:star_lock/tools/appFirstEnterHandle.dart';
|
||||||
import 'package:star_lock/tools/custom_bottom_sheet.dart';
|
import 'package:star_lock/tools/custom_bottom_sheet.dart';
|
||||||
|
import 'package:star_lock/tools/storage.dart';
|
||||||
import '../../../appRouters.dart';
|
import '../../../appRouters.dart';
|
||||||
import '../../../tools/commonItem.dart';
|
import '../../../tools/commonItem.dart';
|
||||||
import '../../../tools/titleAppBar.dart';
|
import '../../../tools/titleAppBar.dart';
|
||||||
@ -69,8 +71,18 @@ class _MinePersonInfoPageState extends State<MinePersonInfoPage> {
|
|||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
action: () {
|
action: () async {
|
||||||
requestCameraPermission();
|
//安卓平台下首次进入应用需向用户告知获取权限用途弹窗
|
||||||
|
if (Platform.isAndroid) {
|
||||||
|
AppFirstEnterHandle()
|
||||||
|
.getAppFirstEnter(context, isAgreeCamera);
|
||||||
|
var getFlag = await Storage.getString(isAgreeCamera);
|
||||||
|
if (getFlag == isAgreeCamera) {
|
||||||
|
requestCameraPermission();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
requestCameraPermission();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)),
|
)),
|
||||||
Obx(() => CommonItem(
|
Obx(() => CommonItem(
|
||||||
|
|||||||
@ -15,7 +15,7 @@ class StarLockApplication extends StatefulWidget {
|
|||||||
class _StarLockApplicationState extends State<StarLockApplication> {
|
class _StarLockApplicationState extends State<StarLockApplication> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
AppFirstEnterHandle().getAppFirstEnter(context);
|
AppFirstEnterHandle().getAppFirstEnter(context, isAgreePrivacy);
|
||||||
|
|
||||||
return FutureBuilder<bool>(
|
return FutureBuilder<bool>(
|
||||||
future: getLoginStatus(),
|
future: getLoginStatus(),
|
||||||
|
|||||||
22
star_lock/lib/talk/call/audioPlayerTask.dart
Normal file
22
star_lock/lib/talk/call/audioPlayerTask.dart
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// Audio player task implementation
|
||||||
|
import 'package:audio_service/audio_service.dart';
|
||||||
|
|
||||||
|
class AudioPlayerTask extends BackgroundAudioTask {
|
||||||
|
@override
|
||||||
|
Future<void> onStart(Map<String, dynamic>? params) async {
|
||||||
|
// Load and play audio here
|
||||||
|
// Example:
|
||||||
|
// AudioPlayer audioPlayer = AudioPlayer();
|
||||||
|
// await audioPlayer.play('path_to_audio.mp3');
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> onStop() async {
|
||||||
|
// Stop audio playback and clean up resources
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> onPause() async {
|
||||||
|
// Pause audio playback
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -9,10 +9,30 @@ import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
|
|||||||
import 'package:star_lock/tools/storage.dart';
|
import 'package:star_lock/tools/storage.dart';
|
||||||
|
|
||||||
class AppFirstEnterHandle {
|
class AppFirstEnterHandle {
|
||||||
Future getAppFirstEnter(BuildContext widgetContext) async {
|
Future getAppFirstEnter(BuildContext widgetContext, String flagStr) async {
|
||||||
var isFirstTime = await Storage.getString(isFirstEnter);
|
var getFlag = await Storage.getString(flagStr);
|
||||||
if (isFirstTime != isFirstEnter) {
|
switch (flagStr) {
|
||||||
showPrivacyAgreementAlert(widgetContext);
|
case isAgreePrivacy: // 隐私协议
|
||||||
|
{
|
||||||
|
if (getFlag != isAgreePrivacy)
|
||||||
|
showPrivacyAgreementAlert(widgetContext);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case isAgreePosition: // 位置权限
|
||||||
|
{
|
||||||
|
if (getFlag != isAgreePosition) showPositionAlert(widgetContext);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case isAgreeCamera: // 相机权限
|
||||||
|
{
|
||||||
|
if (getFlag != isAgreeCamera) showCameraAlert(widgetContext);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
print('没有匹配的flagStr');
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,7 +97,63 @@ class AppFirstEnterHandle {
|
|||||||
style: TextStyle(color: Colors.blue),
|
style: TextStyle(color: Colors.blue),
|
||||||
),
|
),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Storage.setString(isFirstEnter, isFirstEnter);
|
Storage.setString(isAgreePrivacy, isAgreePrivacy);
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//位置权限弹窗
|
||||||
|
void showPositionAlert(BuildContext widgetContext) {
|
||||||
|
showCupertinoDialog(
|
||||||
|
context: widgetContext,
|
||||||
|
builder: (context) {
|
||||||
|
return CupertinoAlertDialog(
|
||||||
|
title: const Text('位置权限'),
|
||||||
|
content: const Text('请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作'),
|
||||||
|
actions: [
|
||||||
|
CupertinoDialogAction(
|
||||||
|
child: const Text('取消'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
CupertinoDialogAction(
|
||||||
|
child: const Text('确定'),
|
||||||
|
onPressed: () {
|
||||||
|
Storage.setString(isAgreePosition, isAgreePosition);
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//相机权限弹窗
|
||||||
|
void showCameraAlert(BuildContext widgetContext) {
|
||||||
|
showCupertinoDialog(
|
||||||
|
context: widgetContext,
|
||||||
|
builder: (context) {
|
||||||
|
return CupertinoAlertDialog(
|
||||||
|
title: const Text('相机/相册权限'),
|
||||||
|
content: const Text('请开启本地存储权限,允许应用读写设备上的照片及文件'),
|
||||||
|
actions: [
|
||||||
|
CupertinoDialogAction(
|
||||||
|
child: const Text('取消'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
CupertinoDialogAction(
|
||||||
|
child: const Text('确定'),
|
||||||
|
onPressed: () {
|
||||||
|
Storage.setString(isAgreeCamera, isAgreeCamera);
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@ -15,7 +15,9 @@ const saveBlueToken = "BlueGetToken";
|
|||||||
const currentConnectionLockId = "CurrentConnectionLockId";
|
const currentConnectionLockId = "CurrentConnectionLockId";
|
||||||
const currentConnectionMacAddress = "CurrentConnectionMacAddress";
|
const currentConnectionMacAddress = "CurrentConnectionMacAddress";
|
||||||
const ifIsDemoModeOrNot = "IfIsDemoModeOrNot";
|
const ifIsDemoModeOrNot = "IfIsDemoModeOrNot";
|
||||||
const isFirstEnter = "isFirstEnter"; //是否首次进入应用
|
const isAgreePrivacy = "isAgreePrivacy"; //是否同意隐私协议弹窗
|
||||||
|
const isAgreePosition = "isAgreePosition"; //是否同意获取位置弹窗
|
||||||
|
const isAgreeCamera = "isAgreeCamera"; //是否同意获取相机/相册弹窗
|
||||||
|
|
||||||
const saveUserLoginData = "userLoginData";
|
const saveUserLoginData = "userLoginData";
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user