device-usage-statistics-dev-guide.md 14.8 KB
Newer Older
1
# 设备使用信息统计
W
wyuanchao 已提交
2

W
wyuanchao 已提交
3
## 场景介绍
W
wyuanchao 已提交
4

W
wyuanchao 已提交
5 6 7 8 9 10
设备使用信息统计,包括app usage/notification usage/system usage等使用统计。例如应用使用信息统计,用于保存和查询应用使用详情(app usage)、事件日志数据(event log)、应用分组(bundle group)情况。
部件缓存的应用记录(使用历史统计和使用事件记录)会在事件上报后30分钟内刷新到数据库持久化保存。

## 接口说明
注册相关接口包导入:
```js
W
wyuanchao 已提交
11
import stats from '@ohos.bundleState';
W
wyuanchao 已提交
12
```
W
wyuanchao 已提交
13 14 15 16 17

**表1** 设备使用信息统计主要接口

| 接口名 | 描述 |
| -------- | -------- |
W
wyuanchao 已提交
18 19 20 21 22 23
| function queryBundleActiveStates(begin: number, end: number, callback: AsyncCallback<Array<BundleActiveState>>): void | 通过指定起始和结束时间查询所有应用的事件集合。 |
| function queryBundleStateInfos(begin: number, end: number, callback: AsyncCallback<BundleActiveInfoResponse>): void | 通过指定起始和结束时间查询应用使用时长统计信息。 |
| function queryCurrentBundleActiveStates(begin: number, end: number, callback: AsyncCallback<Array<BundleActiveState>>): void | 通过指定起始和结束时间查询当前应用的事件集合。 |
| function queryBundleStateInfoByInterval(byInterval: IntervalType, begin: number, end: number, callback: AsyncCallback<Array<BundleStateInfo>>): void | 通过指定时间段间隔(天、周、月、年)查询应用使用时长统计信息。 |
| function queryAppUsagePriorityGroup(callback: AsyncCallback<number>): void | 查询(返回)当前调用者应用的使用优先级群组。 |
| function isIdleState(bundleName: string, callback: AsyncCallback<boolean>): void | 判断指定Bundle Name的应用当前是否是空闲状态。 |
H
houdisheng 已提交
24
| function getRecentlyUsedModules(maxNum: number, callback: AsyncCallback<BundleActiveModuleInfo>): void | 根据maxNum,查询FA使用记录,返回不超过maxNum条FA使用记录。 |
W
wyuanchao 已提交
25 26
| function queryAppNotificationNumber(begin: number, end: number, callback: AsyncCallback<Array<BundleActiveEventState>>): void | 通过指定起始和结束时间查询所有应用的通知次数。 |
| function queryBundleActiveEventStates(begin: number, end: number, callback: AsyncCallback<Array<BundleActiveEventState>>): void | 通过指定起始和结束时间查询系统事件(休眠、唤醒、解锁、锁屏)统计信息。 |
W
wyuanchao 已提交
27 28 29

## 开发步骤

W
wyuanchao 已提交
30
1. 在config.json文件中配置设备使用信息统计权限。
W
wyuanchao 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43

    ```json
    "module": {
        "package": "com.example.deviceUsageStatistics",
        ...,
        "reqPermissions": [
            {
            "name": "ohos.permission.BUNDLE_ACTIVE_INFO"
            }
        ]
    }
    ```

W
wyuanchao 已提交
44
2. 通过指定起始和结束时间查询所有应用的事件集合,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。
W
wyuanchao 已提交
45 46

    ```js
W
wyuanchao 已提交
47
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
48 49 50

    // 异步方法promise方式
    stats.queryBundleActiveStates(0, 20000000000000).then( res => {
W
wyuanchao 已提交
51
        console.log('BUNDLE_ACTIVE queryBundleActiveStates promise success.');
W
wyuanchao 已提交
52
        for (let i = 0; i < res.length; i++) {
W
wyuanchao 已提交
53 54
            console.log('BUNDLE_ACTIVE queryBundleActiveStates promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE queryBundleActiveStates promise result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
55 56
        }
    }).catch( err => {
W
wyuanchao 已提交
57
        console.log('BUNDLE_ACTIVE queryBundleActiveStates promise failed, because: ' + err.code);
W
wyuanchao 已提交
58 59 60
    });

    // 异步方法callback方式
W
wyuanchao 已提交
61
    stats.queryBundleActiveStates(0, 20000000000000, (err, res) => {
W
wyuanchao 已提交
62 63 64
        if (err) {
            console.log('BUNDLE_ACTIVE queryBundleActiveStates callback failed, because: ' + err.code);
        } else {
W
wyuanchao 已提交
65 66 67 68
            console.log('BUNDLE_ACTIVE queryBundleActiveStates callback success.');
            for (let i = 0; i < res.length; i++) {
                console.log('BUNDLE_ACTIVE queryBundleActiveStates callback number : ' + (i + 1));
                console.log('BUNDLE_ACTIVE queryBundleActiveStates callback result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
69
            }
W
wyuanchao 已提交
70 71
        }
    });
W
wyuanchao 已提交
72 73
    ```

W
wyuanchao 已提交
74
3. 通过指定起始和结束时间查询应用使用时长统计信息,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。
W
wyuanchao 已提交
75 76

    ```js
W
wyuanchao 已提交
77
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
78 79 80

    // 异步方法promise方式
    stats.queryBundleStateInfos(0, 20000000000000).then( res => {
W
wyuanchao 已提交
81 82
        console.log('BUNDLE_ACTIVE queryBundleStateInfos promise success.');
        let i = 1;
W
wyuanchao 已提交
83
        for (let key in res){
W
wyuanchao 已提交
84 85 86
            console.log('BUNDLE_ACTIVE queryBundleStateInfos promise number : ' + i);
            console.log('BUNDLE_ACTIVE queryBundleStateInfos promise result ' + JSON.stringify(res[key]));
            i++;
W
wyuanchao 已提交
87 88
        }
    }).catch( err => {
W
wyuanchao 已提交
89
        console.log('BUNDLE_ACTIVE queryBundleStateInfos promise failed, because: ' + err.code);
W
wyuanchao 已提交
90 91 92
    });

    // 异步方法callback方式
W
wyuanchao 已提交
93
    stats.queryBundleStateInfos(0, 20000000000000, (err, res) => {
W
wyuanchao 已提交
94 95 96
        if (err) {
            console.log('BUNDLE_ACTIVE queryBundleStateInfos callback failed, because: ' + err.code);
        } else {
W
wyuanchao 已提交
97 98 99 100 101 102
            console.log('BUNDLE_ACTIVE queryBundleStateInfos callback success.');
            let i = 1;
            for(let key in res){
                console.log('BUNDLE_ACTIVE queryBundleStateInfos callback number : ' + i);
                console.log('BUNDLE_ACTIVE queryBundleStateInfos callback result ' + JSON.stringify(res[key]));
                i++;
W
wyuanchao 已提交
103
            }
W
wyuanchao 已提交
104 105
        }
    });
W
wyuanchao 已提交
106 107
    ```

W
wyuanchao 已提交
108
4. 通过指定起始和结束时间查询当前应用的事件集合,config.json中不需要配置权限。
W
wyuanchao 已提交
109 110

    ```js
W
wyuanchao 已提交
111
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
112 113 114

    // 异步方法promise方式
    stats.queryCurrentBundleActiveStates(0, 20000000000000).then( res => {
W
wyuanchao 已提交
115
        console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise success.');
W
wyuanchao 已提交
116
        for (let i = 0; i < res.length; i++) {
W
wyuanchao 已提交
117 118
            console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
119 120
        }
    }).catch( err => {
W
wyuanchao 已提交
121
        console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise failed, because: ' + err.code);
W
wyuanchao 已提交
122 123 124
    });

    // 异步方法callback方式
W
wyuanchao 已提交
125
    stats.queryCurrentBundleActiveStates(0, 20000000000000, (err, res) => {
W
wyuanchao 已提交
126 127 128
        if (err) {
            console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback failed, because: ' + err.code);
        } else {
W
wyuanchao 已提交
129 130 131 132
            console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback success.');
            for (let i = 0; i < res.length; i++) {
                console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback number : ' + (i + 1));
                console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
133
            }
W
wyuanchao 已提交
134 135
        }
    });
W
wyuanchao 已提交
136 137
    ```

W
wyuanchao 已提交
138
5. 通过指定时间段间隔(天、周、月、年)查询应用使用时长统计信息,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。
W
wyuanchao 已提交
139 140

    ```js
W
wyuanchao 已提交
141
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
142 143 144

    // 异步方法promise方式
    stats.queryBundleStateInfoByInterval(0, 0, 20000000000000).then( res => {
W
wyuanchao 已提交
145
        console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise success.');
W
wyuanchao 已提交
146
        for (let i = 0; i < res.length; i++) {
W
wyuanchao 已提交
147 148
            console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
149 150
        }
    }).catch( err => {
W
wyuanchao 已提交
151
        console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise failed, because: ' + err.code);
W
wyuanchao 已提交
152 153 154
    });

    // 异步方法callback方式
W
wyuanchao 已提交
155
    stats.queryBundleStateInfoByInterval(0, 0, 20000000000000, (err, res) => {
W
wyuanchao 已提交
156 157 158
        if (err) {
            console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback failed, because: ' + err.code);
        } else {
W
wyuanchao 已提交
159 160 161 162
            console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback success.');
            for (let i = 0; i < res.length; i++) {
                console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback number : ' + (i + 1));
                console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
163
            }
W
wyuanchao 已提交
164 165
        }
    });
W
wyuanchao 已提交
166 167
    ```

W
wyuanchao 已提交
168
6. 查询(返回)当前调用者应用的使用优先级群组,config.json中不需要配置权限。
W
wyuanchao 已提交
169 170

    ```js
W
wyuanchao 已提交
171
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
172 173 174

    // 异步方法promise方式
    stats.queryAppUsagePriorityGroup().then( res => {
W
wyuanchao 已提交
175
        console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise succeeded. result: ' + JSON.stringify(res));
W
wyuanchao 已提交
176
    }).catch( err => {
W
wyuanchao 已提交
177
        console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise failed. because: ' + err.code);
W
wyuanchao 已提交
178 179 180
    });

    // 异步方法callback方式
W
wyuanchao 已提交
181
    stats.queryAppUsagePriorityGroup((err, res) => {
W
wyuanchao 已提交
182
        if (err) {
W
wyuanchao 已提交
183
            console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback failed. because: ' + err.code);
W
wyuanchao 已提交
184 185
        } else {
            console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback succeeded. result: ' + JSON.stringify(res));
W
wyuanchao 已提交
186 187
        }
    });
W
wyuanchao 已提交
188 189
    ```

W
wyuanchao 已提交
190
7. 判断指定Bundle Name的应用当前是否是空闲状态,config.json中不需要配置权限。
W
wyuanchao 已提交
191 192

    ```js
W
wyuanchao 已提交
193
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
194 195 196

    // 异步方法promise方式
    stats.isIdleState("com.ohos.camera").then( res => {
W
wyuanchao 已提交
197
        console.log('BUNDLE_ACTIVE isIdleState promise succeeded, result: ' + JSON.stringify(res));
W
wyuanchao 已提交
198
    }).catch( err => {
W
wyuanchao 已提交
199
        console.log('BUNDLE_ACTIVE isIdleState promise failed, because: ' + err.code);
W
wyuanchao 已提交
200 201 202
    });

    // 异步方法callback方式
W
wyuanchao 已提交
203
    stats.isIdleState("com.ohos.camera", (err, res) => {
W
wyuanchao 已提交
204
        if (err) {
W
wyuanchao 已提交
205
            console.log('BUNDLE_ACTIVE isIdleState callback failed, because: ' + err.code);
W
wyuanchao 已提交
206 207
        } else {
            console.log('BUNDLE_ACTIVE isIdleState callback succeeded, result: ' + JSON.stringify(res));
W
wyuanchao 已提交
208 209
        }
    });
H
houdisheng 已提交
210 211
    ```

H
houdisheng 已提交
212
8. 查询FA使用记录。返回数量最大不超过maxNum设置的值,若不传入maxNum参数,则默认maxNum为1000。config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。
H
houdisheng 已提交
213 214 215 216 217

    ```js
    import stats from '@ohos.bundleState'

    // 异步方法promise方式
H
houdisheng 已提交
218
    stats.getRecentlyUsedModules(1000).then( res => {
H
houdisheng 已提交
219
        console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise succeeded');
H
houdisheng 已提交
220
        for (let i = 0; i < res.length; i++) {
H
houdisheng 已提交
221 222
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise result ' + JSON.stringify(res[i]));
H
houdisheng 已提交
223 224
        }
    }).catch( err=> {
H
houdisheng 已提交
225
        console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise failed, because: ' + err.code);
H
houdisheng 已提交
226 227
    });

H
houdisheng 已提交
228
    // 无maNum参数异步方法promise方式
H
houdisheng 已提交
229 230 231 232 233 234 235 236 237 238
    stats.getRecentlyUsedModules().then( res => {
        console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise succeeded');
        for (let i = 0; i < res.length; i++) {
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise result ' + JSON.stringify(res[i]));
        }
    }).catch( err=> {
        console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise failed, because: ' + err.code);
    });

H
houdisheng 已提交
239
    // 异步方法callback方式
H
houdisheng 已提交
240
    stats.getRecentlyUsedModules(1000,(err, res) => {
H
houdisheng 已提交
241
        if(err) {
H
houdisheng 已提交
242
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback failed, because: ' + err.code);
H
houdisheng 已提交
243
        } else {
H
houdisheng 已提交
244
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback succeeded.');
H
houdisheng 已提交
245
                for (let i = 0; i < res.length; i++) {
H
houdisheng 已提交
246 247
                    console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback number : ' + (i + 1));
                    console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback result ' + JSON.stringify(res[i]));
H
houdisheng 已提交
248 249 250
                }
            }
    });
H
houdisheng 已提交
251

H
houdisheng 已提交
252
    // 无maNum参数异步方法callback方式
H
houdisheng 已提交
253 254 255 256 257 258 259 260 261 262 263
    stats.getRecentlyUsedModules((err, res) => {
        if(err) {
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback failed, because: ' + err.code);
        } else {
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback succeeded.');
                for (let i = 0; i < res.length; i++) {
                    console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback number : ' + (i + 1));
                    console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback result ' + JSON.stringify(res[i]));
                }
            }
    });
H
houdisheng 已提交
264 265
    ```

W
wyuanchao 已提交
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
9. 通过指定起始和结束时间查询所有应用的通知次数,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。

    ```js
    import stats from '@ohos.bundleState'

    // 异步方法promise方式
    stats.queryAppNotificationNumber(0, 20000000000000).then( res => {
        console.log('BUNDLE_ACTIVE queryAppNotificationNumber promise success.');
        console.log('BUNDLE_ACTIVE queryAppNotificationNumber promise result ' + JSON.stringify(res));
    }).catch( err => {
        console.log('BUNDLE_ACTIVE queryAppNotificationNumber promise failed, because: ' + err.code);
    });

    // 异步方法callback方式
    stats.queryAppNotificationNumber(0, 20000000000000, (err, res) => {
        if (err) {
            console.log('BUNDLE_ACTIVE queryAppNotificationNumber callback failed, because: ' + err.code);
        } else {
            console.log('BUNDLE_ACTIVE queryAppNotificationNumber callback success.');
            console.log('BUNDLE_ACTIVE queryAppNotificationNumber callback result ' + JSON.stringify(res));
        }
    });
    ```

10. 通过指定起始和结束时间查询系统事件(休眠、唤醒、解锁、锁屏)统计信息,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。

    ```js
    import stats from '@ohos.bundleState'

    // 异步方法promise方式
    stats.queryBundleActiveEventStates(0, 20000000000000).then( res => {
        console.log('BUNDLE_ACTIVE queryBundleActiveEventStates promise success.');
        console.log('BUNDLE_ACTIVE queryBundleActiveEventStates promise result ' + JSON.stringify(res));
    }).catch( err => {
        console.log('BUNDLE_ACTIVE queryBundleActiveEventStates promise failed, because: ' + err.code);
    });

    // 异步方法callback方式
    stats.queryBundleActiveEventStates(0, 20000000000000, (err, res) => {
        if (err) {
            console.log('BUNDLE_ACTIVE queryBundleActiveEventStates callback failed, because: ' + err.code);
        } else {
            console.log('BUNDLE_ACTIVE queryBundleActiveEventStates callback success.');
            console.log('BUNDLE_ACTIVE queryBundleActiveEventStates callback result ' + JSON.stringify(res));
        }
    });
    ```