1,获取相机、相册、位置权限前弹窗

2,斯凯环境下屏蔽增值服务(用于上架)
3,修复:存在修改最近任务列表名称的行为,不符合华为应用市场审核标准。
This commit is contained in:
Daisy 2024-03-12 16:35:40 +08:00
parent e78c5a22d3
commit a9b48d4b5e
9 changed files with 207 additions and 39 deletions

View File

@ -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,

View File

@ -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系统设置
}
});
}
} }

View File

@ -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() {}

View File

@ -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();

View File

@ -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(

View File

@ -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(),

View 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
}
}

View File

@ -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();
}, },
), ),

View File

@ -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";