文档管理中心
FAQ应用服务开发屏幕时长守护服务(Screen Time Guard Kit)如何设置不同时间策略实现屏幕时间守护

如何设置不同时间策略实现屏幕时间守护

问题现象

如何通过Screen Time Guard Kit实现限制每天只能使用1个小时的手机?

背景知识

守护策略管理:当用户希望创建新的屏幕时间守护规则时,可以调用添加管控策略的接口。根据参数中传入的策略,用户可以添加各种策略,如设置各个应用的停用起止时间。一旦策略被创建并启用,系统将根据规则对用户的屏幕使用行为进行监管。

ACL权限申请:使用Screen Time Guard Kit(屏幕时间守护服务)需要申请"ohos.permission.MANAGE_SCREEN_TIME_GUARD"ACL权限,具体参考官网受限ACL权限申请

解决方案

准备工作:完成配置签名受限ACL权限申请。可使用自动签名完成ACL权限调试配置,具体参考自动签名支持的ACL权限

  • 步骤一:

    Screen Time Guard Kit支持对用户设备的时间管理和应用限制,因此在功能启用前,必须获得用户的明确授权。具体流程参考请求用户授权

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. const status = await guardService.getUserAuthStatus();
    3. hilog.info(0x0000, `ScreenTimeGuard:getUserAuthStatus`, `user auth status: ${status}`);
    4. if (status != guardService.AuthStatus.AUTH_GRANTED) {
    5. await guardService.requestUserAuth(this.getUIContext().getHostContext() as common.UIAbilityContext);
    6. }
    7. } catch (err) {
    8. const message = (err as BusinessError).message;
    9. const code = (err as BusinessError).code;
    10. hilog.error(0x0000, `ScreenTimeGuard:requestUserAuth`,
    11. `requestUserAuth failed with error code: ${code}, message: ${message}`);
    12. }
  • 步骤二:

    TimeStrategyType时长策略类型有以下3种类型,按照不同的场景配置策略类型,具体配置如下:

    • START_END_TIME_TYPE:管控策略可以设置为起止时间策略,表示策略在一天内配置的起始时间和结束时间内生效。常用于周期性管控,使用场景举例:每天22点到第二天7点,禁止使用XX应用。
      说明

      如果为此类型,则TimeStrategy接口中的startTime、endTime必填,totalDuration非必填。

      收起
      自动换行
      深色代码主题
      复制
      1. // 添加起始时间策略
      2. try {
      3. // 先调用startAppPicker获取相应应用的token
      4. const tokens = await appPicker.startAppPicker(this.getUIContext().getHostContext(), { appTokens: [] });
      5. const startEndTime: guardService.TimeStrategy = {
      6. type: guardService.TimeStrategyType.START_END_TIME_TYPE,
      7. startTime: '08:00',
      8. endTime: '19:00',
      9. };
      10. const info: guardService.AppInfo = {
      11. appTokens: tokens
      12. };
      13. const strategy: guardService.GuardStrategy = {
      14. name: 'startEndTimeStrategy',
      15. timeStrategy: startEndTime,
      16. appInfo: info,
      17. appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
      18. };
      19. await guardService.addGuardStrategy(strategy);
      20. this.currentStrategy = 'startEndTimeStrategy';
      21. } catch (err) {
      22. const message = (err as BusinessError).message;
      23. const code = (err as BusinessError).code;
      24. hilog.error(0x0000, `ScreenTimeGuard:addGuardStrategy`,
      25. `addGuardStrategy failed with error code: ${code}, message: ${message}`);
      26. }
    • TOTAL_DURATION_TYPE:总时长策略类型,表示一天内策略生效的总时长,从调用startGuardStrategy接口成功后开始计时。使用场景举例:启动策略后1小时内,禁止使用XX应用。
      说明

      如果为此类型,则TimeStrategy接口中的startTime、endTime非必填,totalDuration必填。

      收起
      自动换行
      深色代码主题
      复制
      1. // 添加总时长策略
      2. try {
      3. // 先调用startAppPicker获取相应应用的token
      4. const tokens = await appPicker.startAppPicker(this.getUIContext().getHostContext(), { appTokens: [] });
      5. const totalDurationTime: guardService.TimeStrategy = {
      6. type: guardService.TimeStrategyType.TOTAL_DURATION_TYPE,
      7. totalDuration: 3,
      8. };
      9. const info: guardService.AppInfo = {
      10. appTokens: tokens
      11. };
      12. const strategy: guardService.GuardStrategy = {
      13. name: 'totalDurationTimeStrategy',
      14. timeStrategy: totalDurationTime,
      15. appInfo: info,
      16. appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
      17. };
      18. await guardService.addGuardStrategy(strategy);
      19. this.currentStrategy = 'totalDurationTimeStrategy';
      20. } catch (err) {
      21. const message = (err as BusinessError).message;
      22. const code = (err as BusinessError).code;
      23. hilog.error(0x0000, `ScreenTimeGuard:addGuardStrategy`,
      24. `addGuardStrategy failed with error code: ${code}, message: ${message}`);
      25. }
    • INCLUSIVE_DURATION_TYPE:共享时长策略类型,表示策略关联的所有应用共享同一可用时长配额,超额后所有应用均受时长限制,从调用startGuardStrategy接口成功后开始计时。使用场景举例:每天限制使用指定视频类应用(A应用、B应用)时长2小时。
      说明

      如果为此类型,则TimeStrategy接口中的startTime、endTime非必填,totalDuration必填,RestrictionType只支持TRUSTLIST_TYPE。

      收起
      自动换行
      深色代码主题
      复制
      1. // 添加共享时长策略
      2. try {
      3. // 先调用startAppPicker获取相应应用的token
      4. const tokens = await appPicker.startAppPicker(this.getUIContext().getHostContext(), { appTokens: [] });
      5. const inclusiveDurationTime: guardService.TimeStrategy = {
      6. type: guardService.TimeStrategyType.INCLUSIVE_DURATION_TYPE,
      7. totalDuration: 3,
      8. };
      9. const info: guardService.AppInfo = {
      10. appTokens: tokens
      11. };
      12. const strategy: guardService.GuardStrategy = {
      13. name: 'inclusiveDurationTimeStrategy',
      14. timeStrategy: inclusiveDurationTime,
      15. appInfo: info,
      16. appRestrictionType: guardService.RestrictionType.TRUSTLIST_TYPE
      17. };
      18. await guardService.addGuardStrategy(strategy);
      19. this.currentStrategy = 'inclusiveDurationTimeStrategy';
      20. } catch (err) {
      21. const message = (err as BusinessError).message;
      22. const code = (err as BusinessError).code;
      23. hilog.error(0x0000, `ScreenTimeGuard:addGuardStrategy`,
      24. `addGuardStrategy failed with error code: ${code}, message: ${message}`);
      25. }
  • 步骤三:

    确认并生成管控策略后,根据参数中传入的策略名,应用可以启动对应管控策略。具体流程参考启动策略

    收起
    自动换行
    深色代码主题
    复制
    1. async startGuardStrategy(strategyName: string) {
    2. try {
    3. await guardService.startGuardStrategy(strategyName);
    4. hilog.info(0x0000, `ScreenTimeGuard:startGuardStrategy`, 'success');
    5. this.getUIContext().getPromptAction().showToast({
    6. message: 'startGuardStrategy success',
    7. duration: 2000,
    8. });
    9. } catch (err) {
    10. const message = (err as BusinessError).message;
    11. const code = (err as BusinessError).code;
    12. hilog.error(0x0000, `ScreenTimeGuard:startGuardStrategy`,
    13. `startGuardStrategy failed with error code: ${code}, message: ${message}`);
    14. }
    15. }

完整代码:

收起
自动换行
深色代码主题
复制
  1. import { appPicker, guardService } from '@kit.ScreenTimeGuardKit';
  2. import { hilog } from '@kit.PerformanceAnalysisKit';
  3. import { common } from '@kit.AbilityKit';
  4. @Entry
  5. @Component
  6. struct Index {
  7. @State currentStrategy?: string = '';
  8. async aboutToAppear(): Promise<void> {
  9. try {
  10. const status = await guardService.getUserAuthStatus();
  11. hilog.info(0x0000, `ScreenTimeGuard:getUserAuthStatus`, `user auth status: ${status}`);
  12. if (status != guardService.AuthStatus.AUTH_GRANTED) {
  13. await guardService.requestUserAuth(this.getUIContext().getHostContext() as common.UIAbilityContext);
  14. }
  15. } catch (err) {
  16. const message = (err as BusinessError).message;
  17. const code = (err as BusinessError).code;
  18. hilog.error(0x0000, `ScreenTimeGuard:requestUserAuth`,
  19. `requestUserAuth failed with error code: ${code}, message: ${message}`);
  20. }
  21. }
  22. async startGuardStrategy(strategyName: string) {
  23. try {
  24. await guardService.startGuardStrategy(strategyName);
  25. hilog.info(0x0000, `ScreenTimeGuard:startGuardStrategy`, 'success');
  26. this.getUIContext().getPromptAction().showToast({
  27. message: 'startGuardStrategy success',
  28. duration: 2000,
  29. });
  30. } catch (err) {
  31. const message = (err as BusinessError).message;
  32. const code = (err as BusinessError).code;
  33. hilog.error(0x0000, `ScreenTimeGuard:startGuardStrategy`,
  34. `startGuardStrategy failed with error code: ${code}, message: ${message}`);
  35. }
  36. }
  37. async stopGuardStrategy(strategyName: string) {
  38. try {
  39. await guardService.stopGuardStrategy(strategyName);
  40. hilog.info(0x0000, `ScreenTimeGuard:stopGuardStrategy`, 'success');
  41. this.getUIContext().getPromptAction().showToast({
  42. message: 'stopGuardStrategy success',
  43. duration: 2000,
  44. });
  45. } catch (err) {
  46. const message = (err as BusinessError).message;
  47. const code = (err as BusinessError).code;
  48. hilog.error(0x0000, `ScreenTimeGuard:stopGuardStrategy`,
  49. `stopGuardStrategy failed with error code: ${code}, message: ${message}`);
  50. }
  51. }
  52. build() {
  53. Column({ space: 10 }) {
  54. Text('当前策略:' + this.currentStrategy);
  55. Button('添加起始时间策略')
  56. .onClick(async () => {
  57. try {
  58. await guardService.removeGuardStrategy('startEndTimeStrategy');
  59. } catch (err) {
  60. const message = (err as BusinessError).message;
  61. const code = (err as BusinessError).code;
  62. hilog.error(0x0000, `ScreenTimeGuard:removeGuardStrategy`,
  63. `removeGuardStrategy failed with error code: ${code}, message: ${message}`);
  64. }
  65. // 添加起始时间策略
  66. try {
  67. // 先调用startAppPicker获取相应应用的token
  68. const tokens = await appPicker.startAppPicker(this.getUIContext().getHostContext(), { appTokens: [] });
  69. const startEndTime: guardService.TimeStrategy = {
  70. type: guardService.TimeStrategyType.START_END_TIME_TYPE,
  71. startTime: '08:00',
  72. endTime: '19:00',
  73. };
  74. const info: guardService.AppInfo = {
  75. appTokens: tokens
  76. };
  77. const strategy: guardService.GuardStrategy = {
  78. name: 'startEndTimeStrategy',
  79. timeStrategy: startEndTime,
  80. appInfo: info,
  81. appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
  82. };
  83. await guardService.addGuardStrategy(strategy);
  84. this.currentStrategy = 'startEndTimeStrategy';
  85. } catch (err) {
  86. const message = (err as BusinessError).message;
  87. const code = (err as BusinessError).code;
  88. hilog.error(0x0000, `ScreenTimeGuard:addGuardStrategy`,
  89. `addGuardStrategy failed with error code: ${code}, message: ${message}`);
  90. }
  91. })
  92. Button('添加总时长策略')
  93. .onClick(async () => {
  94. try {
  95. await guardService.removeGuardStrategy('totalDurationTimeStrategy');
  96. } catch (err) {
  97. const message = (err as BusinessError).message;
  98. const code = (err as BusinessError).code;
  99. hilog.error(0x0000, `ScreenTimeGuard:removeGuardStrategy`,
  100. `removeGuardStrategy failed with error code: ${code}, message: ${message}`);
  101. }
  102. // 添加总时长策略
  103. try {
  104. // 先调用startAppPicker获取相应应用的token
  105. const tokens = await appPicker.startAppPicker(this.getUIContext().getHostContext(), { appTokens: [] });
  106. const totalDurationTime: guardService.TimeStrategy = {
  107. type: guardService.TimeStrategyType.TOTAL_DURATION_TYPE,
  108. totalDuration: 3,
  109. };
  110. const info: guardService.AppInfo = {
  111. appTokens: tokens
  112. };
  113. const strategy: guardService.GuardStrategy = {
  114. name: 'totalDurationTimeStrategy',
  115. timeStrategy: totalDurationTime,
  116. appInfo: info,
  117. appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
  118. };
  119. await guardService.addGuardStrategy(strategy);
  120. this.currentStrategy = 'totalDurationTimeStrategy';
  121. } catch (err) {
  122. const message = (err as BusinessError).message;
  123. const code = (err as BusinessError).code;
  124. hilog.error(0x0000, `ScreenTimeGuard:addGuardStrategy`,
  125. `addGuardStrategy failed with error code: ${code}, message: ${message}`);
  126. }
  127. })
  128. Button('添加共享时长策略')
  129. .onClick(async () => {
  130. try {
  131. await guardService.removeGuardStrategy('inclusiveDurationTimeStrategy');
  132. } catch (err) {
  133. const message = (err as BusinessError).message;
  134. const code = (err as BusinessError).code;
  135. hilog.error(0x0000, `ScreenTimeGuard:removeGuardStrategy`,
  136. `removeGuardStrategy failed with error code: ${code}, message: ${message}`);
  137. }
  138. // 添加共享时长策略
  139. try {
  140. // 先调用startAppPicker获取相应应用的token
  141. const tokens = await appPicker.startAppPicker(this.getUIContext().getHostContext(), { appTokens: [] });
  142. const inclusiveDurationTime: guardService.TimeStrategy = {
  143. type: guardService.TimeStrategyType.INCLUSIVE_DURATION_TYPE,
  144. totalDuration: 3,
  145. };
  146. const info: guardService.AppInfo = {
  147. appTokens: tokens
  148. };
  149. const strategy: guardService.GuardStrategy = {
  150. name: 'inclusiveDurationTimeStrategy',
  151. timeStrategy: inclusiveDurationTime,
  152. appInfo: info,
  153. appRestrictionType: guardService.RestrictionType.TRUSTLIST_TYPE
  154. };
  155. await guardService.addGuardStrategy(strategy);
  156. this.currentStrategy = 'inclusiveDurationTimeStrategy';
  157. } catch (err) {
  158. const message = (err as BusinessError).message;
  159. const code = (err as BusinessError).code;
  160. hilog.error(0x0000, `ScreenTimeGuard:addGuardStrategy`,
  161. `addGuardStrategy failed with error code: ${code}, message: ${message}`);
  162. }
  163. })
  164. Button('启动当前策略')
  165. .onClick(() => {
  166. if (this.currentStrategy) {
  167. this.startGuardStrategy(this.currentStrategy);
  168. } else {
  169. this.getUIContext().getPromptAction().showToast({
  170. message: '请先设置当前策略',
  171. duration: 2000,
  172. });
  173. }
  174. })
  175. Button('停止当前策略')
  176. .onClick(() => {
  177. if (this.currentStrategy) {
  178. this.stopGuardStrategy(this.currentStrategy);
  179. } else {
  180. this.getUIContext().getPromptAction().showToast({
  181. message: '请先设置当前策略',
  182. duration: 2000,
  183. });
  184. }
  185. })
  186. }
  187. .height('100%')
  188. .width('100%')
  189. .justifyContent(FlexAlign.Center);
  190. }
  191. }
在 FAQ 中进行搜索
请输入您想要搜索的关键词