Commit 0b10ad5fdc1347705caf696252391ff0d1989bc4

Authored by weixin_45529955
1 parent f3bebb55

切换

Showing 100 changed files with 91 additions and 3858 deletions

Too many changes to show.

To preserve performance only 100 of 100+ files are displayed.

This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
... ... @@ -7,193 +7,155 @@
},
{
"MODULE_NAME": "428e7caee736e8dd1a27020af21b38fb",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "07fb1d487aa0e1e359b9b1dac455d629",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "2033aa4a500380e5306239b43d4942c4",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "2b8c2f50045c938bd1c94f02f688bc89",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "f3877ad312855df543d73a7dcd14ab37",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "ab47c6ea926832c7933dbe170daafee4",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "e9b7cf7b3b23767b3c5870db0e47e6da",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "d234df3ff61095f82dcffa0ba8a646af",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "c3b68e3a2885c1df1bc56d8b9c7327fb",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "7f2edbab8ffd8e12afb916d8f51f0397",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "ef265a303d8136a469281f89142c38a4",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "1497c6488d4ed6aef9dff7fbb38b5c62",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "c69691cb15b64faf3c00a32bef2fc323",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "f2cbbf606f4e3fa4f48166faa93be095",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "f2439eca07c5cd702f12991002015405",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "4ad28f81a9d228960984d4ad8c50d065",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "4d9eec46dd5fe19a5d8534348af62589",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "481e9a5486655e7cd5321013a840a335",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "4684bde8e9ee4abd14a8a5fc74865e67",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "13df367b8fc48672ef4ee0805248d811",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "837111e3033824ca0e9ec04f29676e53",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "ccf120495d457a9f41a6b6400f392dcd",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "3f7a9c0bfe21a0f3943ea9a871a80651",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "c588451e071e2d222ee438d22b8e3fb3",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "0b3eb11390f11f862f663d2b7919b8fb",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "dbc14e6cf31781b5c012291562971ac4",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "756d1154423b7db316b56d50ec5891f2",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "e1fc81bf796f48d8c10fc07a84e44cf5",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "70c9730c4586c493806a969ae8416315",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "7be84787a0150707daca8177416ff2f8",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "d36b0210db405a21103601020cbed998",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "b55f8ba7dec34e016ab93ec45449223a",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "fd03a54646ec206a7eb620f15cb7a69e",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "b6849807f67d6186d3b5d46bb8e6b0ed",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "9f4516db86164291e385574a40f6848b",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "992c92c4e06937e3b4b007823c10b81c",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
},
{
"MODULE_NAME": "9e0b7b2c330d2c559ee17ca7669d1b50",
"API_TYPE": "stageMode",
"IS_BYTE_CODE_HAR": true
"API_TYPE": "stageMode"
}
],
"NATIVE_COMPILER": "Default",
"BUILD_MODE": "debug",
"USE_NORMALIZED_OHMURL": true
"BUILD_MODE": "debug"
},
"HVIGOR": {
"IS_INCREMENTAL": true,
... ... @@ -202,118 +164,118 @@
"IS_HVIGORFILE_TYPE_CHECK": false,
"TASK_TIME": {
"1043bfc77febe75fafec0c4309faccf1": {
"PreBuild": 56738000
"PreBuild": 51030750
},
"428e7caee736e8dd1a27020af21b38fb": {
"PreBuild": 19896417
"PreBuild": 21542042
},
"07fb1d487aa0e1e359b9b1dac455d629": {
"PreBuild": 4272458
"PreBuild": 4347042
},
"2033aa4a500380e5306239b43d4942c4": {
"PreBuild": 3323167
"PreBuild": 2867292
},
"2b8c2f50045c938bd1c94f02f688bc89": {
"PreBuild": 3397709
"PreBuild": 2865083
},
"f3877ad312855df543d73a7dcd14ab37": {
"PreBuild": 3049917
"PreBuild": 2655709
},
"ab47c6ea926832c7933dbe170daafee4": {
"PreBuild": 4187292
"PreBuild": 2449208
},
"e9b7cf7b3b23767b3c5870db0e47e6da": {
"PreBuild": 3048875
"PreBuild": 2614625
},
"d234df3ff61095f82dcffa0ba8a646af": {
"PreBuild": 3548292
"PreBuild": 2797167
},
"c3b68e3a2885c1df1bc56d8b9c7327fb": {
"PreBuild": 3111125
"PreBuild": 2595625
},
"7f2edbab8ffd8e12afb916d8f51f0397": {
"PreBuild": 3017833
"PreBuild": 2432583
},
"ef265a303d8136a469281f89142c38a4": {
"PreBuild": 3859125
"PreBuild": 2894791
},
"1497c6488d4ed6aef9dff7fbb38b5c62": {
"PreBuild": 2824792
"PreBuild": 2324208
},
"c69691cb15b64faf3c00a32bef2fc323": {
"PreBuild": 3789041
"PreBuild": 2517375
},
"f2cbbf606f4e3fa4f48166faa93be095": {
"PreBuild": 4656625
"PreBuild": 2568375
},
"f2439eca07c5cd702f12991002015405": {
"PreBuild": 2992875
"PreBuild": 2417917
},
"4ad28f81a9d228960984d4ad8c50d065": {
"PreBuild": 2760667
"PreBuild": 2463750
},
"4d9eec46dd5fe19a5d8534348af62589": {
"PreBuild": 2551083
"PreBuild": 2321458
},
"481e9a5486655e7cd5321013a840a335": {
"PreBuild": 2721417
"PreBuild": 2463291
},
"4684bde8e9ee4abd14a8a5fc74865e67": {
"PreBuild": 2539875
"PreBuild": 2282542
},
"13df367b8fc48672ef4ee0805248d811": {
"PreBuild": 2824750
"PreBuild": 2213500
},
"837111e3033824ca0e9ec04f29676e53": {
"PreBuild": 2473750
"PreBuild": 2671916
},
"ccf120495d457a9f41a6b6400f392dcd": {
"PreBuild": 3205291
"PreBuild": 2379250
},
"3f7a9c0bfe21a0f3943ea9a871a80651": {
"PreBuild": 2577584
"PreBuild": 2203792
},
"c588451e071e2d222ee438d22b8e3fb3": {
"PreBuild": 2508250
"PreBuild": 2288417
},
"0b3eb11390f11f862f663d2b7919b8fb": {
"PreBuild": 2749417
"PreBuild": 2310084
},
"dbc14e6cf31781b5c012291562971ac4": {
"PreBuild": 2478500
"PreBuild": 2316125
},
"756d1154423b7db316b56d50ec5891f2": {
"PreBuild": 2296542
"PreBuild": 2222250
},
"e1fc81bf796f48d8c10fc07a84e44cf5": {
"PreBuild": 2304417
"PreBuild": 2193000
},
"70c9730c4586c493806a969ae8416315": {
"PreBuild": 2460917
"PreBuild": 2310625
},
"7be84787a0150707daca8177416ff2f8": {
"PreBuild": 2359292
"PreBuild": 2214875
},
"d36b0210db405a21103601020cbed998": {
"PreBuild": 2647291
"PreBuild": 3031542
},
"b55f8ba7dec34e016ab93ec45449223a": {
"PreBuild": 2736125
"PreBuild": 2359917
},
"fd03a54646ec206a7eb620f15cb7a69e": {
"PreBuild": 2908042
"PreBuild": 2125458
},
"b6849807f67d6186d3b5d46bb8e6b0ed": {
"PreBuild": 2911000
"PreBuild": 2569250
},
"9f4516db86164291e385574a40f6848b": {
"PreBuild": 2382333
"PreBuild": 2186625
},
"992c92c4e06937e3b4b007823c10b81c": {
"PreBuild": 2288041
"PreBuild": 2234625
},
"9e0b7b2c330d2c559ee17ca7669d1b50": {
"PreBuild": 2447875
"PreBuild": 2393125
}
},
"APIS": [
... ... @@ -354,13 +316,13 @@
"getCommandEntryTask"
],
"CONFIG_PROPERTIES": {},
"BUILD_ID": "202512091844458210",
"BUILD_ID": "202512101034375330",
"ERROR_MESSAGE": [
{
"CODE": "00000000",
"TIMESTAMP": "1765277096184"
"TIMESTAMP": "1765334089158"
}
],
"TOTAL_TIME": 10365329167
"TOTAL_TIME": 11626725042
}
}
\ No newline at end of file
... ...
{"CACHE_SYNC_FILE_HASH":{"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/hvigor/hvigor-config.json5":"bb01c33691d8e2b13eca80fb9f361c05623667ca0ba84cf8926f5b160c70f286","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/build-profile.json5":"663a943de2c5ce7e540ac0c73acc714ec7d22ea226553ae53e607d325d42fdef","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/hvigorfile.ts":"a045e517f75af82f434be43b9682722bcf4ad697b2212b35a522b0b57d7e668b","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh-package.json5":"e497c68922a9b3c2f03844f73059bb2a5746571298b029182c56dba5369c5c50","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build-profile.json5":"4199521ee5382732441b63b10a655769959901e036802e339ff3a5da129212eb","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/hvigorfile.ts":"f147de65ca93652579a80662a46232aa5adc06b93e3840b0b08a1b84ba6cc6d7","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/oh-package.json5":"99232b5bdedcda1cd07a64a59efc432e8900ef57b170a854b692e44368f2431b","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/build-profile.json5":"10046297678ca18ca4abab941c1243d5be2d7a42da8b71d757fe21e04400f8a8","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/hvigorfile.ts":"2ca18381a6df1a811445e6e8c9507789db0c7436513ed13b6253db4b3dfbbd07","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/oh-package.json5":"bfeef7fba065739c753d46145e0aaa8e935fd31e26e577a4bdc61b6c2bb618d7","/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/build-profile.json5":"4994c4a67f7d9a039bb85d6ba7e0517f23ff714c0b73051c95db359c60f60907","/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/hvigorfile.ts":"61abd7096b281d0ace810cda44b241c582ae1f9a0d623c99cd1c9623b1bcc570","/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/oh-package.json5":"e989d73a8c83a80219019489beedeac11176ef522ec7250ac7932abd6b0ff728","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/build-profile.json5":"d89d9a07c2b440e7e8197f176116bce5688baaadb50f67c533770f1cd12302fb","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/hvigorfile.ts":"9bbe566435e39f9ad9c1618039df5b20e4ab07b863e3a526e115475733b2ca56","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/oh-package.json5":"f775dea82ef9174d67f008427680e088fbe674b611fff42a7056c6ff1542c3a3","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/build-profile.json5":"04c30bba0aa1168ec988390bbc4773d9101465c148f538d1dc757a0e897ea905","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/hvigorfile.ts":"123c629991994e7225838027410ab1949e890017ce36ebad6e832ea69ce5acfd","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/oh-package.json5":"fdc6c95214ff88693da1086cff098c7c073b1548a21761f5fb0844bef21a3b36","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/build-profile.json5":"d0dbd671dd2d77bc6f283eec165122d83144bffbcec7cfd3a725429733521513","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/hvigorfile.ts":"648a777d67492790ae896ef2c611c94851427fa59df44f8aa8c46a5f2758701d","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/oh-package.json5":"bb324b9522348c0ca44c46b395e30ea30a938053c2db2899d3fa1977ba87282f","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/build-profile.json5":"f3adab0262e2142b1083a41758939705ea1497a326bc819c9b3de0ee56f57559","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/hvigorfile.ts":"ae91ddcced71091a2b1b90cb113fca6ca4391c8c67dfb062dd5d8c84c1459b9f","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/oh-package.json5":"01c3e2cd9b541810a559d14d8f8e2e8253e42e6a853da18a8619fdd05377b3a5","/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/build-profile.json5":"1735496c3e441ca38f83defac5243a36be13af43da0c2ee5896722a9bc21e8a9","/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/hvigorfile.ts":"7bf6d1527b4bb236776cff9bd7283084ea027e4831a1b1c2feca8546d850ee0f","/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/oh-package.json5":"11dd79fb30d8fc15465b9a01acff05c13add0e363e40b680b8d66e81beb6ba49","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/build-profile.json5":"4bf7e8dd60eecd4e4f1195f263480a5af953eaa8ce0394d5d883276e513cc5c6","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/hvigorfile.ts":"4cdba00aa15e9ad398585ae581c7939ff042e273841577c533429c52a7565df2","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/oh-package.json5":"c35b58f1303a6a735f774868cd01f3902771b508311f684407554c7c227ca795","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/build-profile.json5":"8b66bc386e37e21bfb1c686d6e0061bc0ce268f683a7bc60b77b256e871987b5","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/hvigorfile.ts":"f464228a326831f8850a1c94adb37adfac6a2aa28a76a203b2b16ef973f0ee80","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/oh-package.json5":"bbce10ceca5f24d9ca7d37d74365dc7e1e4d6b652be7cbf812032c8319b374ff","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/build-profile.json5":"7071ae10423a83c4ffcfa958b1b34901d481d9b0be6bd88b08d01f479b1d9df5","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/hvigorfile.ts":"a620b7c507be1f848e158970162fa373312713c982111f28d164544bc7c4949e","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/oh-package.json5":"198b1ce539c1bf0a76dafc50cbc6170a9ae7b1be42d4a0f4c2a3c8e54c35328a","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/build-profile.json5":"40913f7e88b3017339347106f9de25aca3901b0de4bc41bc155e8c12ec8b2013","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/hvigorfile.ts":"447b52dceec5684873b1a27886ca2699ca9e17c9684cf5f51686d16b2d958025","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/oh-package.json5":"784d7c85105c0d2e4aafebefd59f8e9094a226473cffaf395f915d3d5a09e88b","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/build-profile.json5":"2d8d3340a7335ef679ed421e947187c492c4403c3393301a7f7f518c00302865","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/hvigorfile.ts":"843d340ff6d718e9873876a0b825b79c04988a5db6eee667c544586eea683048","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/oh-package.json5":"75979abb1c98d1113781389020b6b78027882390796bf68d8feeec1c9192cfb9","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/build-profile.json5":"047a11b2478a1ab112aaf2b51456edd92c9dc8e02302fce091b8500ead821017","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/hvigorfile.ts":"d879317c8988729603d8168d7a53771631b7289c69afa382cd59d6cbf3dd563d","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/oh-package.json5":"ad8b6b5e15a92699ecb923e9e335aaa54fcf61e56abf7af66b0d3e3ead351ef2","/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/build-profile.json5":"1abcc90ae2a72599fc603726219d725b0e262c8435a58dd01e98a3f04cc9f684","/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/hvigorfile.ts":"10126efced0e8d43ac145730e852ee148488e26da0554d1c2bcf8e8f51d170c8","/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/oh-package.json5":"c21d1178ea40f4ae12ee3faebac8505c01c4357e2de4ab49bce387caad338b7b","/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/build-profile.json5":"59dcbf0b10dbb0dba143bd08be45cd0ad258b42b4521151812332b25ca871758","/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/hvigorfile.ts":"9f9f200b8b5cdbdc137d2cfb09933d52866c2c614c053c934d814fb66e1f1235","/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/oh-package.json5":"fbf02c010e1a5a94ee5873adf048e14f212d31e0315bad63fb7a304a325f7bd6","/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/build-profile.json5":"265475c563e420ff468348fba234c7739074088e8119f00bb51e83bebbbf8094","/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/hvigorfile.ts":"fde1f438c2520f70a5d3ffa5949cac974eda317e38333cb732f8a290ba0b64a3","/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/oh-package.json5":"decf612013afa472c824afaa19760126d3eda6888d78e1a3ff36c2103c5f2ae2","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/build-profile.json5":"ff50f039529292bd60666ab21c4b732c686f1cb06638a388abd42189ce6aef4e","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/hvigorfile.ts":"6b014bc61092c8e39d62c7ea90e9f5438c28d2683e3849328daec411fdbb22df","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/oh-package.json5":"d97da2937394ff6322badaf510c3bf0d3094416778d9c0b0eab6f83e50963fc8","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/build-profile.json5":"abad9efe0028f075005ec22bf3552178c382748a053dad3898af38aeb2c1649d","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/hvigorfile.ts":"ddd20e5189b02bef9b8d99d5cf5bf01055b13dee78b0ad4dd3c29e43f8d14b48","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/oh-package.json5":"676273bdd201bf0a125efb398aaf01a0e6b029795422d3cbb36ebfa3a068a641","/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/build-profile.json5":"44c34e9eb1ebcac50750e134d5bb4e43c45112a5098328dadd353f3bfce5da97","/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/hvigorfile.ts":"1d374bac80d06618700603feeb6902b3f52d742f82d36a568563da93928a2526","/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/oh-package.json5":"c339d18d711cd918963e112b2181740afbfbc047560bb608122df859a96cb5af","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/build-profile.json5":"c7a4fa6fa7d602f81441d68166fed5a7a5c9c68473acdfe8229e44a4299b6491","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/hvigorfile.ts":"c0875d49bfdab850f20f6af203ed4a5a3691ba4878922507f96728bca17a8627","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/oh-package.json5":"7651da80cfaf57d7443ab94dfc2f77273fa0c041742cc19257694a639ee51d01","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/build-profile.json5":"c98468006609f08c2e92d88ab2f43798885e6f034fd090957d589cd466a86ab6","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/hvigorfile.ts":"608687a420762649e09da9eca73cc807f9ff19b177f8646722f839eae5acc25c","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/oh-package.json5":"2e0d0eac90441fc5b093fe787586a3bdfed7314ec312a57fed2bbc0c6eddec15","/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/build-profile.json5":"5c3c15fe25b681e51e73e1bf9000ba31c0c637261a3b32aba9b0661a8f5aef9d","/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/hvigorfile.ts":"1b85d12725ca678ac8b014f03b41f9f30ac2f511af398cf57c676a76a657bfea","/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/oh-package.json5":"5b03467bc2d7ad052bac532b511db6d0963211acb492fc7d8d485919b55ff51e","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/build-profile.json5":"96306a2f5494603535f415c9ddf2a034839bd1d603147a9511ff84512faee730","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/hvigorfile.ts":"9089a7a8bc203c9246543fc9e7a8f42950ef925bf83f2d29fed6733581ae5417","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/oh-package.json5":"57d6646a749bdb0546b35bb1278053b3ce9e0e758dc63d0b77600578eb4f02d9","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/build-profile.json5":"7eaad5d735a91382b9bb35f1d1a249622d610f181a39c4717ec475dbd172fd4a","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/hvigorfile.ts":"e1240238aef5b5359f80d33f7234c4bfe3015bd891e27ed67347235120480689","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/oh-package.json5":"780b2c67235f3773c912d51782ca3b79a5e922c173240f3028468a674f798edb","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/build-profile.json5":"7b7ea00d6ae0ede6197c2292f89e5bc28f9d7f9d46b8a2235cc8364d17eb714a","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/hvigorfile.ts":"a4bebb57dcb1825f368214f6063c5dfbe6e14a58f24ab97449792d9b244ae16e","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/oh-package.json5":"065d0bfc4c7603197f762b90ecc04d23c1172188b65b4fdd904e75f78cf5bac4","/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/build-profile.json5":"ef931324ba1766acc549b58c471e8ebdadb05f0f2e01f60da76c525136d8d906","/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/hvigorfile.ts":"a1df738b7ca4529f9ff4bf42ef64eaedc7b2edfbb7c67b4ff1bc5338ec4a0fbb","/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/oh-package.json5":"77afd5ad9ad5f7423e9876540ac9df30ecfb956947d0b0f904a97a5dd1a17f80","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/build-profile.json5":"2f6ce9218177ba9f23e2b35611f35c4b7fb06f864d8efb3d52d64cdcd6d79bfd","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/hvigorfile.ts":"09e07ff1dc6f1c4ea6547fdc72aa3cecb7ed00982a874e3536c27dd90e000521","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/oh-package.json5":"aafb6858607224222ea22f3bb2884ffdc1243a34b40ef29bd788fb687847ae0b","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/build-profile.json5":"a8a7e0a2ffaab79eb5bacdea544f3c88ba746da30b1c35b3aed8c219420587dd","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/hvigorfile.ts":"c4e5ac7c08d4a026c0dafac01d1c72f4f50420fe9bb77b58acd0361f73b48eea","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/oh-package.json5":"e5803a3bb80e47626c5bf8ec70a54b7318c690b532a725b43b472f9d870bd966","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/build-profile.json5":"24f00db242396070c64b0b881bd9328e7f259e4e6768cf1f75743c0efbf9e727","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/hvigorfile.ts":"b0e80f86c0a2d88dc9a51f8c2e7d829644c6c447f7529efbe0d998c06e756949","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/oh-package.json5":"179f4cc9dec2e1bc42f313837fbf4691f1b0cd1f70081c46131635144225ec2d","/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/build-profile.json5":"a7ecb699242346828ae533ecf85cd8859fa49af6a884555d33aea6945d179c51","/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/hvigorfile.ts":"6a3db9dfb2e982df336f18c923c4cac8eb8c52b6b36032e8936c6e94ce3bada6","/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/oh-package.json5":"06e49bd3f7de439e56a260b1849ed246e13b8acab8f1f7ef2b1219fd4362cd37","/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/build-profile.json5":"08d091a224cb8eaa38425d45a1ab3e0e141528fd0aaa9b42b01f973b30e70939","/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/hvigorfile.ts":"03d5d00801cc3b0f61c902b393d657449de9df775b5658ed364fd5fc43a250eb","/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/oh-package.json5":"1a8f166002e8b9aa63ef7964fe25efb2902a107248753bbb89d06e2321889251","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/build-profile.json5":"c0a6eb947fb54ce00787d592d7ab77c200a9eb05364911ada4d092938b7ab2c3","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/hvigorfile.ts":"11f2c8284e98c0495ddfd45df2d9b2fb5aeedcb86d8ab971bbed00132c573249","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/oh-package.json5":"7e80fef97ffe0aba499c4eaea30a5d20fda212ebb3faa68f594955cb8bf5a0ef","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/build-profile.json5":"c6052ea754174d65c21204fa3c6f3c2b7f05c192953673bdf9085ab8714e7d42","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/hvigorfile.ts":"c2de76f1cbbd41f55fc078731bf0d8da149f02429c7b06eafafb28ab344584cf","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/oh-package.json5":"c19d539f21db46329ddbee7a484cc323b65ce54d6268a6962f0c56dfce62fb21","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/build-profile.json5":"75bbfbbc3e44cbd69de766ca919880276fed02bd0879788e2b4bf1cf329a4648","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/hvigorfile.ts":"bc9c145c534ad408cb9b654a3f01d2d4712fa3cb2029447109003122cea0f902","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/oh-package.json5":"604fb57d07467240bcc4ad0f7030e83cec467d172b370d0ca26677c7f579e6f5","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/build-profile.json5":"706e3923a617c303b99d0daa2dadc231176bcbd23846ddcccd63f60740236d09","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/hvigorfile.ts":"26a021597b0fc6fe5e4cb5520a550d9962f1da2477453ff2ab767de608194e8e","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/oh-package.json5":"9cc49f65fb96ab42176083213fa354c5d49edb20ab3fa913abdffa99a96cd852","/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/build-profile.json5":"d27b7ca5e08dbbe319e4f13d14ad99b0ca346aa69593f11e52d85e42903349af","/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/hvigorfile.ts":"58c5e9996b78229eb92d71f5eb821ebf4c30de6545bed117b1a2716a6923081b","/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/oh-package.json5":"73d9e18a0b7a12e66e0e75604077c2193a20ffc68d97cb88b46e1e98fe65ab29","/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/build-profile.json5":"bba2b7350e3d9661d1c4ce1855a38d5e729c59fc02833e069191f233ffd21a78","/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/hvigorfile.ts":"c5e795fdd1366cc79f38bba9377088416122d9840c87861282e90fc907cfa419","/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/oh-package.json5":"c7a4b12adaed041c41d2e6ed2003552c54078e37388d81e4523747f4127f9517","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/.hvigor/outputs/sync/output.json":"fff664dab89d71b64876deb013ce5915a21f10ccd0a633118f9c342c82784c36","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/hvigorconfig.ts":"174d8c8389cb571e8fa38621f8f02949d917f58804654077d63bf42ff8b2a8b4","SDK_LOCATION":"/Applications/DevEco-Studio.app/Contents/sdk"},"OHPM_INSTALL_FILE_HASH":{"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh-package.json5":"e497c68922a9b3c2f03844f73059bb2a5746571298b029182c56dba5369c5c50","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/lock.json5":"6fc1991ae138f81de6158387a9f03fa86c262def8464d4eef605d0763c31fe15","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/oh-package.json5":"99232b5bdedcda1cd07a64a59efc432e8900ef57b170a854b692e44368f2431b","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/oh-package.json5":"bfeef7fba065739c753d46145e0aaa8e935fd31e26e577a4bdc61b6c2bb618d7","/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/oh-package.json5":"e989d73a8c83a80219019489beedeac11176ef522ec7250ac7932abd6b0ff728","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/oh-package.json5":"f775dea82ef9174d67f008427680e088fbe674b611fff42a7056c6ff1542c3a3","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/oh-package.json5":"fdc6c95214ff88693da1086cff098c7c073b1548a21761f5fb0844bef21a3b36","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/oh-package.json5":"bb324b9522348c0ca44c46b395e30ea30a938053c2db2899d3fa1977ba87282f","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/oh-package.json5":"01c3e2cd9b541810a559d14d8f8e2e8253e42e6a853da18a8619fdd05377b3a5","/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/oh-package.json5":"11dd79fb30d8fc15465b9a01acff05c13add0e363e40b680b8d66e81beb6ba49","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/oh-package.json5":"c35b58f1303a6a735f774868cd01f3902771b508311f684407554c7c227ca795","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/oh-package.json5":"bbce10ceca5f24d9ca7d37d74365dc7e1e4d6b652be7cbf812032c8319b374ff","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/oh-package.json5":"198b1ce539c1bf0a76dafc50cbc6170a9ae7b1be42d4a0f4c2a3c8e54c35328a","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/oh-package.json5":"784d7c85105c0d2e4aafebefd59f8e9094a226473cffaf395f915d3d5a09e88b","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/oh-package.json5":"75979abb1c98d1113781389020b6b78027882390796bf68d8feeec1c9192cfb9","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/oh-package.json5":"ad8b6b5e15a92699ecb923e9e335aaa54fcf61e56abf7af66b0d3e3ead351ef2","/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/oh-package.json5":"c21d1178ea40f4ae12ee3faebac8505c01c4357e2de4ab49bce387caad338b7b","/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/oh-package.json5":"fbf02c010e1a5a94ee5873adf048e14f212d31e0315bad63fb7a304a325f7bd6","/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/oh-package.json5":"decf612013afa472c824afaa19760126d3eda6888d78e1a3ff36c2103c5f2ae2","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/oh-package.json5":"d97da2937394ff6322badaf510c3bf0d3094416778d9c0b0eab6f83e50963fc8","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/oh-package.json5":"676273bdd201bf0a125efb398aaf01a0e6b029795422d3cbb36ebfa3a068a641","/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/oh-package.json5":"c339d18d711cd918963e112b2181740afbfbc047560bb608122df859a96cb5af","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/oh-package.json5":"7651da80cfaf57d7443ab94dfc2f77273fa0c041742cc19257694a639ee51d01","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/oh-package.json5":"2e0d0eac90441fc5b093fe787586a3bdfed7314ec312a57fed2bbc0c6eddec15","/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/oh-package.json5":"5b03467bc2d7ad052bac532b511db6d0963211acb492fc7d8d485919b55ff51e","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/oh-package.json5":"57d6646a749bdb0546b35bb1278053b3ce9e0e758dc63d0b77600578eb4f02d9","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/oh-package.json5":"780b2c67235f3773c912d51782ca3b79a5e922c173240f3028468a674f798edb","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/oh-package.json5":"065d0bfc4c7603197f762b90ecc04d23c1172188b65b4fdd904e75f78cf5bac4","/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/oh-package.json5":"77afd5ad9ad5f7423e9876540ac9df30ecfb956947d0b0f904a97a5dd1a17f80","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/oh-package.json5":"aafb6858607224222ea22f3bb2884ffdc1243a34b40ef29bd788fb687847ae0b","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/oh-package.json5":"e5803a3bb80e47626c5bf8ec70a54b7318c690b532a725b43b472f9d870bd966","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/oh-package.json5":"179f4cc9dec2e1bc42f313837fbf4691f1b0cd1f70081c46131635144225ec2d","/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/oh-package.json5":"06e49bd3f7de439e56a260b1849ed246e13b8acab8f1f7ef2b1219fd4362cd37","/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/oh-package.json5":"1a8f166002e8b9aa63ef7964fe25efb2902a107248753bbb89d06e2321889251","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/oh-package.json5":"7e80fef97ffe0aba499c4eaea30a5d20fda212ebb3faa68f594955cb8bf5a0ef","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/oh-package.json5":"c19d539f21db46329ddbee7a484cc323b65ce54d6268a6962f0c56dfce62fb21","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/oh-package.json5":"604fb57d07467240bcc4ad0f7030e83cec467d172b370d0ca26677c7f579e6f5","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/oh-package.json5":"9cc49f65fb96ab42176083213fa354c5d49edb20ab3fa913abdffa99a96cd852","/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/oh-package.json5":"73d9e18a0b7a12e66e0e75604077c2193a20ffc68d97cb88b46e1e98fe65ab29","/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/oh-package.json5":"c7a4b12adaed041c41d2e6ed2003552c54078e37388d81e4523747f4127f9517","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/oh_modules":true},"CACHE_COMPILE_NATIVE_FILE_HASH-flutter_inappwebview_ohos":{"/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/compile_commands.json":"6b6dea5b7bec1db049fdf95a4dc5b5bdd93e62def9f590d22cb7badf6ab62279","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json":"0e0800107b15760ceab8f814dc4be632f423ed82b9b795b05cd77b6f06b3b974","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/cache-v2-b51cf72b416829c71425.json":"fddd58b30e5bc5ef257e03eca2b0d666e4abfd8ab4fdc12eaca2dcab6e1186f4","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-0176881e8938de7af595.json":"9d2211c3cb1c9e1e7d6be7abd44170cb7138c204c67085d374eaae14f5d00047","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-e9731e1b659776b72c80.json":"bf64198bcb9bf58d69a89895f13b13dad26a9102b2c22cf3c950551a621a7fea","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/index-2025-12-04T09-11-41-0858.json":"a01b917af67758eab581b2a259f48dab426a3cbd1d89ce14845d4626b4ba3977","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/target-entry-Debug-440cf3df56ee8ad863e9.json":"01ca560b1438944e4168b304cd62fbcbac409768aacbb25b55f23600966f6c11","SDK_LOCATION":"/Applications/DevEco-Studio.app/Contents/sdk"},"CACHE_COMPILE_NATIVE_FILE_HASH-video_compress":{"/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/compile_commands.json":"883f17d84f65dc8be9d975e4b03eac2d235e53f695a5fbef8dbe18c6b127a438","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-f7e1883063ffce417fde.json":"a3da8c3b7987005528faf5d76c53b517ff844b8b718211e793a9f037955984bd","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json":"b85fcc2dd0ce581cd3df83ef9f02309d458e2508ad2f3419b65d891925fba679","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/target-videocompress-Debug-51304022b9ac8e62279b.json":"9c0a36857a26ec90d5f5bea52bd4661c6b85da1616f40cb7c91f568341a89e52","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/index-2025-12-04T09-11-41-0863.json":"a6c0b784c8a06be92231f57bf0114ba395886dd8b725fa34a5e1d45e5a1964d2","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/cache-v2-44910ca12b605e826a07.json":"5c0cc12d7e56710fa05f1e9bb84c6cb0d752e5a69cee43e19b1223304bd1257f","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-5081b618cac2d22beb04.json":"99e5693730ef4fff2263178db605972057b778c84d0ad47333b59838ae8d492f","SDK_LOCATION":"/Applications/DevEco-Studio.app/Contents/sdk"}}
\ No newline at end of file
{"CACHE_SYNC_FILE_HASH":{"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/hvigor/hvigor-config.json5":"4db9fe38caab43d27ce17add1da16011ba02b414163ef51f6bf2c8f348cd446d","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/build-profile.json5":"9cd4daf72eb34b56bf218822a8e4c285dca26d54a10fdb1eb6fe173b3b6bae86","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/hvigorfile.ts":"79f9c46fa529cc91c4b6b5f9e95551adf4d39d2a3dfb354e274f246ddd9becd0","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh-package.json5":"48b92e8a5a63e8b7cd2bda3338b4bfefd776ccfa7a00de3d158846581b2b9dad","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build-profile.json5":"ae4315866e508818aab6fed7aa5ce855e685138a1e488d130284f44598375095","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/hvigorfile.ts":"f4cf617b24cde7f4ffb438e4dc717159f5ca09880f4cd6a4f0d134c24c604f2f","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/oh-package.json5":"1135a24c34638ba8bb90bb8daa92c196df256d337aad5c36efbbf752cd455654","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/build-profile.json5":"97ab09da84030e155895247c5e0ac45a91c5ea5bceddfb84029bea09df54b47f","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/hvigorfile.ts":"d6089e9bf847719a357dca0c88830f6834fd89c33f561474c6d6a57f2d9cff35","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/oh-package.json5":"01e01840fe922a7b1ce455f481b6a224377d929d88d1f3deb3d6013ea7be7e86","/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/build-profile.json5":"4994c4a67f7d9a039bb85d6ba7e0517f23ff714c0b73051c95db359c60f60907","/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/hvigorfile.ts":"61abd7096b281d0ace810cda44b241c582ae1f9a0d623c99cd1c9623b1bcc570","/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/oh-package.json5":"e989d73a8c83a80219019489beedeac11176ef522ec7250ac7932abd6b0ff728","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/build-profile.json5":"d89d9a07c2b440e7e8197f176116bce5688baaadb50f67c533770f1cd12302fb","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/hvigorfile.ts":"9bbe566435e39f9ad9c1618039df5b20e4ab07b863e3a526e115475733b2ca56","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/oh-package.json5":"f775dea82ef9174d67f008427680e088fbe674b611fff42a7056c6ff1542c3a3","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/build-profile.json5":"ebc7fd26c0c96938fae5f5997a6e0a55213b593f27835b356ec18471b14473ad","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/hvigorfile.ts":"774ccf982e505eac5c236c33c9c329783c08b32d33c4cbda78a85e794311e3c3","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/oh-package.json5":"1f9a0fd44cb83cb182cab9845a25e31471c50c76213162c30c00196d80f3ec48","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/build-profile.json5":"d0dbd671dd2d77bc6f283eec165122d83144bffbcec7cfd3a725429733521513","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/hvigorfile.ts":"648a777d67492790ae896ef2c611c94851427fa59df44f8aa8c46a5f2758701d","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/oh-package.json5":"bb324b9522348c0ca44c46b395e30ea30a938053c2db2899d3fa1977ba87282f","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/build-profile.json5":"f3adab0262e2142b1083a41758939705ea1497a326bc819c9b3de0ee56f57559","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/hvigorfile.ts":"ae91ddcced71091a2b1b90cb113fca6ca4391c8c67dfb062dd5d8c84c1459b9f","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/oh-package.json5":"01c3e2cd9b541810a559d14d8f8e2e8253e42e6a853da18a8619fdd05377b3a5","/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/build-profile.json5":"1735496c3e441ca38f83defac5243a36be13af43da0c2ee5896722a9bc21e8a9","/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/hvigorfile.ts":"7bf6d1527b4bb236776cff9bd7283084ea027e4831a1b1c2feca8546d850ee0f","/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/oh-package.json5":"11dd79fb30d8fc15465b9a01acff05c13add0e363e40b680b8d66e81beb6ba49","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/build-profile.json5":"4bf7e8dd60eecd4e4f1195f263480a5af953eaa8ce0394d5d883276e513cc5c6","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/hvigorfile.ts":"4cdba00aa15e9ad398585ae581c7939ff042e273841577c533429c52a7565df2","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/oh-package.json5":"c35b58f1303a6a735f774868cd01f3902771b508311f684407554c7c227ca795","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/build-profile.json5":"8b66bc386e37e21bfb1c686d6e0061bc0ce268f683a7bc60b77b256e871987b5","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/hvigorfile.ts":"f464228a326831f8850a1c94adb37adfac6a2aa28a76a203b2b16ef973f0ee80","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/oh-package.json5":"bbce10ceca5f24d9ca7d37d74365dc7e1e4d6b652be7cbf812032c8319b374ff","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/build-profile.json5":"7071ae10423a83c4ffcfa958b1b34901d481d9b0be6bd88b08d01f479b1d9df5","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/hvigorfile.ts":"a620b7c507be1f848e158970162fa373312713c982111f28d164544bc7c4949e","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/oh-package.json5":"198b1ce539c1bf0a76dafc50cbc6170a9ae7b1be42d4a0f4c2a3c8e54c35328a","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/build-profile.json5":"40913f7e88b3017339347106f9de25aca3901b0de4bc41bc155e8c12ec8b2013","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/hvigorfile.ts":"447b52dceec5684873b1a27886ca2699ca9e17c9684cf5f51686d16b2d958025","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/oh-package.json5":"784d7c85105c0d2e4aafebefd59f8e9094a226473cffaf395f915d3d5a09e88b","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/build-profile.json5":"2d8d3340a7335ef679ed421e947187c492c4403c3393301a7f7f518c00302865","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/hvigorfile.ts":"843d340ff6d718e9873876a0b825b79c04988a5db6eee667c544586eea683048","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/oh-package.json5":"75979abb1c98d1113781389020b6b78027882390796bf68d8feeec1c9192cfb9","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/build-profile.json5":"047a11b2478a1ab112aaf2b51456edd92c9dc8e02302fce091b8500ead821017","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/hvigorfile.ts":"d879317c8988729603d8168d7a53771631b7289c69afa382cd59d6cbf3dd563d","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/oh-package.json5":"ad8b6b5e15a92699ecb923e9e335aaa54fcf61e56abf7af66b0d3e3ead351ef2","/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/build-profile.json5":"1abcc90ae2a72599fc603726219d725b0e262c8435a58dd01e98a3f04cc9f684","/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/hvigorfile.ts":"10126efced0e8d43ac145730e852ee148488e26da0554d1c2bcf8e8f51d170c8","/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/oh-package.json5":"c21d1178ea40f4ae12ee3faebac8505c01c4357e2de4ab49bce387caad338b7b","/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/build-profile.json5":"59dcbf0b10dbb0dba143bd08be45cd0ad258b42b4521151812332b25ca871758","/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/hvigorfile.ts":"9f9f200b8b5cdbdc137d2cfb09933d52866c2c614c053c934d814fb66e1f1235","/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/oh-package.json5":"fbf02c010e1a5a94ee5873adf048e14f212d31e0315bad63fb7a304a325f7bd6","/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/build-profile.json5":"265475c563e420ff468348fba234c7739074088e8119f00bb51e83bebbbf8094","/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/hvigorfile.ts":"fde1f438c2520f70a5d3ffa5949cac974eda317e38333cb732f8a290ba0b64a3","/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/oh-package.json5":"decf612013afa472c824afaa19760126d3eda6888d78e1a3ff36c2103c5f2ae2","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/build-profile.json5":"ff50f039529292bd60666ab21c4b732c686f1cb06638a388abd42189ce6aef4e","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/hvigorfile.ts":"6b014bc61092c8e39d62c7ea90e9f5438c28d2683e3849328daec411fdbb22df","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/oh-package.json5":"d97da2937394ff6322badaf510c3bf0d3094416778d9c0b0eab6f83e50963fc8","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/build-profile.json5":"abad9efe0028f075005ec22bf3552178c382748a053dad3898af38aeb2c1649d","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/hvigorfile.ts":"ddd20e5189b02bef9b8d99d5cf5bf01055b13dee78b0ad4dd3c29e43f8d14b48","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/oh-package.json5":"676273bdd201bf0a125efb398aaf01a0e6b029795422d3cbb36ebfa3a068a641","/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/build-profile.json5":"44c34e9eb1ebcac50750e134d5bb4e43c45112a5098328dadd353f3bfce5da97","/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/hvigorfile.ts":"1d374bac80d06618700603feeb6902b3f52d742f82d36a568563da93928a2526","/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/oh-package.json5":"c339d18d711cd918963e112b2181740afbfbc047560bb608122df859a96cb5af","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/build-profile.json5":"c7a4fa6fa7d602f81441d68166fed5a7a5c9c68473acdfe8229e44a4299b6491","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/hvigorfile.ts":"c0875d49bfdab850f20f6af203ed4a5a3691ba4878922507f96728bca17a8627","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/oh-package.json5":"7651da80cfaf57d7443ab94dfc2f77273fa0c041742cc19257694a639ee51d01","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/build-profile.json5":"c98468006609f08c2e92d88ab2f43798885e6f034fd090957d589cd466a86ab6","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/hvigorfile.ts":"608687a420762649e09da9eca73cc807f9ff19b177f8646722f839eae5acc25c","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/oh-package.json5":"2e0d0eac90441fc5b093fe787586a3bdfed7314ec312a57fed2bbc0c6eddec15","/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/build-profile.json5":"5c3c15fe25b681e51e73e1bf9000ba31c0c637261a3b32aba9b0661a8f5aef9d","/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/hvigorfile.ts":"1b85d12725ca678ac8b014f03b41f9f30ac2f511af398cf57c676a76a657bfea","/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/oh-package.json5":"5b03467bc2d7ad052bac532b511db6d0963211acb492fc7d8d485919b55ff51e","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/build-profile.json5":"96306a2f5494603535f415c9ddf2a034839bd1d603147a9511ff84512faee730","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/hvigorfile.ts":"9089a7a8bc203c9246543fc9e7a8f42950ef925bf83f2d29fed6733581ae5417","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/oh-package.json5":"57d6646a749bdb0546b35bb1278053b3ce9e0e758dc63d0b77600578eb4f02d9","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/build-profile.json5":"7eaad5d735a91382b9bb35f1d1a249622d610f181a39c4717ec475dbd172fd4a","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/hvigorfile.ts":"e1240238aef5b5359f80d33f7234c4bfe3015bd891e27ed67347235120480689","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/oh-package.json5":"780b2c67235f3773c912d51782ca3b79a5e922c173240f3028468a674f798edb","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/build-profile.json5":"7b7ea00d6ae0ede6197c2292f89e5bc28f9d7f9d46b8a2235cc8364d17eb714a","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/hvigorfile.ts":"a4bebb57dcb1825f368214f6063c5dfbe6e14a58f24ab97449792d9b244ae16e","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/oh-package.json5":"065d0bfc4c7603197f762b90ecc04d23c1172188b65b4fdd904e75f78cf5bac4","/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/build-profile.json5":"ef931324ba1766acc549b58c471e8ebdadb05f0f2e01f60da76c525136d8d906","/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/hvigorfile.ts":"a1df738b7ca4529f9ff4bf42ef64eaedc7b2edfbb7c67b4ff1bc5338ec4a0fbb","/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/oh-package.json5":"77afd5ad9ad5f7423e9876540ac9df30ecfb956947d0b0f904a97a5dd1a17f80","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/build-profile.json5":"2f6ce9218177ba9f23e2b35611f35c4b7fb06f864d8efb3d52d64cdcd6d79bfd","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/hvigorfile.ts":"09e07ff1dc6f1c4ea6547fdc72aa3cecb7ed00982a874e3536c27dd90e000521","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/oh-package.json5":"aafb6858607224222ea22f3bb2884ffdc1243a34b40ef29bd788fb687847ae0b","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/build-profile.json5":"6caab2671ca158d5de237f252d812bd458751734171deb9b22cf560009f0e9be","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/hvigorfile.ts":"1b5ddcba966d31f10be7850f5e8a2ee774eb8bcddcb4fbf936273f7f6df48277","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/oh-package.json5":"cbe8a2df34660e65ae907a7fc8f3a92a4e4c27d67158a1fcae6ae13784238821","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/build-profile.json5":"24f00db242396070c64b0b881bd9328e7f259e4e6768cf1f75743c0efbf9e727","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/hvigorfile.ts":"b0e80f86c0a2d88dc9a51f8c2e7d829644c6c447f7529efbe0d998c06e756949","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/oh-package.json5":"179f4cc9dec2e1bc42f313837fbf4691f1b0cd1f70081c46131635144225ec2d","/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/build-profile.json5":"a7ecb699242346828ae533ecf85cd8859fa49af6a884555d33aea6945d179c51","/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/hvigorfile.ts":"6a3db9dfb2e982df336f18c923c4cac8eb8c52b6b36032e8936c6e94ce3bada6","/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/oh-package.json5":"06e49bd3f7de439e56a260b1849ed246e13b8acab8f1f7ef2b1219fd4362cd37","/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/build-profile.json5":"08d091a224cb8eaa38425d45a1ab3e0e141528fd0aaa9b42b01f973b30e70939","/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/hvigorfile.ts":"03d5d00801cc3b0f61c902b393d657449de9df775b5658ed364fd5fc43a250eb","/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/oh-package.json5":"1a8f166002e8b9aa63ef7964fe25efb2902a107248753bbb89d06e2321889251","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/build-profile.json5":"c0a6eb947fb54ce00787d592d7ab77c200a9eb05364911ada4d092938b7ab2c3","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/hvigorfile.ts":"11f2c8284e98c0495ddfd45df2d9b2fb5aeedcb86d8ab971bbed00132c573249","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/oh-package.json5":"7e80fef97ffe0aba499c4eaea30a5d20fda212ebb3faa68f594955cb8bf5a0ef","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/build-profile.json5":"c6052ea754174d65c21204fa3c6f3c2b7f05c192953673bdf9085ab8714e7d42","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/hvigorfile.ts":"c2de76f1cbbd41f55fc078731bf0d8da149f02429c7b06eafafb28ab344584cf","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/oh-package.json5":"c19d539f21db46329ddbee7a484cc323b65ce54d6268a6962f0c56dfce62fb21","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/build-profile.json5":"75bbfbbc3e44cbd69de766ca919880276fed02bd0879788e2b4bf1cf329a4648","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/hvigorfile.ts":"bc9c145c534ad408cb9b654a3f01d2d4712fa3cb2029447109003122cea0f902","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/oh-package.json5":"604fb57d07467240bcc4ad0f7030e83cec467d172b370d0ca26677c7f579e6f5","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/build-profile.json5":"706e3923a617c303b99d0daa2dadc231176bcbd23846ddcccd63f60740236d09","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/hvigorfile.ts":"26a021597b0fc6fe5e4cb5520a550d9962f1da2477453ff2ab767de608194e8e","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/oh-package.json5":"9cc49f65fb96ab42176083213fa354c5d49edb20ab3fa913abdffa99a96cd852","/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/build-profile.json5":"d27b7ca5e08dbbe319e4f13d14ad99b0ca346aa69593f11e52d85e42903349af","/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/hvigorfile.ts":"58c5e9996b78229eb92d71f5eb821ebf4c30de6545bed117b1a2716a6923081b","/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/oh-package.json5":"73d9e18a0b7a12e66e0e75604077c2193a20ffc68d97cb88b46e1e98fe65ab29","/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/build-profile.json5":"bba2b7350e3d9661d1c4ce1855a38d5e729c59fc02833e069191f233ffd21a78","/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/hvigorfile.ts":"c5e795fdd1366cc79f38bba9377088416122d9840c87861282e90fc907cfa419","/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/oh-package.json5":"c7a4b12adaed041c41d2e6ed2003552c54078e37388d81e4523747f4127f9517","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/.hvigor/outputs/sync/output.json":"01c55d93e86f3cca9c47186e060c67be56aa680cbd29cebe1082c388df77215c","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/hvigorconfig.ts":"f6f79581211a3da7ef47733b9bd4f8d16fa41eb22765b5cbb5f6bd8d71489753","SDK_LOCATION":"/Applications/DevEco-Studio.app/Contents/sdk"},"OHPM_INSTALL_FILE_HASH":{"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh-package.json5":"48b92e8a5a63e8b7cd2bda3338b4bfefd776ccfa7a00de3d158846581b2b9dad","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/lock.json5":"29450fb9d7559847e63a75cfa87ffa6a9511565088c686f7a7f8bc083da57c21","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/oh-package.json5":"1135a24c34638ba8bb90bb8daa92c196df256d337aad5c36efbbf752cd455654","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/oh-package.json5":"01e01840fe922a7b1ce455f481b6a224377d929d88d1f3deb3d6013ea7be7e86","/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/oh-package.json5":"e989d73a8c83a80219019489beedeac11176ef522ec7250ac7932abd6b0ff728","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/oh-package.json5":"f775dea82ef9174d67f008427680e088fbe674b611fff42a7056c6ff1542c3a3","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/oh-package.json5":"1f9a0fd44cb83cb182cab9845a25e31471c50c76213162c30c00196d80f3ec48","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/oh-package.json5":"bb324b9522348c0ca44c46b395e30ea30a938053c2db2899d3fa1977ba87282f","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/oh-package.json5":"01c3e2cd9b541810a559d14d8f8e2e8253e42e6a853da18a8619fdd05377b3a5","/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/oh-package.json5":"11dd79fb30d8fc15465b9a01acff05c13add0e363e40b680b8d66e81beb6ba49","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/oh-package.json5":"c35b58f1303a6a735f774868cd01f3902771b508311f684407554c7c227ca795","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/oh-package.json5":"bbce10ceca5f24d9ca7d37d74365dc7e1e4d6b652be7cbf812032c8319b374ff","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/oh-package.json5":"198b1ce539c1bf0a76dafc50cbc6170a9ae7b1be42d4a0f4c2a3c8e54c35328a","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/oh-package.json5":"784d7c85105c0d2e4aafebefd59f8e9094a226473cffaf395f915d3d5a09e88b","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/oh-package.json5":"75979abb1c98d1113781389020b6b78027882390796bf68d8feeec1c9192cfb9","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/oh-package.json5":"ad8b6b5e15a92699ecb923e9e335aaa54fcf61e56abf7af66b0d3e3ead351ef2","/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/oh-package.json5":"c21d1178ea40f4ae12ee3faebac8505c01c4357e2de4ab49bce387caad338b7b","/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/oh-package.json5":"fbf02c010e1a5a94ee5873adf048e14f212d31e0315bad63fb7a304a325f7bd6","/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/oh-package.json5":"decf612013afa472c824afaa19760126d3eda6888d78e1a3ff36c2103c5f2ae2","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/oh-package.json5":"d97da2937394ff6322badaf510c3bf0d3094416778d9c0b0eab6f83e50963fc8","/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/oh-package.json5":"676273bdd201bf0a125efb398aaf01a0e6b029795422d3cbb36ebfa3a068a641","/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/oh-package.json5":"c339d18d711cd918963e112b2181740afbfbc047560bb608122df859a96cb5af","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/oh-package.json5":"7651da80cfaf57d7443ab94dfc2f77273fa0c041742cc19257694a639ee51d01","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/oh-package.json5":"2e0d0eac90441fc5b093fe787586a3bdfed7314ec312a57fed2bbc0c6eddec15","/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/oh-package.json5":"5b03467bc2d7ad052bac532b511db6d0963211acb492fc7d8d485919b55ff51e","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/oh-package.json5":"57d6646a749bdb0546b35bb1278053b3ce9e0e758dc63d0b77600578eb4f02d9","/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/oh-package.json5":"780b2c67235f3773c912d51782ca3b79a5e922c173240f3028468a674f798edb","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/oh-package.json5":"065d0bfc4c7603197f762b90ecc04d23c1172188b65b4fdd904e75f78cf5bac4","/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/oh-package.json5":"77afd5ad9ad5f7423e9876540ac9df30ecfb956947d0b0f904a97a5dd1a17f80","/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/oh-package.json5":"aafb6858607224222ea22f3bb2884ffdc1243a34b40ef29bd788fb687847ae0b","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/oh-package.json5":"cbe8a2df34660e65ae907a7fc8f3a92a4e4c27d67158a1fcae6ae13784238821","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/oh-package.json5":"179f4cc9dec2e1bc42f313837fbf4691f1b0cd1f70081c46131635144225ec2d","/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/oh-package.json5":"06e49bd3f7de439e56a260b1849ed246e13b8acab8f1f7ef2b1219fd4362cd37","/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/oh-package.json5":"1a8f166002e8b9aa63ef7964fe25efb2902a107248753bbb89d06e2321889251","/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/oh-package.json5":"7e80fef97ffe0aba499c4eaea30a5d20fda212ebb3faa68f594955cb8bf5a0ef","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/oh-package.json5":"c19d539f21db46329ddbee7a484cc323b65ce54d6268a6962f0c56dfce62fb21","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/oh-package.json5":"604fb57d07467240bcc4ad0f7030e83cec467d172b370d0ca26677c7f579e6f5","/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/oh-package.json5":"9cc49f65fb96ab42176083213fa354c5d49edb20ab3fa913abdffa99a96cd852","/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/oh-package.json5":"73d9e18a0b7a12e66e0e75604077c2193a20ffc68d97cb88b46e1e98fe65ab29","/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/oh-package.json5":"c7a4b12adaed041c41d2e6ed2003552c54078e37388d81e4523747f4127f9517","/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/oh_modules":false,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/image_picker/image_picker_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/path_provider/path_provider_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.3/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/shared_preferences/shared_preferences_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos/oh_modules":true,"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/url_launcher/url_launcher_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-c616a4054ea1fff0154d0e79d19847a4af42d6d3/packages/video_player/video_player_ohos/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos/oh_modules":true,"/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos/oh_modules":true},"CACHE_COMPILE_NATIVE_FILE_HASH-flutter_inappwebview_ohos":{"/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/compile_commands.json":"6b6dea5b7bec1db049fdf95a4dc5b5bdd93e62def9f590d22cb7badf6ab62279","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json":"0e0800107b15760ceab8f814dc4be632f423ed82b9b795b05cd77b6f06b3b974","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/cache-v2-b51cf72b416829c71425.json":"fddd58b30e5bc5ef257e03eca2b0d666e4abfd8ab4fdc12eaca2dcab6e1186f4","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-0176881e8938de7af595.json":"9d2211c3cb1c9e1e7d6be7abd44170cb7138c204c67085d374eaae14f5d00047","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-e9731e1b659776b72c80.json":"bf64198bcb9bf58d69a89895f13b13dad26a9102b2c22cf3c950551a621a7fea","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/index-2025-12-04T09-11-41-0858.json":"a01b917af67758eab581b2a259f48dab426a3cbd1d89ce14845d4626b4ba3977","/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/target-entry-Debug-440cf3df56ee8ad863e9.json":"01ca560b1438944e4168b304cd62fbcbac409768aacbb25b55f23600966f6c11","SDK_LOCATION":"/Applications/DevEco-Studio.app/Contents/sdk"},"CACHE_COMPILE_NATIVE_FILE_HASH-video_compress":{"/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/compile_commands.json":"883f17d84f65dc8be9d975e4b03eac2d235e53f695a5fbef8dbe18c6b127a438","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-f7e1883063ffce417fde.json":"a3da8c3b7987005528faf5d76c53b517ff844b8b718211e793a9f037955984bd","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json":"b85fcc2dd0ce581cd3df83ef9f02309d458e2508ad2f3419b65d891925fba679","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/target-videocompress-Debug-51304022b9ac8e62279b.json":"9c0a36857a26ec90d5f5bea52bd4661c6b85da1616f40cb7c91f568341a89e52","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/index-2025-12-04T09-11-41-0863.json":"a6c0b784c8a06be92231f57bf0114ba395886dd8b725fa34a5e1d45e5a1964d2","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/cache-v2-44910ca12b605e826a07.json":"5c0cc12d7e56710fa05f1e9bb84c6cb0d752e5a69cee43e19b1223304bd1257f","/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/.cxx/default/default/debug/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-5081b618cac2d22beb04.json":"99e5693730ef4fff2263178db605972057b778c84d0ad47333b59838ae8d492f","SDK_LOCATION":"/Applications/DevEco-Studio.app/Contents/sdk"}}
\ No newline at end of file
... ...
... ... @@ -2570,11 +2570,11 @@
"material": {
"certpath": "/Users/wangdongni/.ohos/config/default_ohos_2S06nxqilWrDTPtvI7F-JkRR6ROtMIXW-BDj0hePRU8=.cer",
"keyAlias": "debugKey",
"keyPassword": "0000001BA47ABD26DF483D4C352E0823ACE2C6548F6F7596EE90D4856B5B193CE6FA436545C827136C1E00",
"keyPassword": "0000001B468B4530D959CC1954B6FDD96247D23EBAA743A914DDA719CEC064E53EA8D853ED1C46B229F5CA",
"profile": "/Users/wangdongni/.ohos/config/default_ohos_2S06nxqilWrDTPtvI7F-JkRR6ROtMIXW-BDj0hePRU8=.p7b",
"signAlg": "SHA256withECDSA",
"storeFile": "/Users/wangdongni/.ohos/config/default_ohos_2S06nxqilWrDTPtvI7F-JkRR6ROtMIXW-BDj0hePRU8=.p12",
"storePassword": "0000001BAB92E8F8EB9E3F1F86DC5A37E44B39AFA7542098448AD90C8350655D362FFF9D2632712C13FDA7"
"storePassword": "0000001B564D33A91E134162B0C221C8D8165DDB2C9C815A1BC574E88F90F7D4DAD0FBB036A5FFFEF7339F"
}
}
],
... ...
... ... @@ -5,13 +5,13 @@
"name": "default",
"type": "HarmonyOS",
"material": {
"certpath": "/Users/wangdongni/.ohos/config/default_ohos_2S06nxqilWrDTPtvI7F-JkRR6ROtMIXW-BDj0hePRU8=.cer",
"keyAlias": "debugKey",
"keyPassword": "0000001BA47ABD26DF483D4C352E0823ACE2C6548F6F7596EE90D4856B5B193CE6FA436545C827136C1E00",
"profile": "/Users/wangdongni/.ohos/config/default_ohos_2S06nxqilWrDTPtvI7F-JkRR6ROtMIXW-BDj0hePRU8=.p7b",
"storeFile": "/Users/wangdongni/Desktop/纳级资料/A-鸿蒙证书/keyStore.p12",
"storePassword": "0000001DBA8401CB89E753DF2EC0995E799D440B8D609D1F82E62CDBEFA689F7D9AB0C75FD9AD15FBCFFACEC3D",
"keyAlias": "Alias1",
"keyPassword": "0000001DC03037FB2602C242C8C69EDEB3FF4DFF74079E45ED5ECBACE7F1EF6278A60A16887DC079745B658C0E",
"signAlg": "SHA256withECDSA",
"storeFile": "/Users/wangdongni/.ohos/config/default_ohos_2S06nxqilWrDTPtvI7F-JkRR6ROtMIXW-BDj0hePRU8=.p12",
"storePassword": "0000001BAB92E8F8EB9E3F1F86DC5A37E44B39AFA7542098448AD90C8350655D362FFF9D2632712C13FDA7"
"profile": "/Users/wangdongni/Desktop/纳级资料/A-鸿蒙证书/ 发布证书/distribution_profile_fabuRelease.p7b",
"certpath": "/Users/wangdongni/Desktop/纳级资料/A-鸿蒙证书/ 发布证书/distribution_new.cer"
}
}
],
... ... @@ -19,17 +19,10 @@
{
"name": "default",
"signingConfig": "default",
"compatibleSdkVersion": "5.0.0(12)",
"compatibleSdkVersion": "6.0.0(20)",
"runtimeOS": "HarmonyOS",
"targetSdkVersion": "6.0.0(20)",
"buildOption": {
"strictMode": {
"caseSensitiveCheck": true,
"useNormalizedOHMUrl": true,
"duplicateDependencyCheck": false
}
}
},
"targetSdkVersion": "6.0.0(20)"
}
],
"buildModeSet": [
{
... ...
{"compileConfig":{"deviceType":"default","buildMode":"debug","compilerType":"ark","note":"false","logLevel":"3","hapMode":"false","img2bin":"true","PATH":"/Applications/DevEco-Studio.app/Contents/tools/node/bin/","projectProfilePath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/build-profile.json5","localPropertiesPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/local.properties","appResource":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build/default/intermediates/res/default/ResourceTable.txt","cachePath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build/default/cache/default/default@CompileArkTS/esmodule/debug","aceBuildJson":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build/default/intermediates/loader/default/loader.json","aceModuleJsonPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build/default/intermediates/res/default/module.json","aceSoPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build/default/intermediates/loader_out/default/nativeDependencies.txt","aceModuleRoot":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/src/main/ets","aceModuleBuild":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build/default/intermediates/loader_out/default/ets","aceProfilePath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build/default/intermediates/res/default/resources/base/profile","aceSuperVisualPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/src/main/supervisual","watchMode":"false"},"patchConfig":{"changedFileList":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/entry/build/default/intermediates/patch/default/changedFileList.json"}}
\ No newline at end of file
import AudioplayersPlugin from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/AudioplayersPlugin&1.0.0";
export default AudioplayersPlugin;
import type media from "@ohos:multimedia.media";
import type audio from "@ohos:multimedia.audio";
export default class AudioContextOhos {
rendererFlags: number = 0;
usageType: number = 1;
isSpeakerphoneOn: boolean = true;
audioScene: number = 0;
stayAwake: boolean = false;
copy(): AudioContextOhos {
let context = new AudioContextOhos();
context.rendererFlags = this.rendererFlags;
context.usageType = this.usageType;
context.isSpeakerphoneOn = this.isSpeakerphoneOn;
context.audioScene = this.audioScene;
context.stayAwake = this.stayAwake;
return context;
}
setAttributesOnPlayer(mediaPlayer: media.AVPlayer) {
mediaPlayer.audioRendererInfo = {
content: 2,
usage: this.usageType, rendererFlags: this.rendererFlags
};
}
buildAttributes(): audio.AudioRendererInfo {
return {
content: 2,
usage: this.usageType,
rendererFlags: this.rendererFlags
};
}
equals(context: AudioContextOhos) {
return context.rendererFlags == this.rendererFlags && context.usageType == this.usageType;
}
}
import type { FlutterPlugin, FlutterPluginBinding } from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
import MethodChannel from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel&1.0.0-2317265cd5";
import type { MethodResult } from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel&1.0.0-2317265cd5";
import type { EventSink, StreamHandler } from '@ohos/flutter_ohos/src/main/ets/plugin/common/EventChannel';
import type MethodCall from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodCall';
import { EventChannel, Log } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { AbilityAware, AbilityPluginBinding, BinaryMessenger } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import HashMap from "@ohos:util.HashMap";
import AudioContextOhos from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/AudioContextOhos&1.0.0";
import { SoundPoolManager } from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/player/SoundPoolPlayer&1.0.0";
import WrappedPlayer from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/player/WrappedPlayer&1.0.0";
import audio from "@ohos:multimedia.audio";
import UrlSource from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/source/UrlSource&1.0.0";
import BytesSource from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/source/BytesSource&1.0.0";
import { parseReleaseMode } from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/ReleaseMode&1.0.0";
import { parsePlayerMode } from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/PlayerMode&1.0.0";
import type { WantAgent as WantAgent } from "@ohos:app.ability.wantAgent";
import wantAgent from "@ohos:app.ability.wantAgent";
import backgroundTaskManager from "@ohos:resourceschedule.backgroundTaskManager";
import type { BusinessError as BusinessError } from "@ohos:base";
import AVSessionManager from "@ohos:multimedia.avsession";
const TAG = "AudioplayersPlugin";
export default class AudioplayersPlugin implements FlutterPlugin, AbilityAware, IUpdateCallback {
private methods?: MethodChannel = undefined;
private globalMethods?: MethodChannel = undefined;
private globalEvents?: EventHandler = undefined;
private context?: Context = undefined;
private binaryMessenger?: BinaryMessenger = undefined;
private soundPoolManager?: SoundPoolManager = undefined;
private players = new HashMap<string, WrappedPlayer>();
private defaultAudioContext = new AudioContextOhos();
private updateInterval: number | null = null;
private abilityBinding?: AbilityPluginBinding = undefined;
private session?: AVSessionManager.AVSession = undefined;
private isStartContinuousTask = false;
getUniqueClassName(): string {
return "AudioplayersPlugin";
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.context = binding.getApplicationContext();
this.binaryMessenger = binding.getBinaryMessenger();
this.soundPoolManager = new SoundPoolManager(this);
this.methods = new MethodChannel(binding.getBinaryMessenger(), "xyz.luan/audioplayers");
this.methods.setMethodCallHandler({
onMethodCall: (call: MethodCall, result: MethodResult) => {
this.methodCall(call, result);
}
});
this.globalMethods = new MethodChannel(binding.getBinaryMessenger(), "xyz.luan/audioplayers.global");
this.globalMethods.setMethodCallHandler({
onMethodCall: (call: MethodCall, result: MethodResult) => {
this.globalMethodCall(call, result);
}
});
this.globalEvents = new EventHandler(new EventChannel(binding.getBinaryMessenger(), "xyz.luan/audioplayers.global/events"));
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
this.stopUpdates();
this.players.forEach((value: WrappedPlayer, key: string) => value.dispose());
this.players.clear();
this.soundPoolManager?.dispose();
this.globalEvents?.dispose();
this.stopUpdates();
}
private globalMethodCall(call: MethodCall, result: MethodResult): void {
switch (call.method) {
case "setAudioContext":
// TODO 没有相关API
//let audioManager = this.getAudioManager()
//audioManager.mode = defaultAudioContext.audioMode
//audioManager.isSpeakerphoneOn = defaultAudioContext.isSpeakerphoneOn
this.defaultAudioContext = this.getAudioContext(call);
break;
case "emitLog":
let message = this.getObjectValue(call, "message", "message is required") as string;
this.handleGlobalLog(message);
break;
case "emitError":
let code = this.getObjectValue(call, "code", "code is required") as string;
message = this.getObjectValue(call, "message", "message is required") as string;
this.handleGlobalError(code, message, null);
break;
default:
result.notImplemented();
break;
}
}
private async methodCall(call: MethodCall, response: MethodResult) {
let playerId = call.argument("playerId") as string;
if (playerId == null || playerId == undefined) {
response.success(1);
return;
}
try {
if (call.method == "create") {
let eventHandler = new EventHandler(new EventChannel(this.binaryMessenger!, `xyz.luan/audioplayers/events/${playerId}`));
this.players.set(playerId, new WrappedPlayer(this, eventHandler, this.defaultAudioContext.copy(), this.soundPoolManager!));
response.success(1);
return;
}
let player = this.getPlayer(playerId);
if (player == null) {
response.error("OhosAudioError", "not find player", Error("not find player"));
return;
}
switch (call.method) {
case "setSourceUrl":
let url = this.getObjectValue(call, "url", "url is required") as string;
let isLocal = call.hasArgument("isLocal") ? (call.argument("isLocal") as boolean) : false;
await player!.setSource(new UrlSource(url, isLocal));
break;
case "setSourceBytes":
let bytes = this.getObjectValue(call, "bytes", "bytes are required") as ArrayBuffer;
player.setSource(new BytesSource(bytes));
break;
case "resume":
player.play();
break;
case "pause":
player.pause();
break;
case "stop":
player.stop();
break;
case "release":
player.release();
break;
case "seek":
let position = this.getObjectValue(call, "position", "position is required") as number;
player.seek(position);
break;
case "setVolume":
let volume = this.getObjectValue(call, "volume", "volume is required") as number;
player.setVolume(volume);
break;
case "setBalance":
let balance = this.getObjectValue(call, "balance", "balance is required") as number;
player.setBalance(balance);
break;
case "setPlaybackRate":
let rate = this.getObjectValue(call, "playbackRate", "playbackRate is required") as number;
player.setRate(rate);
break;
case "getDuration":
let duration = player.getDuration();
response.success(duration ? duration : 0);
return;
case "getCurrentPosition":
let postion = player.getCurrentPosition();
response.success(postion ? postion : 0);
return;
case "setReleaseMode":
let releaseMode = this.getObjectValue(call, "releaseMode", "releaseMode is required") as string;
player.setReleaseMode(parseReleaseMode(releaseMode));
break;
case "setPlayerMode":
let playerMode = this.getObjectValue(call, "playerMode", "playerMode is required") as string;
player.setPlayerMode(parsePlayerMode(playerMode));
break;
case "setAudioContext":
let audioContext = this.getAudioContext(call);
player.updateAudioContext(audioContext);
break;
case "emitLog":
let message = this.getObjectValue(call, "message", "message is required") as string;
player.handleLog(message);
break;
case "emitError":
let code = this.getObjectValue(call, "code", "code is required") as string;
message = this.getObjectValue(call, "message", "message is required") as string;
player.handleError(code, message, null);
break;
case "dispose":
player.dispose();
this.players.remove(playerId);
break;
default:
response.notImplemented();
return;
}
response.success(1);
}
catch (e) {
response.error("OhosAudioError", e.message, e);
}
}
private getPlayer(playerId: string): WrappedPlayer | null {
if (this.players.hasKey(playerId)) {
return this.players.get(playerId);
}
this.error("Player has not yet been created or has already been disposed.");
return null;
}
getApplicationContext(): Context {
return this.context!;
}
getAudioManager(): audio.AudioManager {
return audio.getAudioManager();
}
handleIsPlaying() {
this.startUpdates();
}
handleDuration(player: WrappedPlayer) {
let map = new Map<string, number>();
let dutraion = player.getDuration();
map.set("value", dutraion ? dutraion : 0);
player.eventHandler.success("audio.onDuration", map);
}
handleComplete(player: WrappedPlayer) {
player.eventHandler.success("audio.onComplete");
}
handlePrepared(player: WrappedPlayer, isPrepared: boolean) {
let map = new Map<string, boolean>();
map.set("value", isPrepared);
player.eventHandler.success("audio.onPrepared", map);
}
handleLog(player: WrappedPlayer, message: string) {
let map = new Map<string, string>();
map.set("value", message);
player.eventHandler.success("audio.onLog", map);
}
handleGlobalLog(message: string) {
let map = new Map<string, string>();
map.set("value", message);
this.globalEvents!.success("audio.onLog", map);
}
handleError(player: WrappedPlayer, errorCode?: string, errorMessage?: string, errorDetails?: any) {
player.eventHandler.error(errorCode, errorMessage, errorDetails);
}
handleGlobalError(errorCode?: string, errorMessage?: string, errorDetails?: any) {
this.globalEvents!.error(errorCode, errorMessage, errorDetails);
}
handleSeekComplete(player: WrappedPlayer) {
let map = new Map<string, number>();
let position = player.getCurrentPosition();
map.set("value", position ? position : 0);
player.eventHandler.success("audio.onSeekComplete");
player.eventHandler.success("audio.onCurrentPosition", map);
}
startUpdates() {
this.stopUpdates();
this.updateInterval = setInterval(() => {
this.updateCallback();
}, 200);
}
stopUpdates() {
if (this.updateInterval) {
clearInterval(this.updateInterval);
this.updateInterval = null;
}
}
private updateCallback() {
let mediaPlayers = this.players;
let channel = this.methods;
if (mediaPlayers == null || channel == null) {
this.stopUpdates();
return;
}
let isAnyPlaying = false;
mediaPlayers.forEach((player: WrappedPlayer, key: string) => {
if (player.isActuallyPlaying()) {
isAnyPlaying = true;
let time = player.getCurrentPosition();
let map = new Map<string, number>();
map.set("value", time ? time : 0);
player.eventHandler.success("audio.onCurrentPosition", map);
}
});
if (!isAnyPlaying) {
this.stopUpdates();
}
}
private getAudioContext(call: MethodCall): AudioContextOhos {
let contextOhos = new AudioContextOhos();
contextOhos.isSpeakerphoneOn = this.getObjectValue(call, "isSpeakerphoneOn", "isSpeakerphoneOn is required") as boolean;
contextOhos.rendererFlags = this.getObjectValue(call, "rendererFlags", "rendererFlags is required") as number;
contextOhos.usageType = this.getObjectValue(call, "usageType", "usageType is required") as number;
contextOhos.audioScene = this.getObjectValue(call, "audioScene", "audioScene is required") as number;
contextOhos.stayAwake = this.getObjectValue(call, "stayAwake", "stayAwake is required") as boolean;
return contextOhos;
}
private getObjectValue(call: MethodCall, key: string, error: string): any {
if (call.hasArgument(key)) {
return call.argument(key);
}
this.error(error);
}
private error(msg: string) {
throw new Error(msg);
}
onAttachedToAbility(binding: AbilityPluginBinding): void {
this.abilityBinding = binding;
}
onDetachedFromAbility(): void {
this.abilityBinding = undefined;
this.stopContinuousTask();
}
async startContinuousTask() {
Log.d(TAG, `startContinuousTask`);
if (this.isStartContinuousTask) {
return;
}
this.isStartContinuousTask = true;
let context = this.abilityBinding!.getAbility().context;
let type: AVSessionManager.AVSessionType = 'audio';
this.session = await AVSessionManager.createAVSession(context, 'audioplayers', type);
// 激活接口要在元数据、控制命令注册完成之后再执行
await this.session?.activate();
Log.d(TAG, `session create done : sessionId : ${this.session?.sessionId}`);
let wantAgentInfo: wantAgent.WantAgentInfo = {
wants: [
{
bundleName: context?.abilityInfo.bundleName,
abilityName: context?.abilityInfo.name
}
],
actionType: wantAgent.OperationType.START_ABILITY,
requestCode: 0,
wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
};
wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {
backgroundTaskManager.startBackgroundRunning(context, backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK, wantAgentObj).then(() => {
Log.d(TAG, `Succeeded in operationing startBackgroundRunning.`);
}).catch((err: BusinessError) => {
Log.e(TAG, `Failed to operation startBackgroundRunning. Code is ${err.code}, message is ${err.message}`);
});
});
}
async stopContinuousTask() {
Log.d(TAG, `stopContinuousTask`);
if (!this.isStartContinuousTask) {
return;
}
this.isStartContinuousTask = false;
await this.session?.deactivate();
await this.session?.destroy();
backgroundTaskManager.stopBackgroundRunning(this.abilityBinding?.getAbility().context).then(() => {
Log.d(TAG, `Succeeded in operationing stopBackgroundRunning.`);
}).catch((err: BusinessError) => {
Log.e(TAG, `Failed to operation stopBackgroundRunning. Code is ${err.code}, message is ${err.message}`);
});
}
}
export class EventHandler implements StreamHandler {
private eventChannel?: EventChannel = undefined;
private eventSink: EventSink | null = null;
constructor(eventChannel: EventChannel) {
this.eventChannel = eventChannel;
this.eventChannel.setStreamHandler(this);
}
onListen(args: any, events: EventSink): void {
this.eventSink = events;
}
onCancel(args: any): void {
this.eventSink = null;
}
success(method: string, args: Map<string, any> = new Map<string, any>()) {
args.set("event", method);
this.eventSink?.success(args);
}
error(errorCode?: string, errorMessage?: string, errorDetails?: any) {
this.eventSink?.error(errorCode, errorMessage, errorDetails);
}
dispose() {
if (this.eventSink) {
this.eventSink.endOfStream();
this.onCancel(null);
}
this.eventChannel?.setStreamHandler(null);
}
}
interface IUpdateCallback {
stopUpdates(): void;
startUpdates(): void;
}
/**
* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export enum PlayerMode {
MEDIA_PLAYER = 1,
LOW_LATENCY = 2
}
export const parsePlayerMode = (mode: string) => {
if (mode == "PlayerMode.lowLatency") {
return PlayerMode.LOW_LATENCY;
}
return PlayerMode.MEDIA_PLAYER;
};
/**
* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export enum ReleaseMode {
RELEASE = 1,
LOOP = 2,
STOP = 3
}
export const parseReleaseMode = (mode: string) => {
if (mode == "ReleaseMode.stop") {
return ReleaseMode.STOP;
}
else if (mode == "ReleaseMode.loop") {
return ReleaseMode.LOOP;
}
return ReleaseMode.RELEASE;
};
import type WrappedPlayer from './WrappedPlayer';
export default class FocusManager {
private player: WrappedPlayer | null = null;
constructor(player: WrappedPlayer) {
this.player = player;
}
handleStop() {
}
maybeRequestAudioFocus(andThen: Function) {
andThen();
}
}
import type AudioContextOhos from '../AudioContextOhos';
import type Source from '../source/Source';
import type Player from './Player';
import type WrappedPlayer from './WrappedPlayer';
import media from "@ohos:multimedia.media";
import type { BusinessError } from "@ohos:base";
import { Log } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import window from "@ohos:window";
import type common from "@ohos:app.ability.common";
const TAG = "MediaPlayerPlayer";
const OPERATE_ERROR: number = 801;
const AVPLAYER_STATE_ERROR: number = 5400102;
const AVPLAYER_IO_ERROR: number = 5400103;
export default class MediaPlayerPlayer implements Player {
private wrappedPlayer: WrappedPlayer;
private mediaPlayer?: media.AVPlayer | null = null;
private isLooping: boolean = false;
private volume: number = 1;
private needPrepare: boolean = false;
private stayAwake: boolean = false;
private speed = media.PlaybackSpeed.SPEED_FORWARD_1_00_X;
constructor(wrappedPlayer: WrappedPlayer, context: AudioContextOhos) {
this.wrappedPlayer = wrappedPlayer;
this.stayAwake = context.stayAwake;
}
async initMediaPlayer() {
this.mediaPlayer = await media.createAVPlayer();
this.setAVPlayerCallback(this.mediaPlayer);
Log.d(TAG, "initMediaPlayer");
}
setAVPlayerCallback(avPlayer: media.AVPlayer) {
// seek操作结果回调函数
avPlayer.on('seekDone', (seekDoneTime: number) => {
Log.d(TAG, `AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
this.wrappedPlayer.onSeekComplete();
});
avPlayer.on('bufferingUpdate', (infoType: media.BufferingInfoType, value: number) => {
Log.d(TAG, `AVPlayer bufferingUpdate value is ${value}`);
this.wrappedPlayer.onBuffering(value);
});
avPlayer.on('speedDone', (speed: number) => {
console.info('speedDone called,and speed value is:' + speed);
});
// error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程
avPlayer.on('error', (err: BusinessError) => {
if (err.code == OPERATE_ERROR || err.code == AVPLAYER_STATE_ERROR || err.code == AVPLAYER_IO_ERROR) {
Log.e(TAG, "AvPlayer Avoid Error Reporting: " + JSON.stringify(err));
return;
}
Log.e(TAG, `Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
this.wrappedPlayer.onError(err.code, err.message);
});
// 状态机变化回调函数
avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
switch (state) {
case 'idle': // 成功调用reset接口后触发该状态机上报
Log.d(TAG, 'AVPlayer state idle called.');
break;
case 'initialized': // avplayer 设置播放源后触发该状态上报
Log.d(TAG, 'AVPlayer state initialized called.');
this.wrappedPlayer.context?.setAttributesOnPlayer(this.mediaPlayer!);
this.needPrepare && this.prepare();
break;
case 'prepared': // prepare调用成功后上报该状态机
Log.d(TAG, 'AVPlayer state prepared called.');
this.setVolume(this.volume, this.volume);
this.setLooping(this.isLooping);
this.setRate(this.speed);
this.wrappedPlayer.onPrepared();
break;
case 'playing': // play成功调用后触发该状态机上报
Log.d(TAG, 'AVPlayer state playing called.');
this.wrappedPlayer.startContinuousTask();
break;
case 'paused': // pause成功调用后触发该状态机上报
Log.d(TAG, 'AVPlayer state paused called.');
this.wrappedPlayer.stopContinuousTask();
break;
case 'completed': // 播放结束后触发该状态机上报
Log.d(TAG, 'AVPlayer state completed called.');
this.wrappedPlayer.onCompletion();
break;
case 'stopped': // stop接口成功调用后触发该状态机上报
Log.d(TAG, 'AVPlayer state stopped called.');
this.wrappedPlayer.stopContinuousTask();
this.needPrepare && this.prepare();
break;
case 'released':
this.wrappedPlayer.stopContinuousTask();
Log.d(TAG, 'AVPlayer state released called.');
break;
default:
Log.d(TAG, 'AVPlayer state unknown called.');
break;
}
});
}
getDuration(): number {
// media player returns -1 if the duration is unknown
return this.mediaPlayer ? this.mediaPlayer!.duration : -1;
}
getCurrentPosition(): number {
return this.mediaPlayer ? this.mediaPlayer!.currentTime : -1;
}
isActuallyPlaying(): boolean {
return this.mediaPlayer ? this.mediaPlayer!.state == 'playing' : false;
}
isLiveStream(): boolean {
let duration = this.getDuration();
return duration == 0 || duration == -1;
}
async start() {
this.mediaPlayer && await this.mediaPlayer.play();
}
async pause() {
this.mediaPlayer && this.mediaPlayer!.state == 'playing' && await this.mediaPlayer.pause();
}
async stop() {
this.needPrepare = false;
this.mediaPlayer && await this.mediaPlayer.stop();
}
seekTo(position: number) {
this.mediaPlayer && this.mediaPlayer.seek(position);
}
async release() {
if (this.mediaPlayer) {
await this.mediaPlayer.reset();
await this.mediaPlayer.release();
}
}
setVolume(leftVolume: number, rightVolume: number) {
this.volume = leftVolume;
if (this.isReadyState()) {
this.mediaPlayer!.setVolume(leftVolume);
}
}
setRate(rate: number) {
if (rate < 0) {
throw new Error('Invalid rate input: ' + rate);
}
if (rate == 0) {
this.mediaPlayer?.pause();
return;
}
this.speed = media.PlaybackSpeed.SPEED_FORWARD_1_00_X;
if (rate <= 0.5) {
this.speed = media.PlaybackSpeed.SPEED_FORWARD_0_50_X;
}
else if (rate <= 0.75) {
this.speed = media.PlaybackSpeed.SPEED_FORWARD_0_75_X;
}
else if (rate <= 1.0) {
this.speed = media.PlaybackSpeed.SPEED_FORWARD_1_00_X;
}
else if (rate <= 1.25) {
this.speed = media.PlaybackSpeed.SPEED_FORWARD_1_25_X;
}
else if (rate <= 1.5) {
this.speed = media.PlaybackSpeed.SPEED_FORWARD_1_50_X;
}
else if (rate <= 1.75) {
this.speed = media.PlaybackSpeed.SPEED_FORWARD_1_75_X;
}
else {
this.speed = media.PlaybackSpeed.SPEED_FORWARD_2_00_X;
}
this.mediaPlayer && this.mediaPlayer.setSpeed(this.speed);
if (this.mediaPlayer?.state == 'paused') {
this.start();
}
}
setLooping(looping: boolean) {
this.isLooping = looping;
if (this.isReadyState()) {
this.mediaPlayer!.loop = looping;
}
}
private isReadyState() {
return this.mediaPlayer && (this.mediaPlayer!.state == 'prepared' || this.mediaPlayer!.state == 'playing'
|| this.mediaPlayer!.state == 'paused' || this.mediaPlayer!.state == 'completed');
}
async updateContext(context: AudioContextOhos) {
this.mediaPlayer && this.mediaPlayer!.state == 'initialized' && context.setAttributesOnPlayer(this.mediaPlayer);
if (context.stayAwake != this.stayAwake) {
let uiContext = getContext(this) as common.UIAbilityContext;
let windowClass: window.Window = await window.getLastWindow(uiContext);
windowClass.setWindowKeepScreenOn(context.stayAwake);
this.stayAwake = context.stayAwake;
}
}
async setSource(source: Source) {
await this.reset();
this.mediaPlayer && source.setForMediaPlayer(this.mediaPlayer);
}
async prepare() {
if (this.canPrepare()) {
this.needPrepare = false;
await this.mediaPlayer!.prepare();
}
else {
this.needPrepare = true;
}
}
private canPrepare() {
return this.mediaPlayer && (this.mediaPlayer!.state == 'stopped' || this.mediaPlayer!.state == 'initialized');
}
async reset() {
this.mediaPlayer && await this.mediaPlayer.reset();
}
}
import audio from "@ohos:multimedia.audio";
import media from "@ohos:multimedia.media";
import type AudioContextOhos from '../AudioContextOhos';
import type AudioplayersPlugin from '../AudioplayersPlugin';
import type Source from '../source/Source';
import type UrlSource from '../source/UrlSource';
import type Player from './Player';
import type WrappedPlayer from './WrappedPlayer';
import HashMap from "@ohos:util.HashMap";
const MAX_STREAMS = 32;
export default class SoundPoolPlayer implements Player {
wrappedPlayer: WrappedPlayer;
private soundPoolManager: SoundPoolManager;
soundId: number | null = null;
private streamId: number | null = null;
private audioContext: AudioContextOhos;
private soundPoolWrapper: SoundPoolWrapper | null = null;
private soundPool: media.SoundPool | null = null;
constructor(wrappedPlayer: WrappedPlayer, soundPoolManager: SoundPoolManager) {
this.wrappedPlayer = wrappedPlayer;
this.soundPoolManager = soundPoolManager;
this.audioContext = wrappedPlayer.context;
}
async init() {
await this.soundPoolManager.createSoundPoolWrapper(MAX_STREAMS, this.audioContext);
this.soundPoolWrapper = this.soundPoolManager.getSoundPoolWrapper(this.audioContext);
this.soundPool = this.soundPoolWrapper!.soundPool;
}
async setAudioContext(audioContext: AudioContextOhos) {
if (!audioContext.equals(audioContext)) {
this.audioContext = audioContext;
await this.release();
await this.init();
}
}
getDuration(): number | null {
return null;
}
getCurrentPosition(): number | null {
return null;
}
isActuallyPlaying(): boolean {
return false;
}
isLiveStream(): boolean {
return false;
}
async start() {
let streamId = this.streamId;
let soundId = this.soundId;
if (soundId != null) {
let playParameters: media.PlayParameters = {
loop: this.wrappedPlayer.getLooping() ? -1 : 0,
rate: this.convertRate(this.wrappedPlayer.getRate()),
leftVolume: this.wrappedPlayer.getVolume(),
rightVolume: this.wrappedPlayer.getVolume(),
priority: 0, // 最低优先级
};
this.streamId = await this.soundPool!.play(this.soundId, playParameters)!;
}
}
pause() {
if (this.streamId != null) {
this.soundPool!.stop(this.streamId);
this.streamId = null;
}
}
stop() {
if (this.streamId != null) {
this.soundPool!.stop(this.streamId);
this.streamId = null;
}
}
seekTo(position: number) {
//TODO
//this.unsupportedOperation("seek")
}
async release() {
await this.stop();
if (this.soundId == null) {
return;
}
if (this.getUrlSource() == null) {
return;
}
if (!this.soundPoolWrapper!.urlToPlayers.hasKey(this.getUrlSource())) {
return;
}
let playersForSoundId = this.soundPoolWrapper!.urlToPlayers.get(this.getUrlSource());
if (playersForSoundId.length == 1 && playersForSoundId[0] == this) {
this.soundPoolWrapper!.urlToPlayers.remove(this.getUrlSource());
await this.soundPool!.unload(this.soundId);
this.soundPoolWrapper!.soundIdToPlayer.remove(this.soundId);
this.wrappedPlayer.handleLog("unloaded soundId $soundId");
}
else {
// This is not the last player using the soundId, just remove it from the list.
let index = playersForSoundId.indexOf(this);
if (index > -1) {
playersForSoundId.splice(index, 1);
}
}
this.soundId = null;
}
async setVolume(leftVolume: number, rightVolume: number) {
if (this.streamId != null) {
await this.soundPool!.setVolume(this.streamId, leftVolume, rightVolume);
}
}
async setRate(rate: number) {
if (this.streamId != null) {
await this.soundPool!.setRate(this.streamId, this.convertRate(rate));
}
}
async setLooping(looping: boolean) {
if (this.streamId != null) {
await this.soundPool!.setLoop(this.streamId, looping ? -1 : 0);
}
}
updateContext(context: AudioContextOhos) {
this.audioContext = context;
}
setSource(source: Source) {
source.setForSoundPool(this);
}
prepare() {
// sound pool automatically prepares when source URL is set
}
reset() {
// TODO(luan): what do I do here?
}
private unsupportedOperation(message: string) {
throw new Error(`LOW_LATENCY mode does not support: ${message}`);
}
private convertRate(rate: number): audio.AudioRendererRate {
let ohrate = audio.AudioRendererRate.RENDER_RATE_NORMAL;
if (this.wrappedPlayer.getRate() < 1) {
ohrate = audio.AudioRendererRate.RENDER_RATE_HALF;
}
else if (this.wrappedPlayer.getRate() > 1) {
ohrate = audio.AudioRendererRate.RENDER_RATE_DOUBLE;
}
return ohrate;
}
async setUrlSource(urlSource: UrlSource) {
if (this.soundId != null) {
await this.release();
}
if (!this.soundPoolWrapper!.urlToPlayers.hasKey(urlSource)) {
this.soundPoolWrapper!.urlToPlayers.set(urlSource, Array<SoundPoolPlayer>());
}
let urlPlayers = this.soundPoolWrapper!.urlToPlayers.get(urlSource);
let originalPlayer = urlPlayers.length > 0 ? urlPlayers[0] : null;
if (originalPlayer != null) {
// Sound has already been loaded - reuse the soundId.
let prepared = originalPlayer.wrappedPlayer.getPrepared();
this.wrappedPlayer.setPrepared(prepared);
this.soundId = originalPlayer.soundId;
this.wrappedPlayer.handleLog(`Reusing soundId ${this.soundId} for ${urlSource.url} is prepared=${prepared}`);
}
else {
// First one for this URL - load it.
let start = new Date().getTime();
this.wrappedPlayer.setPrepared(false);
this.wrappedPlayer.handleLog(`Fetching actual URL for ${urlSource.url}}`);
let actualUrl = await urlSource.getAudioPathForSoundPool(this.wrappedPlayer.getApplicationContext());
this.wrappedPlayer.handleLog(`Now loading ${actualUrl}`);
let intSoundId = await this.soundPool!.load(actualUrl);
this.soundPoolWrapper!.soundIdToPlayer.set(intSoundId, this);
this.soundId = intSoundId;
this.wrappedPlayer.handleLog(`time to call load() for ${urlSource.url}: ${new Date().getTime() - start} player=${this}}`);
}
urlPlayers.push(this);
}
getUrlSource(): UrlSource | null {
let source = this.wrappedPlayer.getSource();
return source ? this.wrappedPlayer.getSource() as UrlSource : null;
}
}
export class SoundPoolManager {
private ref: AudioplayersPlugin;
private legacySoundPoolWrapper: SoundPoolWrapper | null = null;
private soundPoolWrappers = new HashMap<string, SoundPoolWrapper>();
constructor(plugin: AudioplayersPlugin) {
this.ref = plugin;
}
async createSoundPoolWrapper(maxStreams: number, audioContext: AudioContextOhos) {
let attrs = audioContext.buildAttributes();
let key = attrs.usage + "" + attrs.rendererFlags;
if (!this.soundPoolWrappers.hasKey(key)) {
let soundPool = await media.createSoundPool(maxStreams, attrs);
this.ref.handleGlobalLog("Create SoundPool with " + key);
let soundPoolWrapper = new SoundPoolWrapper(soundPool);
soundPoolWrapper.soundPool.on('loadComplete', (soundId: number) => {
this.ref.handleGlobalLog(`Loaded ${soundId}`);
let loadingPlayer = soundPoolWrapper.soundIdToPlayer.get(soundId);
let urlSource = loadingPlayer.getUrlSource();
if (urlSource) {
soundPoolWrapper.soundIdToPlayer.remove(loadingPlayer.soundId);
let urlPlayers = soundPoolWrapper.urlToPlayers.get(urlSource);
for (let player of urlPlayers) {
player.wrappedPlayer.handleLog(`Marking ${player.soundId} as loaded`);
player.wrappedPlayer.setPrepared(true);
if (player.wrappedPlayer.isPlaying()) {
player.wrappedPlayer.handleLog(`Delayed start of ${player.soundId}`);
player.start();
}
}
}
});
this.soundPoolWrappers.set(key, soundPoolWrapper);
}
}
/**
* Get the [SoundPoolWrapper] with the given [audioContext].
*/
getSoundPoolWrapper(audioContext: AudioContextOhos): SoundPoolWrapper | null {
let attrs = audioContext.buildAttributes();
let key = attrs.usage + "" + attrs.rendererFlags;
return this.soundPoolWrappers.hasKey(key) ? this.soundPoolWrappers.get(key) : null;
}
dispose() {
this.soundPoolWrappers.forEach((value: SoundPoolWrapper, key: string) => value.dispose());
this.soundPoolWrappers.clear();
}
}
class SoundPoolWrapper {
soundPool: media.SoundPool;
soundIdToPlayer = new HashMap<number, SoundPoolPlayer>();
urlToPlayers = new HashMap<UrlSource, Array<SoundPoolPlayer>>();
constructor(soundPool: media.SoundPool) {
this.soundPool = soundPool;
}
/** For the onLoadComplete listener, track which sound id is associated with which player. An entry only exists until
* it has been loaded.
*/
/** This is to keep track of the players which share the same sound id, referenced by url. When a player release()s, it
* is removed from the associated player list. The last player to be removed actually unloads() the sound id and then
* the url is removed from this map.
*/
dispose() {
this.soundPool.off('loadComplete');
this.soundPool.release();
this.soundIdToPlayer.clear();
this.urlToPlayers.clear();
}
}
import type AudioContextOhos from '../AudioContextOhos';
import type AudioplayersPlugin from '../AudioplayersPlugin';
import type { EventHandler } from '../AudioplayersPlugin';
import { ReleaseMode } from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/ReleaseMode&1.0.0";
import { PlayerMode } from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/PlayerMode&1.0.0";
import type Source from '../source/Source';
import FocusManager from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/player/FocusManager&1.0.0";
import type Player from './Player';
import type { Context as Context } from "@ohos:abilityAccessCtrl";
import type audio from "@ohos:multimedia.audio";
import SoundPoolPlayer from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/player/SoundPoolPlayer&1.0.0";
import type { SoundPoolManager } from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/player/SoundPoolPlayer&1.0.0";
import MediaPlayerPlayer from "@normalized:N&&&audioplayers_ohos/src/main/ets/components/plugin/player/MediaPlayerPlayer&1.0.0";
export default class WrappedPlayer {
private ref: AudioplayersPlugin;
eventHandler: EventHandler;
context: AudioContextOhos;
private soundPoolManager: SoundPoolManager;
private player: Player | null = null;
private source: Source | null = null;
private released: boolean = true;
private prepared: boolean = false;
private playing: boolean = false;
private volume: number = 1.0;
private balance: number = 0.0;
private rate: number = 1.0;
private releaseMode: ReleaseMode = ReleaseMode.RELEASE;
private isLooping: boolean = this.releaseMode == ReleaseMode.LOOP;
private playerMode: PlayerMode = PlayerMode.MEDIA_PLAYER;
private shouldSeekTo: number = -1;
private focusManager = new FocusManager(this);
constructor(plugin: AudioplayersPlugin, eventHandler: EventHandler, context: AudioContextOhos, soundPoolManager: SoundPoolManager) {
this.ref = plugin;
this.eventHandler = eventHandler;
this.context = context;
this.soundPoolManager = soundPoolManager;
}
async setSource(value: Source | null) {
if (this.source != value) {
this.source = value;
if (value != null) {
let player = await this.getOrCreatePlayer();
player.setSource(value);
await this.configAndPrepare();
}
else {
this.released = true;
this.setPrepared(false);
this.playing = false;
await this.player?.release();
}
}
else {
this.ref.handlePrepared(this, true);
}
}
getSource(): Source | null {
return this.source;
}
isPlaying(): boolean {
return this.playing;
}
setVolume(value: number) {
if (this.volume != value) {
this.volume = value;
if (!this.released) {
this.setVolumeAndBalance(value, this.balance);
}
}
}
setBalance(value: number) {
if (this.balance != value) {
this.balance = value;
if (!this.released) {
this.setVolumeAndBalance(this.volume, value);
}
}
}
setRate(value: number) {
if (this.rate != value) {
this.rate = value;
this.player && this.player?.setRate(value);
}
}
setReleaseMode(value: ReleaseMode) {
if (this.releaseMode != value) {
this.releaseMode = value;
this.isLooping = this.releaseMode == ReleaseMode.LOOP;
if (!this.released) {
this.player?.setLooping(this.isLooping);
}
}
}
getLooping() {
return this.releaseMode == ReleaseMode.LOOP;
}
async setPlayerMode(value: PlayerMode) {
if (this.playerMode != value) {
this.playerMode = value;
if (this.player) {
this.shouldSeekTo = this.maybeGetCurrentPosition();
this.setPrepared(false);
await this.player.release();
}
await this.initPlayer();
}
}
setPrepared(value: boolean) {
if (this.prepared != value) {
this.prepared = value;
this.ref.handlePrepared(this, value);
}
}
getPrepared(): boolean {
return this.prepared;
}
getVolume() {
return this.volume;
}
getRate() {
return this.rate;
}
private maybeGetCurrentPosition(): number {
if (this.player) {
let position = this.player.getCurrentPosition();
return position != null ? position : -1;
}
return -1;
}
private async getOrCreatePlayer() {
let currentPlayer = this.player;
if (this.released || currentPlayer == null) {
this.player = await this.createPlayer();
this.released = false;
return this.player!;
}
else if (this.prepared) {
await currentPlayer?.reset();
this.setPrepared(false);
}
return currentPlayer!;
}
async updateAudioContext(audioContext: AudioContextOhos) {
if (this.context == audioContext) {
return;
}
// TODO audioFocus
this.context = audioContext.copy();
// AudioManager values are set globally
//audioManager.mode = context.audioMode // OHOS没有类似接口?
//audioManager.isSpeakerphoneOn = context.isSpeakerphoneOn
if (this.player) {
await this.player.stop();
await this.player.reset();
this.setPrepared(false);
this.player.updateContext(this.context);
if (this.source) {
this.player.setSource(this.source);
await this.configAndPrepare();
}
}
}
getDuration(): number | null {
return (this.prepared && this.player) ? this.player!.getDuration() : null;
}
getCurrentPosition(): number | null {
return (this.prepared && this.player) ? this.player!.getCurrentPosition() : null;
}
isActuallyPlaying(): boolean {
return this.playing && this.prepared && this.player != null && this.player!.isActuallyPlaying() == true;
}
getApplicationContext(): Context {
return this.ref.getApplicationContext();
}
getAudioManager(): audio.AudioManager {
return this.ref.getAudioManager();
}
play() {
this.focusManager.maybeRequestAudioFocus(async () => await this.actuallyPlay());
}
async actuallyPlay() {
if (!this.playing && !this.released) {
let currentPlayer = this.player;
this.playing = true;
if (currentPlayer == null) {
await this.initPlayer();
}
else if (this.prepared) {
await currentPlayer.start();
this.ref.handleIsPlaying();
}
}
}
async stop() {
this.focusManager.handleStop();
if (this.released) {
return;
}
if (this.releaseMode != ReleaseMode.RELEASE) {
await this.pause();
if (this.prepared) {
if (this.player?.isLiveStream() == true) {
await this.player?.stop();
this.setPrepared(false);
await this.player?.prepare();
}
else {
// MediaPlayer does not allow to call player.seekTo after calling player.stop
this.seek(0);
}
}
}
else {
await this.release();
}
}
async release() {
this.focusManager.handleStop();
if (this.released) {
return;
}
if (this.playing) {
await this.player?.stop();
}
// Setting source to null will reset released, prepared and playing
// and also calls player.release()
this.setSource(null);
this.player = null;
}
async pause() {
if (this.playing) {
this.playing = false;
if (this.prepared) {
await this.player?.pause();
}
}
}
// seek operations cannot be called until after
// the player is ready.
seek(position: number) {
if (this.prepared && this.player?.isLiveStream() != true) {
this.player?.seekTo(position);
this.shouldSeekTo = -1;
}
else {
this.shouldSeekTo = position;
}
}
/**
* Player callbacks
*/
async onPrepared() {
this.setPrepared(true);
this.ref.handleDuration(this);
if (this.playing) {
await this.player?.start();
this.ref.handleIsPlaying();
}
if (this.shouldSeekTo >= 0 && this.player?.isLiveStream() != true) {
this.player?.seekTo(this.shouldSeekTo);
}
}
async onCompletion() {
if (this.releaseMode != ReleaseMode.LOOP) {
await this.stop();
}
this.ref.handleComplete(this);
}
onBuffering(percent: number) {
// TODO(luan): expose this as a stream
}
onSeekComplete() {
this.ref.handleSeekComplete(this);
}
handleLog(message: string) {
this.ref.handleLog(this, message);
}
handleError(errorCode?: string, errorMessage?: string, errorDetails?: any) {
this.ref.handleError(this, errorCode, errorMessage, errorDetails);
}
onError(what: number, extra: string): Boolean {
// TODO 添加OHOS的player错误
// When an error occurs, reset player to not [prepared].
// Then no functions will be called, which end up in an illegal player state.
this.setPrepared(false);
this.handleError(what.toString(), extra, null);
return false;
}
/**
* Create new player
*/
private async createPlayer(): Promise<Player> {
if (this.playerMode == PlayerMode.LOW_LATENCY) {
let player = new SoundPoolPlayer(this, this.soundPoolManager);
await player.init();
return player;
}
else {
let player = new MediaPlayerPlayer(this, this.context);
await player.initMediaPlayer();
return player;
}
}
/**
* Create new player, assign and configure source
*/
private async initPlayer() {
let player = await this.createPlayer();
// Need to set player before calling prepare, as onPrepared may is called before player is assigned
this.player = player;
if (this.source) {
await this.player.setSource(this.source);
await this.configAndPrepare();
}
}
private async configAndPrepare() {
this.player?.setRate(this.rate);
this.setVolumeAndBalance(this.volume, this.balance);
this.player?.setLooping(this.isLooping);
await this.player?.prepare();
}
private setVolumeAndBalance(volume: number, balance: number) {
let leftVolume = Math.min(1, 1 - balance) * volume;
let rightVolume = Math.min(1, 1 + balance) * volume;
this.player?.setVolume(leftVolume, rightVolume);
}
async dispose() {
await this.release();
this.eventHandler.dispose();
}
startContinuousTask() {
this.ref.startContinuousTask();
}
stopContinuousTask() {
this.ref.stopContinuousTask();
}
}
import type SoundPoolPlayer from '../player/SoundPoolPlayer';
import type Source from './Source';
import type media from "@ohos:multimedia.media";
export default class BytesSource implements Source {
private bytes: ArrayBuffer;
constructor(bytes: ArrayBuffer) {
this.bytes = bytes;
}
setForMediaPlayer(mediaPlayer: media.AVPlayer): void {
let src: media.AVDataSrcDescriptor = {
fileSize: this.bytes.byteLength,
callback: (buf: ArrayBuffer, length: number, pos: number | undefined) => {
if (buf == undefined || length == undefined || pos == undefined) {
return -1;
}
if (pos >= src.fileSize) {
return -1;
}
let remainingSize = this.computeRemainingSize(length, pos);
if (remainingSize < 0) {
return -1;
}
const view = new Uint8Array(buf);
const dataToCopy = this.bytes.slice(pos, pos + remainingSize);
const dataView = new Uint8Array(dataToCopy);
// 复制数据到ArrayBuffer
view.set(dataView);
if (remainingSize > 0 && (src.fileSize >= pos)) {
return remainingSize;
}
return -1;
}
};
mediaPlayer.dataSrc = src;
}
setForSoundPool(soundPoolPlayer: SoundPoolPlayer): void {
throw new Error("Bytes sources are not supported on LOW_LATENCY mode yet.");
}
private computeRemainingSize(length: number, position: number): number {
let remainingSize = length;
if (position + remainingSize > this.bytes.byteLength) {
remainingSize -= position + remainingSize - this.bytes.byteLength;
}
return remainingSize;
}
}
import type SoundPoolPlayer from '../player/SoundPoolPlayer';
import type Source from './Source';
import type media from "@ohos:multimedia.media";
import fs from "@ohos:file.fs";
import request from "@ohos:request";
export default class UrlSource implements Source {
url: string;
private isLocal: boolean;
constructor(url: string, isLocal: boolean) {
this.url = url;
this.isLocal = isLocal;
}
setForMediaPlayer(mediaPlayer: media.AVPlayer): void {
if (this.isLocal) {
let fdPath = 'fd://';
// 打开相应的资源文件地址获取fd,并为url赋值触发initialized状态机上报
let file = fs.openSync(this.url);
fdPath = fdPath + '' + file.fd;
mediaPlayer.url = fdPath;
}
else {
mediaPlayer.url = this.url;
}
}
setForSoundPool(soundPoolPlayer: SoundPoolPlayer): void {
soundPoolPlayer.setUrlSource(this);
}
getAudioPathForSoundPool(context: Context): Promise<string> {
return new Promise<string>((resolve, reject) => {
if (this.isLocal) {
// 打开相应的资源文件地址获取fd,并为url赋值触发initialized状态机上报
let file = fs.openSync(this.url);
resolve('fd://' + file.fd);
}
else {
let tempFile = context.tempDir + "/sound.data";
if (fs.accessSync(tempFile)) {
fs.rmdirSync(tempFile);
}
request.downloadFile(context, {
url: this.url,
filePath: tempFile
}).then((downloadTask: request.DownloadTask) => {
downloadTask.on('complete', () => {
let file = fs.openSync(tempFile);
resolve('fd://' + file.fd);
});
downloadTask.on('fail', (err: number) => {
resolve(tempFile);
});
});
}
});
}
}
import ConnectivityPlugin from "@normalized:N&&&connectivity_plus/src/main/ets/dev/fluttercommunity/plus/connectivity/ConnectivityPlugin&1.0.0";
export default ConnectivityPlugin;
import connection from "@ohos:net.connection";
const TAG = "Connectivity";
export class Connectivity {
public static CONNECTIVITY_NONE = "none";
private static CONNECTIVITY_WIFI = "wifi";
private static CONNECTIVITY_MOBILE = "mobile";
private static CONNECTIVITY_ETHERNET = "ethernet";
private static CONNECTIVITY_BLUETOOTH = "bluetooth";
private static CONNECTIVITY_VPN = "vpn";
public static netConnection = connection.createNetConnection();
public networkType: String = Connectivity.CONNECTIVITY_NONE;
constructor() {
}
async getNetworkType(): Promise<String> {
//通过异步方式获取网络信息
const netHandle = await connection.getDefaultNet();
if (netHandle.netId == 0) {
return Connectivity.CONNECTIVITY_NONE;
}
const capabilities = await connection.getNetCapabilities(netHandle);
this.networkType = this.hasTransport(capabilities.bearerTypes);
return this.networkType;
}
hasTransport(capabilities: Array<number>): String {
//若数组为空返回CONNECTIVITY_NONE
if (capabilities.length == 0) {
return Connectivity.CONNECTIVITY_NONE;
}
if (capabilities.includes(connection.NetBearType.BEARER_WIFI)) {
return Connectivity.CONNECTIVITY_WIFI;
}
if (capabilities.includes(connection.NetBearType.BEARER_ETHERNET)) {
return Connectivity.CONNECTIVITY_ETHERNET;
}
if (capabilities.includes(connection.NetBearType.BEARER_CELLULAR)) {
return Connectivity.CONNECTIVITY_MOBILE;
}
return Connectivity.CONNECTIVITY_NONE;
}
}
import type { StreamHandler, EventSink } from '@ohos/flutter_ohos/src/main/ets/plugin/common/EventChannel';
import { Connectivity } from "@normalized:N&&&connectivity_plus/src/main/ets/dev/fluttercommunity/plus/connectivity/Connectivity&1.0.0";
//创建tag
const TAG = "ConnectivityBroadcastReceiver";
//创建类
export class ConnectivityBroadcastReceiver implements StreamHandler {
private connectivity: Connectivity;
private context: Context;
private events: EventSink | null = null;
constructor(context: Context, connectivity: Connectivity) {
this.context = context;
this.connectivity = connectivity;
}
onListen(args: Object, events: EventSink): void {
this.events = events;
Connectivity.netConnection.register(async (error) => {
this.sendEvent(await this.connectivity.getNetworkType());
});
//订阅网络可用事件。
Connectivity.netConnection.on('netAvailable', async (data) => {
this.sendEvent(await this.connectivity.getNetworkType());
});
//订阅网络能力变化事件。
Connectivity.netConnection.on('netCapabilitiesChange', async (data) => {
this.sendEvent(await this.connectivity.getNetworkType());
});
//订阅网络连接信息变化事件
Connectivity.netConnection.on('netConnectionPropertiesChange', async (data) => {
this.sendEvent(await this.connectivity.getNetworkType());
});
//订阅网络订阅网络丢失事件。
Connectivity.netConnection.on('netLost', (data) => {
this.sendEvent(Connectivity.CONNECTIVITY_NONE);
});
//订阅网络不可用事件。
Connectivity.netConnection.on('netUnavailable', (data) => {
this.sendEvent(Connectivity.CONNECTIVITY_NONE);
});
}
onCancel(args?: Object): void {
Connectivity.netConnection.unregister((error) => {
});
}
private sendEvent(networkType: String): Promise<void> {
if (this.events != null && networkType != null) {
this.events.success(networkType);
}
return new Promise((reject) => {
reject();
});
}
}
import type MethodCall from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodCall';
import type { MethodCallHandler, MethodResult } from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel';
import type { Connectivity } from './Connectivity';
import Log from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/util/Log&1.0.0-2317265cd5";
const TAG: string = "ConnectivityMethodChannelHandler";
export default class ConnectivityMethodChannelHandler implements MethodCallHandler {
private connectivity: Connectivity;
constructor(connectivity: Connectivity) {
this.connectivity = connectivity;
}
onMethodCall(call: MethodCall, result: MethodResult): void {
Log.d(TAG, 'onMethodCall step in');
switch (call.method) {
case "check":
this.handleCheckResult(result);
break;
default:
result.notImplemented();
break;
}
}
async handleCheckResult(result: MethodResult): Promise<void> {
const networkType: String = await this.connectivity.getNetworkType();
Log.d(TAG, 'handleCheckResult with result: ${networkType}');
result.success(networkType);
}
}
import type { FlutterPlugin, FlutterPluginBinding } from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
import MethodChannel from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel&1.0.0-2317265cd5";
import EventChannel from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/EventChannel&1.0.0-2317265cd5";
import { ConnectivityBroadcastReceiver } from "@normalized:N&&&connectivity_plus/src/main/ets/dev/fluttercommunity/plus/connectivity/ConnectivityBroadcastReceiver&1.0.0";
import { Connectivity } from "@normalized:N&&&connectivity_plus/src/main/ets/dev/fluttercommunity/plus/connectivity/Connectivity&1.0.0";
import ConnectivityMethodChannelHandler from "@normalized:N&&&connectivity_plus/src/main/ets/dev/fluttercommunity/plus/connectivity/ConnectivityMethodChannelHandler&1.0.0";
import Log from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/util/Log&1.0.0-2317265cd5";
import StandardMethodCodec from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/StandardMethodCodec&1.0.0-2317265cd5";
const TAG: string = "ConnectivityPlugin";
export default class ConnectivityPlugin implements FlutterPlugin {
private methodChannel: MethodChannel | null = null;
private eventChannel: EventChannel | null = null;
private receiver: ConnectivityBroadcastReceiver | null = null;
private pluginBing: FlutterPluginBinding | null = null;
getUniqueClassName(): string {
return "ConnectivityPlugin";
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
Log.d(TAG, 'onAttachedToEngine connectivity plugin');
this.methodChannel = new MethodChannel(binding.getBinaryMessenger(), "dev.fluttercommunity.plus/connectivity", StandardMethodCodec.INSTANCE);
this.eventChannel = new EventChannel(binding.getBinaryMessenger(), "dev.fluttercommunity.plus/connectivity_status", StandardMethodCodec.INSTANCE);
let connectivity = new Connectivity();
let methodChannelHandler = new ConnectivityMethodChannelHandler(connectivity);
this.receiver = new ConnectivityBroadcastReceiver(binding.getApplicationContext(), connectivity);
this.methodChannel.setMethodCallHandler(methodChannelHandler);
this.eventChannel.setStreamHandler(this.receiver);
this.pluginBing = binding;
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
Log.d(TAG, 'onDetachedFromEngine connectivity plugin');
this.methodChannel?.setMethodCallHandler(null);
this.eventChannel?.setStreamHandler(null);
this.receiver?.onCancel();
this.methodChannel = null;
this.eventChannel = null;
this.receiver = null;
this.pluginBing = null;
}
}
{"resolveConflictMode":true,"depName2RootPath":{"@ohos/flutter_ohos":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@ohos+flutter_ohos@z+esrfzju6x1o3bcfuku8xtvaawms8gp1tiq996zf1o=/oh_modules/@ohos/flutter_ohos","app_update_check_plugin":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos","audioplayers_ohos":"/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos","connectivity_plus":"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos","csp_amap_flutter_location":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos","csp_amap_flutter_map":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos","device_info_plus":"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos","flutter_app_icon_badge":"/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos","flutter_barcode_scanner_ohos":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos","flutter_bugly":"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos","flutter_document_picker":"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos","flutter_downloader":"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos","flutter_image_compress_ohos":"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos","flutter_inappwebview_ohos":"/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos","flutter_keyboard_visibility":"/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos","flutter_native_contact_picker":"/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos","flutter_native_image":"/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos","flutter_sms":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_sms-09a75de411c369fddac432ce70ef8cb7d2ceb70f/ohos","flutter_statusbarcolor_ns_ohos":"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos","flutter_udid":"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos","fluttertoast":"/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos","fluwx":"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos","image_cropper":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos","image_gallery_saver":"/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos","image_picker_ohos":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/image_picker/image_picker_ohos/ohos","open_filex":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_open_filex-e4f9a98a434ff18ffdb4db406b5798f88e5f3ded/ohos","package_info_plus":"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos","path_provider_ohos":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/path_provider/path_provider_ohos/ohos","permission_handler_ohos":"/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos","photo_manager":"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.2/ohos","save_file":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos","shared_preferences_ohos":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/shared_preferences/shared_preferences_ohos/ohos","sign_in_with_apple":"/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos","sqflite":"/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos","tpns_flutter_plugin":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos","url_launcher_ohos":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/url_launcher/url_launcher_ohos/ohos","video_compress":"/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos","video_player_ohos":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/video_player/video_player_ohos/ohos","video_thumbnail":"/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos","webview_flutter_ohos":"/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos","@amap/amap_lbs_common":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_common@1.2.3/oh_modules/@amap/amap_lbs_common","@amap/amap_lbs_location":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_location@1.2.3/oh_modules/@amap/amap_lbs_location","@amap/amap_lbs_search":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_search@1.0.2/oh_modules/@amap/amap_lbs_search","@amap/amap_lbs_map3d":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_map3d@2.2.5/oh_modules/@amap/amap_lbs_map3d","bugly":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/bugly@0.5.0/oh_modules/bugly","@tencent/wechat_open_sdk":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@tencent+wechat_open_sdk@1.0.16/oh_modules/@tencent/wechat_open_sdk","tpns":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/tpns@+wouqmj42evywigdweo6fbgb69jff40luj3ka6xrvuq=/oh_modules/tpns","dayjs":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/dayjs@1.11.13/oh_modules/dayjs","libvideocompress.so":"/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/src/main/cpp/types/libvideocompress","@ohos/crypto-js":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@ohos+crypto-js@2.0.5/oh_modules/@ohos/crypto-js","libAMapOpenLocation.so":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_location@1.2.3/oh_modules/@amap/amap_lbs_location/src/main/cpp/types/libAMapOpenLocation.so","libAMapOpenMap.so":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_map3d@2.2.5/oh_modules/@amap/amap_lbs_map3d/src/main/cpp/types/libAMapOpenMap.so","libbuglynative.so":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/bugly@0.5.0/oh_modules/bugly/src/main/cpp/libbuglynative/exportdir","libbuglyxlog.so":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/bugly@0.5.0/oh_modules/bugly/src/main/cpp/libbuglyxlog/exportdir","libbuglydiag.so":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/bugly@0.5.0/oh_modules/bugly/src/main/cpp/libbuglydiag/exportdir","pako":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/pako@ws8ksynm+3shrzttcjbwhrz8rvle+fhkgg9yiyvi1uu=/oh_modules/pako","@ohos/hypium":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium"},"depName2DepInfo":{"@ohos/flutter_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@ohos+flutter_ohos@z+esrfzju6x1o3bcfuku8xtvaawms8gp1tiq996zf1o=/oh_modules/@ohos/flutter_ohos","pkgName":"@ohos/flutter_ohos","pkgVersion":"1.0.0-2317265cd5"},"app_update_check_plugin":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/app_update_check_plugin/ohos","pkgName":"app_update_check_plugin","pkgVersion":"1.0.0"},"audioplayers_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_audioplayers-5b1f0f972b200b543b5ac27c46f8efba63662e12/packages/audioplayers_ohos/ohos","pkgName":"audioplayers_ohos","pkgVersion":"1.0.0"},"connectivity_plus":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-8720286d1b4b664dbc1d87ba169125242d4f10fb/packages/connectivity_plus/connectivity_plus/ohos","pkgName":"connectivity_plus","pkgVersion":"1.0.0"},"csp_amap_flutter_location":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_location-1.0.2/ohos","pkgName":"csp_amap_flutter_location","pkgVersion":"1.0.0"},"csp_amap_flutter_map":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/csp_amap_flutter_map-10106fa7e336393b5af648e3441d9a19d0ad7bad/ohos","pkgName":"csp_amap_flutter_map","pkgVersion":"1.0.0"},"device_info_plus":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-9f92933f2ac78bb3d7ec534f22bc3183a257fbb9/packages/device_info_plus/device_info_plus/ohos","pkgName":"device_info_plus","pkgVersion":"1.0.0"},"flutter_app_icon_badge":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_app_icon_badge-87a21b24a2d160623c74ff705c01ae5e29be7d25/ohos","pkgName":"flutter_app_icon_badge","pkgVersion":"1.0.0"},"flutter_barcode_scanner_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_barcode_scanner-af5d0e6d2bc53977f979c4f2b852f46274dc8405/ohos/ohos","pkgName":"flutter_barcode_scanner_ohos","pkgVersion":"1.0.0"},"flutter_bugly":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_bugly-1.1.0/ohos","pkgName":"flutter_bugly","pkgVersion":"1.0.0"},"flutter_document_picker":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_document_picker-ffd471d268656455a776e11d43ea86f8f500b9eb/ohos","pkgName":"flutter_document_picker","pkgVersion":"1.0.0"},"flutter_downloader":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_downloader-026ef4fcb90250e5f85dd3f2083e25512df6395a/ohos","pkgName":"flutter_downloader","pkgVersion":"1.0.0"},"flutter_image_compress_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3/ohos","pkgName":"flutter_image_compress_ohos","pkgVersion":"1.0.0"},"flutter_inappwebview_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_inappwebview-04b233befaeaa500d89e46b510ec072dd49dc5ee/flutter_inappwebview_ohos/ohos","pkgName":"flutter_inappwebview_ohos","pkgVersion":"1.0.0"},"flutter_keyboard_visibility":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_keyboard_visibility-479318b7632199849ec43b44d89ecb81fa0f29bc/flutter_keyboard_visibility/ohos","pkgName":"flutter_keyboard_visibility","pkgVersion":"1.0.0"},"flutter_native_contact_picker":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_native_contact_picker-b994d5f5b567a20513ba90ed60c3c311b661e7d7/ohos","pkgName":"flutter_native_contact_picker","pkgVersion":"1.0.0"},"flutter_native_image":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_native_image-c584b4a15afdef3f90b9a648a55809ec959a56b8/ohos","pkgName":"flutter_native_image","pkgVersion":"1.0.0"},"flutter_sms":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_flutter_sms-09a75de411c369fddac432ce70ef8cb7d2ceb70f/ohos","pkgName":"flutter_sms","pkgVersion":"1.0.0"},"flutter_statusbarcolor_ns_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_statusbarcolor_ns-785d70de3b6c9db5d5f477c734f515f40685f4ac/ohos/ohos","pkgName":"flutter_statusbarcolor_ns_ohos","pkgVersion":"1.0.1"},"flutter_udid":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/fluttertpc_flutter_udid-6b4b0306efd2b981b38baaf3ae0c8a38048fc244/ohos","pkgName":"flutter_udid","pkgVersion":"1.0.0"},"fluttertoast":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_fluttertoast-54a9ccaf32fbf0e53e0ce16ced890ebc49e04599/ohos","pkgName":"fluttertoast","pkgVersion":"1.0.0"},"fluwx":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/fluwx-5.7.1/ohos","pkgName":"fluwx","pkgVersion":"1.0.0"},"image_cropper":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_image_cropper-65c2c99891882ea59732959a672f3d5993a837bb/image_cropper/ohos","pkgName":"image_cropper","pkgVersion":"1.0.0"},"image_gallery_saver":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_image_gallery_saver-dd2f556450707bc9029ddfd475aa3142bb13aa98/ohos","pkgName":"image_gallery_saver","pkgVersion":"1.0.0"},"image_picker_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/image_picker/image_picker_ohos/ohos","pkgName":"image_picker_ohos","pkgVersion":"1.0.0"},"open_filex":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/fluttertpc_open_filex-e4f9a98a434ff18ffdb4db406b5798f88e5f3ded/ohos","pkgName":"open_filex","pkgVersion":"1.0.0"},"package_info_plus":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_plus_plugins-0eb41c70f961f124a987b8de59c9a26ca919af17/packages/package_info_plus/package_info_plus/ohos","pkgName":"package_info_plus","pkgVersion":"1.0.0"},"path_provider_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/path_provider/path_provider_ohos/ohos","pkgName":"path_provider_ohos","pkgVersion":"1.0.0"},"permission_handler_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_permission_handler-89666c740781ddf81498e55040e252a40dfdf926/permission_handler_ohos/ohos","pkgName":"permission_handler_ohos","pkgVersion":"1.0.0"},"photo_manager":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.8.2/ohos","pkgName":"photo_manager","pkgVersion":"1.0.0"},"save_file":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/save_file/ohos","pkgName":"save_file","pkgVersion":"1.0.0"},"shared_preferences_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/shared_preferences/shared_preferences_ohos/ohos","pkgName":"shared_preferences_ohos","pkgVersion":"1.0.0"},"sign_in_with_apple":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/fluttertpc_dart_packages-fe6c48868bd3f3ce8ad599ce9a8c0508be4b41f7/packages/sign_in_with_apple/sign_in_with_apple/ohos","pkgName":"sign_in_with_apple","pkgVersion":"1.0.0"},"sqflite":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_sqflite-a1f67c8d86367fbc35bd35052afae57192a575d2/sqflite/ohos","pkgName":"sqflite","pkgVersion":"1.0.0"},"tpns_flutter_plugin":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/library/TPNS-Flutter-Plugin-a5349371525462b1d1b6cfa4cf4d2a59503f1435/ohos","pkgName":"tpns_flutter_plugin","pkgVersion":"1.0.0"},"url_launcher_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/url_launcher/url_launcher_ohos/ohos","pkgName":"url_launcher_ohos","pkgVersion":"1.0.0"},"video_compress":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos","pkgName":"video_compress","pkgVersion":"1.0.0"},"video_player_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_packages-4528a997580f9115b2a7dc817e0b7199d05d9d82/packages/video_player/video_player_ohos/ohos","pkgName":"video_player_ohos","pkgVersion":"1.0.0"},"video_thumbnail":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/fluttertpc_video_thumbnail-fcc799b3af65f1679ebf0582e5a402564a147a18/ohos","pkgName":"video_thumbnail","pkgVersion":"1.0.0"},"webview_flutter_ohos":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/flutter_packages-0169009df421d55585d7926b60415cebeb07c002/packages/webview_flutter/webview_flutter_ohos/ohos","pkgName":"webview_flutter_ohos","pkgVersion":"1.0.0"},"@amap/amap_lbs_common":{"dependencyType":"har","isByteCodeHar":true,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_common@1.2.3/oh_modules/@amap/amap_lbs_common","pkgName":"@amap/amap_lbs_common","pkgVersion":"1.2.3"},"@amap/amap_lbs_location":{"dependencyType":"har","isByteCodeHar":true,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_location@1.2.3/oh_modules/@amap/amap_lbs_location","pkgName":"@amap/amap_lbs_location","pkgVersion":"1.2.3"},"@amap/amap_lbs_search":{"dependencyType":"har","isByteCodeHar":true,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_search@1.0.2/oh_modules/@amap/amap_lbs_search","pkgName":"@amap/amap_lbs_search","pkgVersion":"1.0.2"},"@amap/amap_lbs_map3d":{"dependencyType":"har","isByteCodeHar":true,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_map3d@2.2.5/oh_modules/@amap/amap_lbs_map3d","pkgName":"@amap/amap_lbs_map3d","pkgVersion":"2.2.5"},"bugly":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/bugly@0.5.0/oh_modules/bugly","pkgName":"bugly","pkgVersion":"0.5.0"},"@tencent/wechat_open_sdk":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@tencent+wechat_open_sdk@1.0.16/oh_modules/@tencent/wechat_open_sdk","pkgName":"@tencent/wechat_open_sdk","pkgVersion":"1.0.16"},"tpns":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/tpns@+wouqmj42evywigdweo6fbgb69jff40luj3ka6xrvuq=/oh_modules/tpns","pkgName":"tpns","pkgVersion":"1.0.5"},"dayjs":{"dependencyType":"other","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/dayjs@1.11.13/oh_modules/dayjs","pkgName":"dayjs","pkgVersion":"1.11.13"},"libvideocompress.so":{"dependencyType":"so","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/.pub-cache/git/fluttertpc_video_compress-2c4c43a99e1de669e7bf2c5dc34050cf527d9a2a/ohos/src/main/cpp/types/libvideocompress","pkgName":"libvideocompress.so","pkgVersion":"1.0.0"},"@ohos/crypto-js":{"dependencyType":"har","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@ohos+crypto-js@2.0.5/oh_modules/@ohos/crypto-js","pkgName":"@ohos/crypto-js","pkgVersion":"2.0.5"},"libAMapOpenLocation.so":{"dependencyType":"so","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_location@1.2.3/oh_modules/@amap/amap_lbs_location/src/main/cpp/types/libAMapOpenLocation.so","pkgName":"libAMapOpenLocation.so","pkgVersion":""},"libAMapOpenMap.so":{"dependencyType":"so","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@amap+amap_lbs_map3d@2.2.5/oh_modules/@amap/amap_lbs_map3d/src/main/cpp/types/libAMapOpenMap.so","pkgName":"libAMapOpenMap.so","pkgVersion":""},"libbuglynative.so":{"dependencyType":"so","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/bugly@0.5.0/oh_modules/bugly/src/main/cpp/libbuglynative/exportdir","pkgName":"libbuglynative.so","pkgVersion":"0.0.1"},"libbuglyxlog.so":{"dependencyType":"so","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/bugly@0.5.0/oh_modules/bugly/src/main/cpp/libbuglyxlog/exportdir","pkgName":"libbuglyxlog.so","pkgVersion":"0.0.1"},"libbuglydiag.so":{"dependencyType":"so","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/bugly@0.5.0/oh_modules/bugly/src/main/cpp/libbuglydiag/exportdir","pkgName":"libbuglydiag.so","pkgVersion":"0.0.1"},"pako":{"dependencyType":"other","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/pako@ws8ksynm+3shrzttcjbwhrz8rvle+fhkgg9yiyvi1uu=/oh_modules/pako","pkgName":"pako","pkgVersion":"2.1.0"},"@ohos/hypium":{"dependencyType":"other","isByteCodeHar":false,"pkgRootPath":"/Users/wangdongni/Desktop/Flutter-ReserveApp/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium","pkgName":"@ohos/hypium","pkgVersion":"1.0.6"}}}
import DeviceInfoPlusPlugin from "@normalized:N&&&device_info_plus/src/main/ets/components/plugin/DeviceInfoPlusOhosPlugin&1.0.0";
export default DeviceInfoPlusPlugin;
import { FlutterAbility, EventChannel, MethodChannel } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { FlutterEngine, EventSink, MethodCall, MethodResult } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import { GeneratedPluginRegistrant } from "@normalized:N&&&entry/src/main/ets/plugins/GeneratedPluginRegistrant&";
import type Want from "@ohos:app.ability.Want";
import type AbilityConstant from "@ohos:app.ability.AbilityConstant";
import hilog from "@ohos:hilog";
// import { CacheManager } from '../../../../oh_modules/tpns_flutter_plugin/src/main/ets/components/plugin/helper/CacheManager';
export default class EntryAbility extends FlutterAbility {
private TAG: string = "| com.naji.book |";
// 通道名称
public CHANNEL: string = "com.naji/book";
private channel: MethodChannel | null = null;
private eventChannel?: EventChannel;
private eventSink?: EventSink;
configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine);
GeneratedPluginRegistrant.registerWith(flutterEngine);
this.channel = new MethodChannel(flutterEngine.dartExecutor, this.CHANNEL);
this.eventChannel = new EventChannel(flutterEngine.dartExecutor, 'flutter.ohos.tpns/event_click');
this.eventChannel.setStreamHandler({
onListen(args: object, events: EventSink): void {
this.eventSink = events;
},
onCancel(args: object): void {
this.eventSink = undefined;
}
});
}
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
super.onCreate(want, launchParam);
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate' + JSON.stringify(want));
if (want && want.parameters) {
try {
// want判断消息是否是腾讯云推送的消息
// const data = TPushHelper.prototype.parseNotificationMessage(want);
const data = want.parameters;
if (data != null) {
hilog.info(0x0000, 'testTag', '%{public}s', "onCreate" + JSON.stringify(data));
// 或者使用 Object.keys 方法遍历
Object.keys(data).forEach(key => {
if (key.toString() === 'tpnsChanel') {
// 使用 EventSink 发送数据后,dart断的事件监听回调会收到发送的数据。
const value = data[key];
console.log(`Key: ${key}, Value: ${typeof value === 'object' ? JSON.stringify(value) : value}`);
// this.eventSink?.success(value);
// this.channel?.invokeMethod("getIntent",value)
// 设置方法调用处理器,接收Flutter的指令
this.channel?.setMethodCallHandler({
onMethodCall: (call: MethodCall, result: MethodResult) => {
// console.log(`${TAG} 收到Flutter调用:${call.method},参数:${JSON.stringify(call.args)}`);
// 根据Flutter传的指令名,分情况处理
switch (call.method) {
// 处理"读取数据"指令
case "getIntent":
result.success(value);
break;
// 未知指令,返回"未实现"
default:
result.notImplemented();
break;
}
}
});
}
});
}
else {
hilog.info(0x0000, 'testTag', 'EntryAbility data was null');
this.eventSink?.error(0x0000.toString(), 'EntryAbility data was null', null);
}
}
catch (err) {
hilog.error(0x0000, 'testTag', 'TPushHelper parseNotificationMessage exception', err);
this.eventSink?.error(0x0000.toString(), 'TPushHelper parseNotificationMessage exception', err);
}
}
else {
hilog.info(0x0000, 'testTag', 'EntryAbility want or want.parameters was null');
this.eventSink?.error(0x0000.toString(), 'EntryAbility want or want.parameters was null', null);
}
// hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate' + JSON.stringify(want));
// if(want && want.parameters ){
// try {
// const data = TPushHelper.prototype.parseNotificationMessage(want);
// if (data) {
// hilog.info(0x0000, 'testTag', 'EntryAbility Receive notificationMessage:' + JSON.stringify(data));
// } else {
// hilog.info(0x0000, 'testTag', 'EntryAbility data was null');
// }
// } catch (err) {
// hilog.error(0x0000, 'testTag', 'TPushHelper parseNotificationMessage exception',err);
// }
// }else{
// hilog.info(0x0000, 'testTag', 'EntryAbility want or want.parameters was null');
// }
// flutter版本更新后使用 getFlutterEngine().getDartExecutor().getBinaryMessenger()代替 getFlutterView()
// const channel = MethodChannel(this.getFlutterEngine()?.getDartExecutor()?.getBinaryMessenger()!!,this.CHANNEL,StandardMethodCodec.INSTANCE);
// var channel = MethodChannel(getFlutterEngine()?.getDartExecutor()?.getBinaryMessenger()!!, CHANNEL)
//
// // 这里要获取启动时的intent
// val uri = intent.data
// if(intent.data != null){
// Log.i("flutter","onCreate"+intent.data.toString())
// }
// val paramsMap = mutableMapOf<String, String>()
// if (uri != null) {
// val set = uri.queryParameterNames
// for (name in set) {
// val value = uri.getQueryParameter(name)
// paramsMap[name.toString()] = value.toString()
// }
// }
//
// intentMap = paramsMap
//
// this.channel?.setMethodCallHandler((){
//
// })
// channel.setMethodCallHandler { call, result ->
// Log.i(TAG,intentMap.toString());
// when (call.method) {
// "getIntent" -> get_intent(call, result)
// }
// }
}
onNewWant(want: Want, launchParams: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onNewWant' + JSON.stringify(want));
if (want && want.parameters) {
try {
// want判断消息是否是腾讯云推送的消息
// const data = TPushHelper.prototype.parseNotificationMessage(want);
const data = want.parameters;
if (data != null) {
hilog.info(0x0000, 'testTag', '%{public}s', "onNewWant" + JSON.stringify(data));
// 或者使用 Object.keys 方法遍历
Object.keys(data).forEach(key => {
if (key.toString() === 'tpnsChanel') {
// 使用 EventSink 发送数据后,dart断的事件监听回调会收到发送的数据。
const value = data[key];
console.log(`Key: ${key}, Value: ${typeof value === 'object' ? JSON.stringify(value) : value}`);
this.eventSink?.success(value);
this.channel?.invokeMethod("getIntent", value);
}
});
}
else {
hilog.info(0x0000, 'testTag', 'EntryAbility data was null');
this.eventSink?.error(0x0000.toString(), 'EntryAbility data was null', null);
}
}
catch (err) {
hilog.error(0x0000, 'testTag', 'TPushHelper parseNotificationMessage exception', err);
this.eventSink?.error(0x0000.toString(), 'TPushHelper parseNotificationMessage exception', err);
}
}
else {
hilog.info(0x0000, 'testTag', 'EntryAbility want or want.parameters was null');
this.eventSink?.error(0x0000.toString(), 'EntryAbility want or want.parameters was null', null);
}
}
}
if (!("finalizeConstruction" in ViewPU.prototype)) {
Reflect.set(ViewPU.prototype, "finalizeConstruction", () => { });
}
interface Index_Params {
context?;
viewId?: string;
}
import type common from "@ohos:app.ability.common";
import { FlutterPage } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
let storage = LocalStorage.getShared();
const EVENT_BACK_PRESS = 'EVENT_BACK_PRESS';
class Index extends ViewPU {
constructor(parent, params, __localStorage, elmtId = -1, paramsLambda = undefined, extraInfo) {
super(parent, __localStorage, elmtId, extraInfo);
if (typeof paramsLambda === "function") {
this.paramsGenerator_ = paramsLambda;
}
this.context = getContext(this) as common.UIAbilityContext;
this.setInitiallyProvidedValue(params);
this.finalizeConstruction();
}
setInitiallyProvidedValue(params: Index_Params) {
if (params.context !== undefined) {
this.context = params.context;
}
}
updateStateVars(params: Index_Params) {
}
purgeVariableDependenciesOnElmtId(rmElmtId) {
this.__viewId.purgeDependencyOnElmtId(rmElmtId);
}
aboutToBeDeleted() {
this.__viewId.aboutToBeDeleted();
SubscriberManager.Get().delete(this.id__());
this.aboutToBeDeletedInternal();
}
private context;
private __viewId: ObservedPropertyAbstractPU<string> = this.createLocalStorageLink<string>('viewId', "", "viewId");
get viewId() {
return this.__viewId.get();
}
set viewId(newValue: string) {
this.__viewId.set(newValue);
}
initialRender() {
this.observeComponentCreation2((elmtId, isInitialRender) => {
Column.create();
}, Column);
{
this.observeComponentCreation2((elmtId, isInitialRender) => {
if (isInitialRender) {
let componentCall = new FlutterPage(this, { viewId: this.viewId }, undefined, elmtId, () => { }, { page: "entry/src/main/ets/pages/Index.ets", line: 16, col: 7 });
ViewPU.create(componentCall);
let paramsLambda = () => {
return {
viewId: this.viewId
};
};
componentCall.paramsGenerator_ = paramsLambda;
}
else {
this.updateStateVarsOfChildByElmtId(elmtId, {
viewId: this.viewId
});
}
}, { name: "FlutterPage" });
}
Column.pop();
}
onBackPress(): boolean {
this.context.eventHub.emit(EVENT_BACK_PRESS);
return true;
}
rerender() {
this.updateDirtyElements();
}
static getEntryName(): string {
return "Index";
}
}
if (storage && storage.routeName != undefined && storage.storage != undefined) {
registerNamedRoute(() => new Index(undefined, {}, storage.useSharedStorage ? LocalStorage.getShared() : storage.storage), storage.routeName, { bundleName: "com.naji.one_key_harmonyOS", moduleName: "entry", pagePath: "pages/Index", pageFullPath: "entry/src/main/ets/pages/Index", integratedHsp: "false", moduleType: "followWithHap" });
}
else if (storage && storage.routeName != undefined && storage.storage == undefined) {
registerNamedRoute(() => new Index(undefined, {}, storage.useSharedStorage ? LocalStorage.getShared() : storage.storage), storage.routeName, { bundleName: "com.naji.one_key_harmonyOS", moduleName: "entry", pagePath: "pages/Index", pageFullPath: "entry/src/main/ets/pages/Index", integratedHsp: "false", moduleType: "followWithHap" });
}
else if (storage && storage.routeName == undefined && storage.storage != undefined) {
registerNamedRoute(() => new Index(undefined, {}, storage.useSharedStorage ? LocalStorage.getShared() : storage.storage), "", { bundleName: "com.naji.one_key_harmonyOS", moduleName: "entry", pagePath: "pages/Index", pageFullPath: "entry/src/main/ets/pages/Index", integratedHsp: "false", moduleType: "followWithHap" });
}
else if (storage && storage.useSharedStorage != undefined) {
registerNamedRoute(() => new Index(undefined, {}, storage.useSharedStorage ? LocalStorage.getShared() : undefined), "", { bundleName: "com.naji.one_key_harmonyOS", moduleName: "entry", pagePath: "pages/Index", pageFullPath: "entry/src/main/ets/pages/Index", integratedHsp: "false", moduleType: "followWithHap" });
}
else {
registerNamedRoute(() => new Index(undefined, {}, storage), "", { bundleName: "com.naji.one_key_harmonyOS", moduleName: "entry", pagePath: "pages/Index", pageFullPath: "entry/src/main/ets/pages/Index", integratedHsp: "false", moduleType: "followWithHap" });
}
import { Log } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { FlutterEngine } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import AppUpdateCheckPlugin from "@normalized:N&&&app_update_check_plugin/index&1.0.0";
import AudioplayersPlugin from "@normalized:N&&&audioplayers_ohos/index&1.0.0";
import ConnectivityPlugin from "@normalized:N&&&connectivity_plus/index&1.0.0";
import AMapFlutterLocationPlugin from "@normalized:N&&&csp_amap_flutter_location/index&1.0.0";
import CspAmapFlutterMapPlugin from "@normalized:N&&&csp_amap_flutter_map/index&1.0.0";
import DeviceInfoPlusPlugin from "@normalized:N&&&device_info_plus/index&1.0.0";
import FlutterAppIconBadgePlugin from "@normalized:N&&&flutter_app_icon_badge/index&1.0.0";
import FlutterBarcodeScannerOhosPlugin from "@normalized:N&&&flutter_barcode_scanner_ohos/index&1.0.0";
import FlutterBuglyPlugin from "@normalized:N&&&flutter_bugly/index&1.0.0";
import FlutterDocumentPickerPlugin from "@normalized:N&&&flutter_document_picker/Index&1.0.0";
import FlutterDownloaderPlugin from "@normalized:N&&&flutter_downloader/Index&1.0.0";
import FlutterImageCompressOhosPlugin from "@normalized:N&&&flutter_image_compress_ohos/index&1.0.0";
import InAppWebViewFlutterPlugin from "@normalized:N&&&flutter_inappwebview_ohos/index&1.0.0";
import FlutterKeyboardVisibilityPlugin from "@normalized:N&&&flutter_keyboard_visibility/index&1.0.0";
import FlutterNativeContactPickerPlugin from "@normalized:N&&&flutter_native_contact_picker/index&1.0.0";
import FlutterNativeImagePlugin from "@normalized:N&&&flutter_native_image/index&1.0.0";
import FlutterSmsPlugin from "@normalized:N&&&flutter_sms/index&1.0.0";
import FlutterStatusbarcolorOhosPlugin from "@normalized:N&&&flutter_statusbarcolor_ns_ohos/index&1.0.1";
import FlutterUdidPlugin from "@normalized:N&&&flutter_udid/Index&1.0.0";
import FluttertoastPlugin from "@normalized:N&&&fluttertoast/index&1.0.0";
import FluwxPlugin from "@normalized:N&&&fluwx/index&1.0.0";
import ImagecropperOhosPlugin from "@normalized:N&&&image_cropper/index&1.0.0";
import ImageGallerySaverPlugin from "@normalized:N&&&image_gallery_saver/index&1.0.0";
import ImagePickerPlugin from "@normalized:N&&&image_picker_ohos/index&1.0.0";
import OpenFilePlugin from "@normalized:N&&&open_filex/Index&1.0.0";
import PackageInfoPlugin from "@normalized:N&&&package_info_plus/index&1.0.0";
import PathProviderPlugin from "@normalized:N&&&path_provider_ohos/index&1.0.0";
import PermissionHandlerPlugin from "@normalized:N&&&permission_handler_ohos/index&1.0.0";
import PhotoManagerPlugin from "@normalized:N&&&photo_manager/index&1.0.0";
import SaveFilePlugin from "@normalized:N&&&save_file/index&1.0.0";
import SharedPreferencesPlugin from "@normalized:N&&&shared_preferences_ohos/index&1.0.0";
import SignInWithApplePlugin from "@normalized:N&&&sign_in_with_apple/Index&1.0.0";
import SqflitePlugin from "@normalized:N&&&sqflite/index&1.0.0";
import XgFlutterPlugin from "@normalized:N&&&tpns_flutter_plugin/index&1.0.0";
import UrlLauncherPlugin from "@normalized:N&&&url_launcher_ohos/index&1.0.0";
import VideoCompressPlugin from "@normalized:N&&&video_compress/index&1.0.0";
import VideoPlayerPlugin from "@normalized:N&&&video_player_ohos/Index&1.0.0";
import VideoThumbnaiOhosPlugin from "@normalized:N&&&video_thumbnail/index&1.0.0";
import WebViewFlutterPlugin from "@normalized:N&&&webview_flutter_ohos/Index&1.0.0";
/**
* Generated file. Do not edit.
* This file is generated by the Flutter tool based on the
* plugins that support the Ohos platform.
*/
const TAG = "GeneratedPluginRegistrant";
export class GeneratedPluginRegistrant {
static registerWith(flutterEngine: FlutterEngine) {
try {
flutterEngine.getPlugins()?.add(new AppUpdateCheckPlugin());
flutterEngine.getPlugins()?.add(new AudioplayersPlugin());
flutterEngine.getPlugins()?.add(new ConnectivityPlugin());
flutterEngine.getPlugins()?.add(new AMapFlutterLocationPlugin());
flutterEngine.getPlugins()?.add(new CspAmapFlutterMapPlugin());
flutterEngine.getPlugins()?.add(new DeviceInfoPlusPlugin());
flutterEngine.getPlugins()?.add(new FlutterAppIconBadgePlugin());
flutterEngine.getPlugins()?.add(new FlutterBarcodeScannerOhosPlugin());
flutterEngine.getPlugins()?.add(new FlutterBuglyPlugin());
flutterEngine.getPlugins()?.add(new FlutterDocumentPickerPlugin());
flutterEngine.getPlugins()?.add(new FlutterDownloaderPlugin());
flutterEngine.getPlugins()?.add(new FlutterImageCompressOhosPlugin());
flutterEngine.getPlugins()?.add(new InAppWebViewFlutterPlugin());
flutterEngine.getPlugins()?.add(new FlutterKeyboardVisibilityPlugin());
flutterEngine.getPlugins()?.add(new FlutterNativeContactPickerPlugin());
flutterEngine.getPlugins()?.add(new FlutterNativeImagePlugin());
flutterEngine.getPlugins()?.add(new FlutterSmsPlugin());
flutterEngine.getPlugins()?.add(new FlutterStatusbarcolorOhosPlugin());
flutterEngine.getPlugins()?.add(new FlutterUdidPlugin());
flutterEngine.getPlugins()?.add(new FluttertoastPlugin());
flutterEngine.getPlugins()?.add(new FluwxPlugin());
flutterEngine.getPlugins()?.add(new ImagecropperOhosPlugin());
flutterEngine.getPlugins()?.add(new ImageGallerySaverPlugin());
flutterEngine.getPlugins()?.add(new ImagePickerPlugin());
flutterEngine.getPlugins()?.add(new OpenFilePlugin());
flutterEngine.getPlugins()?.add(new PackageInfoPlugin());
flutterEngine.getPlugins()?.add(new PathProviderPlugin());
flutterEngine.getPlugins()?.add(new PermissionHandlerPlugin());
flutterEngine.getPlugins()?.add(new PhotoManagerPlugin());
flutterEngine.getPlugins()?.add(new SaveFilePlugin());
flutterEngine.getPlugins()?.add(new SharedPreferencesPlugin());
flutterEngine.getPlugins()?.add(new SignInWithApplePlugin());
flutterEngine.getPlugins()?.add(new SqflitePlugin());
flutterEngine.getPlugins()?.add(new XgFlutterPlugin());
flutterEngine.getPlugins()?.add(new UrlLauncherPlugin());
flutterEngine.getPlugins()?.add(new VideoCompressPlugin());
flutterEngine.getPlugins()?.add(new VideoPlayerPlugin());
flutterEngine.getPlugins()?.add(new VideoThumbnaiOhosPlugin());
flutterEngine.getPlugins()?.add(new WebViewFlutterPlugin());
}
catch (e) {
Log.e(TAG, "Tried to register plugins with FlutterEngine ("
+ flutterEngine
+ ") failed.");
Log.e(TAG, "Received exception while registering", e);
}
}
}
import FlutterBuglyPlugin from "@normalized:N&&&flutter_bugly/src/main/ets/components/plugin/FlutterBuglyPlugin&1.0.0";
export default FlutterBuglyPlugin;
import { MethodChannel, } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { FlutterPlugin, FlutterPluginBinding, MethodCall, MethodCallHandler, MethodResult } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import { Bugly, BuglyBuilder } from "@normalized:N&&&bugly/Index&0.5.0";
export default class FlutterBuglyPlugin implements FlutterPlugin, MethodCallHandler {
private channel: MethodChannel | null = null;
constructor() {
}
getUniqueClassName(): string {
return "FlutterBuglyPlugin";
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.channel = new MethodChannel(binding.getBinaryMessenger(), "crazecoder/flutter_bugly");
this.channel.setMethodCallHandler(this);
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
if (this.channel != null) {
this.channel.setMethodCallHandler(null);
}
}
public onMethodCall(call: MethodCall, result: MethodResult): void {
switch (call.method) {
case "initBugly":
this.initBugly(call, result);
break;
case "setUserId":
this.setUserId(call, result);
break;
case "setDeviceId":
this.setDeviceId(call, result);
break;
case "setDeviceModel":
this.setDeviceModel(call, result);
break;
case "putUserData":
this.putUserData(call, result);
break;
case "postCatchedException":
this.postCatchedException(call, result);
break;
default:
result.notImplemented();
break;
}
}
private async initBugly(call: MethodCall, result: MethodResult): Promise<void> {
let builder = new BuglyBuilder();
builder.appId = call.argument("appId") as string; // 必填,Bugly产品信息中的APP ID
builder.appKey = call.argument("appKey") as string; // 必填,Bugly产品信息中的APP KEY
builder.deviceId = call.argument("deviceId") as string; // 必填,设备ID,应保证设备ID对不同设备唯一
builder.platform = BuglyBuilder.PLATFORM_PRO; // 必填,设置上报平台,专业版本需设置为[BuglyBuilder.PLATFORM_PRO]
// 选填,业务的 App 版本
if (call.hasArgument("appVersion")) {
builder.appVersion = call.argument("appVersion") as string;
}
else {
builder.appVersion = "1.0.0";
}
// 选填,业务 App 版本的构建号
if (call.hasArgument("buildNum")) {
builder.buildNum = call.argument("buildNum") as string;
}
else {
builder.buildNum = "0";
}
// 选填,业务 App 渠道
if (call.hasArgument("channel")) {
builder.appChannel = call.argument("channel") as string;
}
else {
builder.appChannel = "website";
}
// 选填,用户 ID,如不设置则为空
if (call.hasArgument("userId")) {
builder.userId = call.argument("userId") as string;
}
else {
builder.userId = "";
}
// 选填,机型,如不设置则为空
if (call.hasArgument("deviceModel")) {
builder.deviceModel = call.argument("deviceModel") as string;
}
else {
builder.deviceModel = "";
}
// 选填,默认开启,开启后 Bugly SDK 会打印更多调试日志,线上版本可关闭
if (call.hasArgument("debugMode")) {
builder.debugMode = call.argument("debugMode") as boolean;
}
else {
builder.debugMode = true;
}
// 选填,延迟初始化时间,单位 ms
if (call.hasArgument("initDelay")) {
builder.initDelay = call.argument("initDelay") as number;
}
else {
builder.initDelay = 0;
}
await Bugly.init(getContext(this), builder); // 如果需等待Bugly完全初始化完成,使用await Bugly.init(context, builder);
result.success("Bugly initialization successful");
}
// 设置用户 ID
private setUserId(call: MethodCall, result: MethodResult): void {
const userId = call.argument("userId") as string;
Bugly.updateUserId(userId);
result.success(null);
}
// 设置设备ID
private setDeviceId(call: MethodCall, result: MethodResult): void {
const deviceId = call.argument("deviceId") as string;
Bugly.updateDeviceId(deviceId);
result.success(null);
}
// 设置设备型号
private setDeviceModel(call: MethodCall, result: MethodResult): void {
const deviceModel = call.argument("deviceModel") as string;
Bugly.updateDeviceModel(deviceModel);
result.success(null);
}
// 设置设备型号
private putUserData(call: MethodCall, result: MethodResult): void {
const key = call.argument("key") as string;
const value = call.argument("value") as string;
Bugly.putUserData(key, value);
result.success(null);
}
// 上报自定义异常
private postCatchedException(call: MethodCall, result: MethodResult): void {
let name: string | null = null;
let message: string | null = null;
let stack: string | null = null;
if (call.hasArgument("crash_type")) {
name = call.argument("crash_type") as string;
}
if (call.hasArgument("crash_message")) {
message = call.argument("crash_message") as string;
}
if (call.hasArgument("crash_detail")) {
stack = call.argument("crash_detail") as string;
}
Bugly.postCustomError(name, message, stack);
result.success(null);
}
}
import { FlutterDownloaderPlugin } from "@normalized:N&&&flutter_downloader/src/main/ets/components/FlutterDownloaderPlugin&1.0.0";
export default FlutterDownloaderPlugin;
/*
* Copyright (c) 2024 SwanLink (Jiangsu) Technology Development Co., LTD.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export enum DownloadStatus {
UNDEFINED = 0,
ENQUEUED = 1,
RUNNING = 2,
COMPLETE = 3,
FAILED = 4,
CANCELED = 5,
PAUSED = 6
}
/*
* Copyright (c) 2024 SwanLink (Jiangsu) Technology Development Co., LTD.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const mimeTypeMap: Map<string, string> = new Map([
["aac", "audio/aac"],
["abw", "application/x-abiword"],
["apng", "image/apng"],
["arc", "application/x-freearc"],
["avif", "image/avif"],
["avi", "video/x-msvideo"],
["azw", "application/vnd.amazon.ebook"],
["bin", "application/octet-stream"],
["bmp", "image/bmp"],
["bz", "application/x-bzip"],
["bz2", "application/x-bzip2"],
["cda", "application/x-cdf"],
["csh", "application/x-csh"],
["css", "text/css"],
["csv", "text/csv"],
["doc", "application/msword"],
["docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
["eot", "application/vnd.ms-fontobject"],
["epub", "application/epub+zip"],
["gz", "application/gzip"],
["gif", "image/gif"],
["htm", "text/html"],
["html", "text/html"],
["ico", "image/vnd.microsoft.icon"],
["ics", "text/calendar"],
["jar", "application/java-archive"],
["jpeg", "image/jpeg"],
["jpg", "image/jpeg"],
["js", "text/javascript"],
["json", "application/json"],
["jsonld", "application/ld+json"],
["mid", "audio/midi"],
["midi", "audio/x-midi"],
["mjs", "text/javascript"],
["mp3", "audio/mpeg"],
["mp4", "video/mp4"],
["mpeg", "video/mpeg"],
["mpkg", "application/vnd.apple.installer+xml"],
["odp", "application/vnd.oasis.opendocument.presentation"],
["ods", "application/vnd.oasis.opendocument.spreadsheet"],
["odt", "application/vnd.oasis.opendocument.text"],
["oga", "audio/ogg"],
["ogv", "video/ogg"],
["ogx", "application/ogg"],
["opus", "audio/opus"],
["otf", "font/otf"],
["png", "image/png"],
["pdf", "application/pdf"],
["php", "application/x-httpd-php"],
["ppt", "application/vnd.ms-powerpoint"],
["pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"],
["rar", "application/vnd.rar"],
["rtf", "application/rtf"],
["sh", "application/x-sh"],
["svg", "image/svg+xml"],
["tar", "application/x-tar"],
["tif", "image/tiff"],
["tiff", "image/tiff"],
["ts", "video/mp2t"],
["ttf", "font/ttf"],
["txt", "text/plain"],
["vsd", "application/vnd.visio"],
["wav", "audio/wav"],
["weba", "audio/webm"],
["webm", "video/webm"],
["webp", "image/webp"],
["woff", "font/woff"],
["woff2", "font/woff2"],
["xhtml", "application/xhtml+xml"],
["xls", "application/vnd.ms-excel"],
["xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
["xml", "application/xml"],
["xul", "application/vnd.mozilla.xul+xml"],
["zip", "application/zip"],
["3gp", "video/3gpp"],
["3g2", "video/3gpp2"],
["7z", "application/x-7z-compressed"],
]);
export function getMimeType(filename: string): string {
let newFilename = filename;
let index = newFilename.lastIndexOf('/');
if (index !== -1) {
newFilename = newFilename.substring(index + 1, newFilename.length);
}
index = newFilename.lastIndexOf('.');
if (index == -1) {
return "";
}
let fileExtension = newFilename.substring(index + 1, newFilename.length);
let mimeType = mimeTypeMap.get(fileExtension);
return mimeType == undefined ? "" : mimeType;
}
import { FlutterCallbackInformation, FlutterEngine, FlutterInjector } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { AbilityAware, AbilityPluginBinding, Any, FlutterPlugin, FlutterPluginBinding, MethodCall, MethodCallHandler } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import MethodChannel from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel&1.0.0-2317265cd5";
import type { MethodResult } from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel&1.0.0-2317265cd5";
import preferences from "@ohos:data.preferences";
import fs from "@ohos:file.fs";
import { TaskDao } from "@normalized:N&&&flutter_downloader/src/main/ets/components/TaskDao&1.0.0";
import { TaskDbHelper } from "@normalized:N&&&flutter_downloader/src/main/ets/components/TaskDbHelper&1.0.0";
import { DownloadStatus } from "@normalized:N&&&flutter_downloader/src/main/ets/components/DownloadStatus&1.0.0";
import type { ValuesBucket as ValuesBucket } from "@ohos:data.ValuesBucket";
import { TaskEntry } from "@normalized:N&&&flutter_downloader/src/main/ets/components/TaskEntry&1.0.0";
import fileUri from "@ohos:file.fileuri";
import picker from "@ohos:file.picker";
import type common from "@ohos:app.ability.common";
import type Want from "@ohos:app.ability.Want";
import wantConstant from "@ohos:app.ability.wantConstant";
import type { BusinessError as BusinessError } from "@ohos:base";
import request from "@ohos:request";
import Logger from "@normalized:N&&&flutter_downloader/src/main/ets/components/Logger&1.0.0";
import { DartCallback } from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/embedding/engine/dart/DartExecutor&1.0.0-2317265cd5";
const invalidTaskId = "invalid_task_id";
const invalidStatus = "invalid_status";
const invalidData = "invalid_data";
const TAG = 'FlutterDownloaderPlugin';
const CHANNEL = "vn.hunghd/downloader";
export class FlutterDownloaderPlugin implements FlutterPlugin, MethodCallHandler, AbilityAware {
public static readonly SHARED_PREFERENCES_KEY = 'vn.hunghd.downloader.pref';
public static readonly CALLBACK_DISPATCHER_HANDLE_KEY = "callback_dispatcher_handle_key";
private flutterChannel: MethodChannel | null = null;
private backgroundChannel: MethodChannel | null = null;
private flutterPluginBinding: FlutterPluginBinding | null = null;
private taskDao: TaskDao | null = null;
private context: common.UIAbilityContext | null = null;
private callbackHandle: number = 0;
private backgroundFlutterEngine: FlutterEngine | null = null;
private debugMode: number = 0;
private tasks: Set<string> = new Set();
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.flutterPluginBinding = binding;
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
this.onDetachedFromAbility();
this.context = null;
this.flutterPluginBinding = null;
}
onAttachedToAbility(binding: AbilityPluginBinding): void {
if (this.flutterChannel != null) {
return;
}
this.context = binding.getAbility().context;
this.flutterChannel =
new MethodChannel(this.flutterPluginBinding!.getBinaryMessenger(), CHANNEL);
this.flutterChannel.setMethodCallHandler(this);
this.taskDao = new TaskDao(TaskDbHelper.getInstance(this.context));
}
onDetachedFromAbility(): void {
if (this.flutterChannel != null) {
this.flutterChannel.setMethodCallHandler(null);
this.flutterChannel = null;
}
if (this.backgroundChannel != null) {
this.backgroundChannel.setMethodCallHandler(null);
this.backgroundChannel = null;
}
}
getUniqueClassName(): string {
return TAG;
}
onMethodCall(call: MethodCall, result: MethodResult): void {
Logger.info(TAG, `method: ${call.method}`);
switch (call.method) {
case 'initialize':
this.initialize(call, result);
break;
case 'registerCallback':
this.registerCallback(call, result);
break;
case 'enqueue':
this.enqueue(call, result);
break;
case 'loadTasks':
this.loadTasks(call, result);
break;
case 'loadTasksWithRawQuery':
this.loadTasksWithRawQuery(call, result);
break;
case 'cancel':
this.cancel(call, result);
break;
case 'cancelAll':
this.cancelAll(call, result);
break;
case 'pause':
this.pause(call, result);
break;
case 'resume':
this.resume(call, result);
break;
case 'retry':
this.retry(call, result);
break;
case 'open':
this.open(call, result);
break;
case 'remove':
this.remove(call, result);
break;
default:
result.notImplemented();
break;
}
}
private remove(call: MethodCall, result: MethodResult) {
const taskId = this.requireArgument<string>(call, "task_id");
const shouldDeleteContent = this.requireArgument<boolean>(call, "should_delete_content");
const task = this.taskDao!.loadTask(taskId);
if (task != null) {
if (task.status == DownloadStatus.ENQUEUED || task.status == DownloadStatus.RUNNING) {
request.agent.remove(taskId, (err: BusinessError) => {
if (err) {
Logger.error(TAG, `Failed to removing a download task, Code: ${err.code}, message: ${err.message}`);
return;
}
Logger.info(TAG, `Succeeded in removing a download task.`);
});
}
if (shouldDeleteContent) {
const saveFilePath = task.savedDir + '/' + task.filename;
if (fs.accessSync(saveFilePath)) {
fs.unlink(saveFilePath).then(() => {
Logger.info(TAG, "remove file succeed");
}).catch((err: BusinessError) => {
Logger.error(TAG, "remove file failed with error message: " + err.message + ", error code: " + err.code);
});
}
}
this.taskDao!.deleteTask(taskId);
result.success(null);
}
else {
result.error(invalidTaskId, "not found task corresponding to given task id", null);
}
}
private open(call: MethodCall, result: MethodResult) {
const taskId = this.requireArgument<string>(call, "task_id");
const task = this.taskDao!.loadTask(taskId);
if (task == null) {
result.error(invalidTaskId, "not found task with id $taskId", null);
return;
}
if (task.status != DownloadStatus.COMPLETE) {
result.error(invalidStatus, "only completed tasks can be opened", null);
return;
}
this.openFile(`${task.savedDir}/${task.filename}`, task.mimeType).then(openResult => {
result.success(openResult);
}).catch((e: BusinessError) => {
result.success(false);
});
}
private async retry(call: MethodCall, result: MethodResult): Promise<void> {
const taskId = this.requireArgument<string>(call, "task_id");
const task = this.taskDao!.loadTask(taskId);
if (task != null) {
if (task.status == DownloadStatus.FAILED || task.status == DownloadStatus.CANCELED) {
const newTaskId = await this.downloadFile(task.url, task.headers, task.filename!, task.savedDir, task.allowCellular, task.showNotification, task.openFileFromNotification);
result.success(newTaskId);
this.sendUpdateProgress(newTaskId, DownloadStatus.ENQUEUED, task.progress);
const values: ValuesBucket = {};
values[TaskEntry.COLUMN_NAME_TASK_ID] = newTaskId;
values[TaskEntry.COLUMN_NAME_STATUS] = DownloadStatus.ENQUEUED;
values[TaskEntry.COLUMN_NAME_PROGRESS] = task.progress;
values[TaskEntry.COLUMN_NAME_RESUMABLE] = 0;
this.taskDao!.updateTask(taskId, values);
}
else {
result.error(invalidStatus, "only failed and canceled task can be retried", null);
}
}
else {
result.error(invalidTaskId, "not found task corresponding to given task id", null);
}
}
private resume(call: MethodCall, result: MethodResult) {
const taskId = this.requireArgument<string>(call, "task_id");
const task = this.taskDao!.loadTask(taskId);
if (task != null) {
if (task.status == DownloadStatus.PAUSED) {
request.agent.getTask(this.context!, taskId).then((downloadTask: request.agent.Task) => {
downloadTask.resume((err: BusinessError) => {
if (err) {
Logger.error(TAG, `Failed to resume the download task, Code: ${err.code}, message: ${err.message}`);
result.error(invalidData, `Failed to resume the download task, Code: ${err.code}, message: ${err.message}`, null);
return;
}
Logger.info(TAG, `Succeeded in resuming a download task. `);
result.success(taskId);
});
});
}
else {
Logger.error(TAG, "only paused task can be resumed");
result.error(invalidStatus, "only paused task can be resumed", null);
}
}
else {
Logger.error(TAG, "not found task corresponding to given task id");
result.error(invalidTaskId, "not found task corresponding to given task id", null);
}
}
private pause(call: MethodCall, result: MethodResult) {
const taskId = this.requireArgument<string>(call, "task_id");
request.agent.getTask(this.context!, taskId).then((task: request.agent.Task) => {
task.pause((err: BusinessError) => {
if (err) {
Logger.error(TAG, `Failed to pause the download task, Code: ${err.code}, message: ${err.message}`);
return;
}
Logger.info(TAG, `Succeeded in pausing a download task. `);
});
});
result.success(null);
}
private cancel(call: MethodCall, result: MethodResult) {
const taskId = this.requireArgument<string>(call, "task_id");
this.cancelTask(taskId);
result.success(null);
}
private cancelAll(call: MethodCall, result: MethodResult) {
for (const taskId of this.tasks) {
this.cancelTask(taskId);
}
result.success(null);
}
private loadTasksWithRawQuery(call: MethodCall, result: MethodResult) {
const query = this.requireArgument<string>(call, "query");
const tasks = this.taskDao!.loadTasksWithRawQuery(query);
const array: Array<Record<string, Any>> = new Array();
for (const task of tasks) {
const item: Record<string, Any> = {
"task_id": task.taskId,
"status": task.status,
"progress": task.progress,
"url": task.url,
"file_name": task.filename,
"saved_dir": task.savedDir,
"time_created": task.timeCreated,
"allow_cellular": task.allowCellular
};
array.push(item);
}
result.success(array);
}
private async loadTasks(call: MethodCall, result: MethodResult) {
const tasks = await this.taskDao!.loadAllTasks();
const array: Array<Record<string, Any>> = new Array();
for (const task of tasks) {
const item: Record<string, Any> = {
"task_id": task.taskId,
"status": task.status,
"progress": task.progress,
"url": task.url,
"file_name": task.filename,
"saved_dir": task.savedDir,
"time_created": task.timeCreated,
"allow_cellular": task.allowCellular
};
array.push(item);
this.tasks.add(task.taskId);
}
result.success(array);
}
private requireArgument<T>(call: MethodCall, key: string): T {
const value: Any = call.argument(key);
if (value === null || value === undefined) {
throw new Error(`Required key '${key}' was null`);
}
return value as T; // 使用类型断言返回值
}
private async enqueue(call: MethodCall, result: MethodResult): Promise<void> {
const url = this.requireArgument<string>(call, 'url');
const savedDir = this.requireArgument<string>(call, 'saved_dir');
const filename: string = call.argument('file_name') ?? url.substring(url.lastIndexOf("/") + 1, url.length);
const headers = this.requireArgument<string>(call, 'headers');
const showNotification = this.requireArgument<boolean>(call, 'show_notification');
// 如果showNotification为false则提示:鸿蒙不支持将showNotification设置为false。(鸿蒙官方暂不支持该属性)
if (!showNotification) {
result.error("8", "ohos does not support setting showNotification to false.", "ohos does not support setting showNotification to false.");
return;
}
const openFileFromNotification = this.requireArgument<boolean>(call, 'open_file_from_notification');
const allowCellular = this.requireArgument<boolean>(call, 'allow_cellular');
const taskId = await this.downloadFile(url, headers, filename, savedDir, allowCellular, showNotification, openFileFromNotification);
result.success(taskId);
this.sendUpdateProgress(taskId, DownloadStatus.ENQUEUED, 0);
this.taskDao!.insertOrUpdateNewTask(taskId, url, DownloadStatus.ENQUEUED, 0, filename, savedDir, headers, showNotification, openFileFromNotification, allowCellular);
return Promise.resolve();
}
private registerCallback(call: MethodCall, result: MethodResult): void {
const args: number[] = call.args as number[];
this.callbackHandle = args[0];
result.success(null);
}
private initialize(call: MethodCall, result: MethodResult): void {
const args: number[] = call.args as number[];
this.callbackHandle = args[0];
this.debugMode = args[1];
preferences.getPreferencesSync(this.context, { name: FlutterDownloaderPlugin.SHARED_PREFERENCES_KEY })
.putSync(FlutterDownloaderPlugin.CALLBACK_DISPATCHER_HANDLE_KEY, this.callbackHandle);
result.success(null);
this.startBackgroundIsolate(this.callbackHandle);
}
private sendUpdateProgress(id: string, status: DownloadStatus, progress: number): void {
const args: Map<string, Any> = new Map<string, Any>();
args["task_id"] = id;
args["status"] = status;
args["progress"] = progress;
this.flutterChannel!.invokeMethod("updateProgress", args);
}
private async openFile(savedFile: string, mimeType: string): Promise<boolean> {
let uri = fileUri.getUriFromPath(savedFile);
const want: Want = {
action: 'ohos.want.action.viewData',
flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
uri: uri,
type: mimeType
};
try {
await this.context!.startAbility(want);
return Promise.resolve(true);
}
catch (err) {
// 处理入参错误异常
let code = (err as BusinessError).code;
let message = (err as BusinessError).message;
Logger.error(TAG, `startAbility failed, code is ${code}, message is ${message}`);
return Promise.resolve(false);
}
}
private cancelTask(taskId: string): void {
request.agent.getTask(this.context!, taskId).then((task: request.agent.Task) => {
task.stop((err: BusinessError) => {
if (err) {
Logger.error(TAG, `Failed to stop the download task, Code: ${err.code}, message: ${err.message}`);
return;
}
Logger.info(TAG, `Succeeded in stopping a download task. `);
const values: ValuesBucket = {};
values[TaskEntry.COLUMN_NAME_STATUS] = DownloadStatus.CANCELED;
values[TaskEntry.COLUMN_NAME_PROGRESS] = -1;
this.taskDao!.updateTask(taskId, values);
request.agent.remove(taskId, (err: BusinessError) => {
if (err) {
Logger.error(TAG, `Failed to removing a download task, Code: ${err.code}, message: ${err.message}`);
return;
}
Logger.info(TAG, `Succeeded in removing a download task. taskId: ${taskId}`);
});
});
});
}
private callback(taskId: string, filename: string, status: DownloadStatus, progress: request.agent.Progress, isResume?: number): void {
const task = this.taskDao!.loadTask(taskId);
const syncTask = this.taskDao!.getSyncData(taskId);
if (task != null) {
let lastProgress = 0;
if (status == DownloadStatus.COMPLETE) {
lastProgress = 100;
}
else if (status == DownloadStatus.FAILED) {
lastProgress = -1;
}
else {
lastProgress = Math.trunc(progress.processed * 100 / progress.sizes[0]);
// 状态是异步获取的,不存在由PAUSED状态直接变为RUNNING状态的情况,只能是PAUSED-->Resume-->RUNNING
const isErrorRunning = status === DownloadStatus.RUNNING && syncTask && syncTask[TaskEntry.COLUMN_NAME_STATUS] === DownloadStatus.PAUSED && isResume !== 0;
if (isErrorRunning) {
status = DownloadStatus.PAUSED;
}
const args: Map<string, Any> = new Map<string, Any>();
args["task_id"] = taskId;
args["status"] = status;
args["progress"] = lastProgress;
this.backgroundChannel?.invokeMethod('', [this.callbackHandle, taskId, status, lastProgress]);
}
const values: ValuesBucket = {};
values[TaskEntry.COLUMN_NAME_FILE_NAME] = filename;
values[TaskEntry.COLUMN_NAME_STATUS] = status;
values[TaskEntry.COLUMN_NAME_PROGRESS] = lastProgress;
if (!isResume) {
values[TaskEntry.COLUMN_NAME_RESUMABLE] = isResume!;
}
this.taskDao!.updateTask(taskId, values);
}
}
private renameSavedFile(filename: string): string {
// 匹配文件名结尾的 "(数字)"
const regex = /\((\d+)\)$/;
// 找到最后一个点的位置
const lastDotIndex = filename.lastIndexOf('.');
const baseName = lastDotIndex === -1 ? filename : filename.substring(0, lastDotIndex); // 文件名
const extension = lastDotIndex === -1 ? '' : filename.substring(lastDotIndex); // 包含点的扩展名
// 如果基本名称的结尾匹配到 "(数字)",则替换
if (regex.test(baseName)) {
return baseName.replace(regex, (match, number: string) => {
const newNumber = parseInt(number, 10) + 1; // 数字加 1
return `(${newNumber})`; // 返回新的 "(新数字)"
}) + extension; // 返回新的文件名
}
else {
// 如果没有匹配到 "(数字)",则在扩展名之前添加 "(1)"
return `${baseName}(1)${extension}`;
}
}
private async downloadFile(url: string, headers: string, filename: string, savedDir: string, allowCellular: boolean, showNotification: boolean, openFileFromNotification: boolean): Promise<string> {
const tempDir = this.context!.getApplicationContext().tempDir;
const tempFile = `${tempDir}/${filename}`;
const documentViewPicker = new picker.DocumentViewPicker(this.context!);
const documentSaveOptions = new picker.DocumentSaveOptions();
documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD;
const documentSaveResult = await documentViewPicker.save(documentSaveOptions);
const downloadDirUri = documentSaveResult[0];
const downloadDir = new fileUri.FileUri(downloadDirUri).path;
const saveFileDir = `${downloadDir}/${savedDir}`;
if (!fs.accessSync(saveFileDir))
fs.mkdirSync(`${saveFileDir}`, true);
let savedFile = `${saveFileDir}/${filename}`;
while (fs.accessSync(savedFile)) {
filename = this.renameSavedFile(filename);
savedFile = `${saveFileDir}/${filename}`;
}
const requestConfig: request.agent.Config = {
action: request.agent.Action.DOWNLOAD,
url: url,
saveas: tempFile,
metered: allowCellular,
overwrite: true,
gauge: showNotification
};
const downloadTask = await request.agent.create(this.context!, requestConfig);
const taskId = downloadTask.tid;
downloadTask.start((err: BusinessError) => {
if (err) {
Logger.error(TAG, `Failed to start the download task, Code: ${err.code}, message: ${err.message}`);
return;
}
Logger.info(TAG, `Succeeded in starting a download task.`);
this.tasks.add(taskId);
});
downloadTask.on('progress', (progress) => {
Logger.info(TAG, `downloader running`);
this.callback(taskId, filename, DownloadStatus.RUNNING, progress);
});
downloadTask.on('pause', (progress) => {
Logger.info(TAG, `downloader paused`);
this.callback(taskId, filename, DownloadStatus.PAUSED, progress, 1);
});
downloadTask.on('resume', (progress) => {
Logger.info(TAG, `downloader resumed`);
this.callback(taskId, filename, DownloadStatus.RUNNING, progress, 0);
});
downloadTask.on('failed', (progress) => {
Logger.info(TAG, `downloader failed`);
this.callback(taskId, filename, DownloadStatus.FAILED, progress);
});
downloadTask.on('remove', () => {
this.tasks.delete(taskId);
});
downloadTask.on('completed', () => {
Logger.info(TAG, `Request download completed`);
this.backgroundChannel?.invokeMethod('', [this.callbackHandle, taskId, DownloadStatus.COMPLETE, 100]);
fs.moveFileSync(tempFile, savedFile, 0);
const task = this.taskDao!.loadTask(taskId);
if (task != null) {
if (openFileFromNotification) {
const mimeType = task.mimeType;
this.openFile(savedFile, mimeType);
}
const values: ValuesBucket = {};
values[TaskEntry.COLUMN_NAME_SAVED_DIR] = saveFileDir;
values[TaskEntry.COLUMN_NAME_STATUS] = DownloadStatus.COMPLETE;
values[TaskEntry.COLUMN_NAME_PROGRESS] = 100;
this.taskDao!.updateTask(taskId, values);
}
request.agent.remove(taskId, (err: BusinessError) => {
if (err) {
Logger.error(TAG, `Failed to removing a download task, Code: ${err.code}, message: ${err.message}`);
return;
}
Logger.info(TAG, `Succeeded in removing a download task.`);
});
});
return Promise.resolve(taskId);
}
private async startBackgroundIsolate(handle: number) {
if (this.backgroundFlutterEngine == null) {
let context = this.context ?? getContext(this);
this.backgroundFlutterEngine = new FlutterEngine(context, null, null, null);
await this.backgroundFlutterEngine.init(context, null, true);
let flutterCallback = FlutterCallbackInformation.lookupCallbackInformation(handle);
if (flutterCallback == null) {
Logger.error(TAG, `Fatal: failed to find callback".`);
return;
}
let resourceManager = context.getApplicationContext().resourceManager;
let appBundlePath = FlutterInjector.getInstance().getFlutterLoader().findAppBundlePath();
this.backgroundFlutterEngine?.dartExecutor.executeDartCallback(new DartCallback(resourceManager, appBundlePath, flutterCallback));
}
this.backgroundChannel =
new MethodChannel(this.backgroundFlutterEngine.getDartExecutor().getBinaryMessenger(), "vn.hunghd/downloader_background");
this.backgroundChannel.setMethodCallHandler(this);
}
}
import hilog from "@ohos:hilog";
class Logger {
private domain: number;
private prefix: string;
private format: string = "%{public}s, %{public}s";
constructor(prefix: string) {
this.prefix = prefix;
this.domain = 0xFF00;
}
debug(...args: string[]) {
hilog.debug(this.domain, this.prefix, this.format, args);
}
info(...args: string[]) {
hilog.info(this.domain, this.prefix, this.format, args);
}
warn(...args: string[]) {
hilog.warn(this.domain, this.prefix, this.format, args);
}
error(...args: string[]) {
hilog.error(this.domain, this.prefix, this.format, args);
}
}
export default new Logger('[Flutter_Downloader]');
import type { DownloadStatus } from './DownloadStatus';
import type { TaskDbHelper } from './TaskDbHelper';
import { TaskEntry } from "@normalized:N&&&flutter_downloader/src/main/ets/components/TaskEntry&1.0.0";
import relationalStore from "@ohos:data.relationalStore";
import type { ValuesBucket as ValuesBucket } from "@ohos:data.ValuesBucket";
import type { BusinessError as BusinessError } from "@ohos:base";
import Logger from "@normalized:N&&&flutter_downloader/src/main/ets/components/Logger&1.0.0";
import type { DownloadTask } from './DownloadTask';
import { getMimeType } from "@normalized:N&&&flutter_downloader/src/main/ets/components/FileUtils&1.0.0";
const TAG = 'TaskDao';
export class TaskDao {
private dbHelper: TaskDbHelper | null = null;
private projection: string[] = [
TaskEntry.COLUMN_NAME_ID,
TaskEntry.COLUMN_NAME_TASK_ID,
TaskEntry.COLUMN_NAME_PROGRESS,
TaskEntry.COLUMN_NAME_STATUS,
TaskEntry.COLUMN_NAME_URL,
TaskEntry.COLUMN_NAME_FILE_NAME,
TaskEntry.COLUMN_NAME_SAVED_DIR,
TaskEntry.COLUMN_NAME_HEADERS,
TaskEntry.COLUMN_NAME_MIME_TYPE,
TaskEntry.COLUMN_NAME_RESUMABLE,
TaskEntry.COLUMN_NAME_OPEN_FILE_FROM_NOTIFICATION,
TaskEntry.COLUMN_NAME_SHOW_NOTIFICATION,
TaskEntry.COLUMN_NAME_TIME_CREATED,
TaskEntry.COLUMN_ALLOW_CELLULAR,
];
private syncData: Map<string, ValuesBucket> = new Map();
constructor(dbHelper: TaskDbHelper) {
this.dbHelper = dbHelper; // 将 dbHelper 作为实例变量保存
}
async insertOrUpdateNewTask(taskId: string, url: string, status: DownloadStatus, progress: number, filename: string, savedDir: string, headers: string, showNotification: boolean, openFileFromNotification: boolean, allowCellular: boolean): Promise<void> {
let db = this.dbHelper!.getRdbStore();
if (db == null) {
return;
}
let values: ValuesBucket = {};
values[TaskEntry.COLUMN_NAME_TASK_ID] = taskId;
values[TaskEntry.COLUMN_NAME_URL] = url;
values[TaskEntry.COLUMN_NAME_STATUS] = status;
values[TaskEntry.COLUMN_NAME_PROGRESS] = progress;
values[TaskEntry.COLUMN_NAME_FILE_NAME] = filename;
values[TaskEntry.COLUMN_NAME_SAVED_DIR] = savedDir;
values[TaskEntry.COLUMN_NAME_HEADERS] = headers;
values[TaskEntry.COLUMN_NAME_MIME_TYPE] = getMimeType(filename);
values[TaskEntry.COLUMN_NAME_SHOW_NOTIFICATION] = showNotification ? 1 : 0;
values[TaskEntry.COLUMN_NAME_OPEN_FILE_FROM_NOTIFICATION] = openFileFromNotification ? 1 : 0;
values[TaskEntry.COLUMN_NAME_RESUMABLE] = 0;
values[TaskEntry.COLUMN_NAME_TIME_CREATED] = Date.now();
values[TaskEntry.COLUMN_ALLOW_CELLULAR] = allowCellular ? 1 : 0;
db.beginTransaction();
try {
let rows = await db.insert(TaskEntry.TABLE_NAME, values, relationalStore.ConflictResolution.ON_CONFLICT_REPLACE);
Logger.info(TAG, `insertOrUpdateNewTask row count: ${rows}`);
db.commit();
}
catch (e) {
let err: BusinessError = e as BusinessError;
Logger.error(TAG, `insertOrUpdateNewTask failed, err.code: ${err.code}, err.message: ${err.message}`);
return Promise.reject(e);
}
return Promise.resolve();
}
async loadAllTasks(): Promise<Array<DownloadTask>> {
let db = this.dbHelper!.getRdbStore();
let result = new Array<DownloadTask>();
if (db != null) {
try {
let predicates = new relationalStore.RdbPredicates(TaskEntry.TABLE_NAME);
let resultSet = await db.query(predicates, this.projection);
Logger.info(TAG, `ResultSet row count: ${resultSet.rowCount}`);
while (resultSet.goToNextRow()) {
result.push(this.parseResultSet(resultSet));
}
// 释放数据集的内存
resultSet.close();
}
catch (e) {
let err: BusinessError = e as BusinessError;
Logger.error(TAG, `loadAllTasks failed, err.code: ${err.code}, err.message: ${err.message}`);
Promise.reject(e);
}
}
Logger.info(TAG, `ResultSet: ${JSON.stringify(result)}`);
return Promise.resolve(result);
}
loadTasksWithRawQuery(query: string): Array<DownloadTask> {
let db = this.dbHelper!.getRdbStore();
let result = new Array<DownloadTask>();
if (db != null) {
try {
let resultSet = db.querySqlSync(query);
Logger.info(TAG, `ResultSet row count: ${resultSet.rowCount}`);
while (resultSet.goToNextRow()) {
result.push(this.parseResultSet(resultSet));
}
// 释放数据集的内存
resultSet.close();
}
catch (e) {
let err: BusinessError = e as BusinessError;
Logger.error(TAG, `loadTasksWithRawQuery failed, err.code: ${err.code}, err.message: ${err.message}`);
}
}
return result;
}
getSyncData(taskId: string) {
return this.syncData.get(taskId);
}
loadTask(taskId: string): DownloadTask | null {
let db = this.dbHelper!.getRdbStore();
let result: DownloadTask | null = null;
if (db != null) {
try {
let predicates = new relationalStore.RdbPredicates(TaskEntry.TABLE_NAME);
predicates.equalTo(TaskEntry.COLUMN_NAME_TASK_ID, taskId);
predicates.orderByDesc(TaskEntry.COLUMN_NAME_ID);
predicates.limitAs(1);
let resultSet = db.querySync(predicates);
while (resultSet.goToNextRow()) {
result = this.parseResultSet(resultSet);
}
// 释放数据集的内存
resultSet.close();
}
catch (e) {
let err: BusinessError = e as BusinessError;
Logger.error(TAG, `loadTasksWithRawQuery failed, err.code: ${err.code}, err.message: ${err.message}`);
}
}
return result;
}
async updateTask(taskId: string, values: ValuesBucket): Promise<void> {
this.syncData.set(taskId, values);
let db = this.dbHelper!.getRdbStore();
if (db == null) {
return;
}
db.beginTransaction();
try {
let predicates = new relationalStore.RdbPredicates(TaskEntry.TABLE_NAME);
predicates.equalTo(TaskEntry.COLUMN_NAME_TASK_ID, taskId);
let rows = await db.update(values, predicates);
Logger.info(TAG, `Updated row count: ${rows}`);
db.commit();
}
catch (e) {
let err: BusinessError = e as BusinessError;
Logger.error(TAG, `updateTask err, err.code: ${err.code}, err.message: ${err.message}`);
return Promise.reject(`updateTask failed`);
}
return Promise.resolve();
}
async deleteTask(taskId: string): Promise<void> {
this.syncData.delete(taskId);
let db = this.dbHelper!.getRdbStore();
if (db == null) {
return;
}
db.beginTransaction();
try {
let predicates = new relationalStore.RdbPredicates(TaskEntry.TABLE_NAME);
predicates.equalTo(TaskEntry.COLUMN_NAME_TASK_ID, taskId);
let rows = await db.delete(predicates);
Logger.info(TAG, `Deleted row count: ${rows}`);
db.commit();
}
catch (e) {
let err: BusinessError = e as BusinessError;
Logger.error(TAG, `deleteTask err, err.code: ${err.code}, err.message: ${err.message}`);
return Promise.reject(`deleteTask failed`);
}
return Promise.resolve();
}
private parseResultSet(resultSet: relationalStore.ResultSet): DownloadTask {
const primaryId = resultSet.getLong(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_ID));
const task_id = resultSet.getString(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_TASK_ID));
const status = resultSet.getLong(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_STATUS));
const progress = resultSet.getLong(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_PROGRESS));
const url = resultSet.getString(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_URL));
const filename = resultSet.getString(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_FILE_NAME));
const savedDir = resultSet.getString(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_SAVED_DIR));
const headers = resultSet.getString(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_HEADERS));
const mimeType = resultSet.getString(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_MIME_TYPE));
const resumable = resultSet.getLong(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_RESUMABLE));
const showNotification = resultSet.getLong(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_SHOW_NOTIFICATION));
const clickToOpenDownloadedFile = resultSet.getLong(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_OPEN_FILE_FROM_NOTIFICATION));
const timeCreated = resultSet.getLong(resultSet.getColumnIndex(TaskEntry.COLUMN_NAME_TIME_CREATED));
const allowCellular = resultSet.getLong(resultSet.getColumnIndex(TaskEntry.COLUMN_ALLOW_CELLULAR));
let task: DownloadTask = {
primaryId: primaryId,
taskId: task_id,
status: status,
progress: progress,
url: url,
filename: filename,
savedDir: savedDir,
headers: headers,
mimeType: mimeType,
resumable: resumable == 1,
showNotification: showNotification == 1,
openFileFromNotification: clickToOpenDownloadedFile == 1,
timeCreated: timeCreated,
allowCellular: allowCellular == 1
};
return task;
}
}
import relationalStore from "@ohos:data.relationalStore";
import type { Context as Context } from "@ohos:abilityAccessCtrl";
import { TaskEntry } from "@normalized:N&&&flutter_downloader/src/main/ets/components/TaskEntry&1.0.0";
export class TaskDbHelper {
private static instance: TaskDbHelper;
private static readonly DATABASE_VERSION = 4;
private static readonly DATABASE_NAME = "download_tasks.db";
private static readonly SQL_CREATE_ENTRIES = "CREATE TABLE IF NOT EXISTS " + TaskEntry.TABLE_NAME + " (" +
TaskEntry.COLUMN_NAME_ID + " INTEGER PRIMARY KEY," +
TaskEntry.COLUMN_NAME_TASK_ID + " VARCHAR(256), " +
TaskEntry.COLUMN_NAME_URL + " TEXT, " +
TaskEntry.COLUMN_NAME_STATUS + " INTEGER DEFAULT 0, " +
TaskEntry.COLUMN_NAME_PROGRESS + " INTEGER DEFAULT 0, " +
TaskEntry.COLUMN_NAME_FILE_NAME + " TEXT, " +
TaskEntry.COLUMN_NAME_SAVED_DIR + " TEXT, " +
TaskEntry.COLUMN_NAME_HEADERS + " TEXT, " +
TaskEntry.COLUMN_NAME_MIME_TYPE + " VARCHAR(128), " +
TaskEntry.COLUMN_NAME_RESUMABLE + " TINYINT DEFAULT 0, " +
TaskEntry.COLUMN_NAME_SHOW_NOTIFICATION + " TINYINT DEFAULT 0, " +
TaskEntry.COLUMN_NAME_OPEN_FILE_FROM_NOTIFICATION + " TINYINT DEFAULT 0, " +
TaskEntry.COLUMN_NAME_TIME_CREATED + " INTEGER DEFAULT 0, " +
TaskEntry.COLUMN_ALLOW_CELLULAR + " TINYINT DEFAULT 1" +
")";
private static readonly SQL_DELETE_ENTRIES = `DROP TABLE IF EXISTS ${TaskEntry.TABLE_NAME}`;
private rdbStore: relationalStore.RdbStore | null = null;
constructor(context: Context) {
if (TaskDbHelper.instance) {
return TaskDbHelper.instance; // 单例模式
}
relationalStore.getRdbStore(context, {
name: TaskDbHelper.DATABASE_NAME,
securityLevel: relationalStore.SecurityLevel.S1
}).then(rdbStore => {
this.rdbStore = rdbStore;
this.rdbStore.version = TaskDbHelper.DATABASE_VERSION;
this.rdbStore.executeSql(TaskDbHelper.SQL_CREATE_ENTRIES);
TaskDbHelper.instance = this; // 设置单例
});
}
static getInstance(context?: Context): TaskDbHelper {
if (!TaskDbHelper.instance) {
TaskDbHelper.instance = new TaskDbHelper(context!);
}
return TaskDbHelper.instance;
}
getRdbStore(): relationalStore.RdbStore | null {
return this.rdbStore;
}
}
/*
* Copyright (c) 2024 SwanLink (Jiangsu) Technology Development Co., LTD.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export class TaskEntry {
public static readonly TABLE_NAME = "task";
public static readonly COLUMN_NAME_ID = "_id";
public static readonly COLUMN_NAME_TASK_ID = "task_id";
public static readonly COLUMN_NAME_STATUS = "status";
public static readonly COLUMN_NAME_PROGRESS = "progress";
public static readonly COLUMN_NAME_URL = "url";
public static readonly COLUMN_NAME_SAVED_DIR = "saved_dir";
public static readonly COLUMN_NAME_FILE_NAME = "file_name";
public static readonly COLUMN_NAME_MIME_TYPE = "mime_type";
public static readonly COLUMN_NAME_RESUMABLE = "resumable";
public static readonly COLUMN_NAME_HEADERS = "headers";
public static readonly COLUMN_NAME_SHOW_NOTIFICATION = "show_notification";
public static readonly COLUMN_NAME_OPEN_FILE_FROM_NOTIFICATION = "open_file_from_notification";
public static readonly COLUMN_NAME_TIME_CREATED = "time_created";
public static readonly COLUMN_ALLOW_CELLULAR = "allow_cellular";
}
import FlutterImageCompressOhosPlugin from "@normalized:N&&&flutter_image_compress_ohos/src/main/ets/components/plugin/FlutterImageCompressOhosPlugin&1.0.0";
export default FlutterImageCompressOhosPlugin;
import type { FlutterPlugin, FlutterPluginBinding } from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
import MethodChannel from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel&1.0.0-2317265cd5";
import type { MethodCallHandler, MethodResult } from "@normalized:N&&&@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel&1.0.0-2317265cd5";
import type MethodCall from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodCall';
import image from "@ohos:multimedia.image";
import fs from "@ohos:file.fs";
/** FlutterImageCompressOhosPlugin **/
export default class FlutterImageCompressOhosPlugin implements FlutterPlugin, MethodCallHandler {
private channel: MethodChannel | null = null;
private showLog: Boolean = true;
constructor() {
}
getUniqueClassName(): string {
return "FlutterImageCompressOhosPlugin";
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.channel = new MethodChannel(binding.getBinaryMessenger(), "flutter_image_compress");
this.channel.setMethodCallHandler(this);
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
if (this.channel != null) {
this.channel.setMethodCallHandler(null);
}
}
async onMethodCall(call: MethodCall, result: MethodResult): Promise<void> {
if (call.method == "showLog") {
this.showLog = call.args;
result.success(null);
}
else if (call.method == "compressWithList") {
let args: Map<string, any> = call.args;
let numberOfRetries: number = args.get('numberOfRetries');
await this.tryAgain(numberOfRetries, call, result, async () => {
// 'list': list,
let list: Uint8Array = args.get('list');
let buf: ArrayBuffer = list.buffer as ArrayBuffer;
const imageSource: image.ImageSource = image.createImageSource(buf);
return await this.compressWithImageSource(imageSource, args);
});
}
else if (call.method == 'compressWithFile') {
let args: Map<string, any> = call.args;
let numberOfRetries: number = args.get('numberOfRetries');
await this.tryAgain(numberOfRetries, call, result, async () => {
// 'path': path,
let filePath: string = args.get('path');
const imageSource: image.ImageSource = image.createImageSource(filePath);
return await this.compressWithImageSource(imageSource, args);
});
}
else if (call.method == 'compressAndGetFile') {
let args: Map<string, any> = call.args;
let numberOfRetries: number = args.get('numberOfRetries');
await this.tryAgain(numberOfRetries, call, result, async () => {
let targetPath: string = args.get('targetPath');
// 'path': path,
// 'targetPath': targetPath,
let filePath: string = args.get('path');
const imageSource: image.ImageSource = image.createImageSource(filePath);
let uint8Array = await this.compressWithImageSource(imageSource, args);
let file = await fs.open(targetPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
await fs.write(file.fd, uint8Array.buffer);
await fs.close(file.fd);
return targetPath;
});
}
else {
result.notImplemented();
}
}
async tryAgain(numberOfRetries: number, call: MethodCall, result: MethodResult, doWork: () => Promise<any>): Promise<void> {
if (numberOfRetries < 0) {
return;
}
try {
result.success(await doWork());
}
catch (e) {
if (this.showLog) {
console.error(`${call.method} failed, code is ${e.code}, message is ${e.message}`);
}
if (numberOfRetries - 1 > 0) {
this.tryAgain(numberOfRetries - 1, call, result, doWork);
}
else {
result.error(`${e.code}`, call.method, `${e.message}`);
}
}
}
async compressWithImageSource(imageSource: image.ImageSource, args: Map<string, any>): Promise<Uint8Array> {
// {
// 'path': path,
// 'minWidth': minWidth,
// 'minHeight': minHeight,
// 'inSampleSize': inSampleSize,
// 'quality': quality,
// 'rotate': rotate,
// 'autoCorrectionAngle': autoCorrectionAngle,
// 'format': format.index,
// 'keepExif': keepExif,
// 'numberOfRetries': numberOfRetries,
// }
let options: image.DecodingOptions = {
sampleSize: args.get('inSampleSize'),
editable: true,
};
let pixelMap: PixelMap = await imageSource.createPixelMap(options);
let exifRotate = 0;
let minWidth: number = args.get('minWidth');
let minHeight: number = args.get('minHeight');
if (args.get('autoCorrectionAngle')) {
try {
let imageProperty = await imageSource.getImageProperty(image.PropertyKey.ORIENTATION);
exifRotate = this.parseExifRotate(imageProperty);
}
catch (e) {
if (this.showLog)
console.error(`getImageProperty failed, code is ${e.code}, message is ${e.message}`);
}
}
if (exifRotate == 270 || exifRotate == 90) {
let tmp: number = minWidth;
minWidth = minHeight;
minHeight = tmp;
}
try {
let imageInfo = await pixelMap.getImageInfo();
let scale = 1 / this.calcScale(minWidth, minHeight, imageInfo.size.width, imageInfo.size.height);
await pixelMap.scale(scale, scale);
let rotate: number = args.get('rotate');
let targetRotate = (rotate + exifRotate) % 360;
if (targetRotate != 0) {
await pixelMap.rotate(targetRotate);
}
}
catch (e) {
if (this.showLog)
console.error(`getImageInfo failed, code is ${e.code}, message is ${e.message}`);
}
const imagePackerApi = image.createImagePacker();
// PixelMap编码成不同格式的存档图片(当前仅支持JPEG和WebP)
let format: string = 'image/jpeg';
switch (args.get('format')) {
case 1:
format = 'image/png';
break;
case 2:
format = 'image/heic';
break;
case 3:
format = 'image/webp';
break;
default:
break;
}
const packOptions: image.PackingOption = {
format: format,
quality: args.get('quality'),
};
let uint8Array: Uint8Array = new Uint8Array(await imagePackerApi.packing(pixelMap, packOptions));
pixelMap.release();
return uint8Array;
}
calcScale(minWidth: number, minHeight: number, width: number, height: number): number {
let scaleW = width / minWidth;
let scaleH = height / minHeight;
if (this.showLog) {
console.log(`width scale = ${scaleW}`);
console.log(`height scale = ${scaleH}`);
}
return Math.max(1, Math.min(scaleW, scaleH));
}
// 1 上 左 0°
// 2 上 右 水平翻转
// 3 下 右 180°
// 4 下 左 垂直翻转
// 5 左 上 顺时针90°+水平翻转
// 6 右 上 顺时针90°
// 7 右 下 顺时针90°+垂直翻转
// 8 左 下 逆时针90°
parseExifRotate(orientation: string): number {
orientation = orientation.toLowerCase();
switch (orientation) {
// 1 上 左 0°
case 'top-left':
return 0;
// 2 上 右 水平翻转
case 'top-right':
return 0;
// 3 下 右 180°
case 'bottom-right':
return 180;
// 4 下 左 垂直翻转
case 'bottom-left':
return 0;
case 'left-top':
// 5 左 上 顺时针90°+水平翻转
return 90;
// 6 右 上 顺时针90°
case 'right-top':
return 90;
// 7 右 下 顺时针90°+垂直翻转
case 'right-bottom':
return 90;
// 8 左 下 逆时针90°
case 'left-bottom':
return 270;
default:
break;
}
return 0;
}
}
import InAppWebViewFlutterPlugin from "@normalized:N&&&flutter_inappwebview_ohos/src/main/ets/components/plugin/InAppWebViewFlutterPlugin&1.0.0";
export default InAppWebViewFlutterPlugin;
/*
* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export default class EventConstant {
public static readonly EVENT_PULL_SETREFRESHING = "pull_setRefreshing";
public static readonly EVENT_UPDATE_STARTSCRIPTS = "update_startScripts";
public static readonly EVENT_UPDATE_CACHEENABLE = "update_cacheEnable";
}
import { Log } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { AbilityAware, AbilityPluginBinding, BinaryMessenger } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { FlutterAssets, FlutterPlugin, FlutterPluginBinding } from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
import type { HeadlessInAppWebViewManager } from './headless_in_webview/HeadlessInAppWebViewManager';
import MyCookieManager from "@normalized:N&&&flutter_inappwebview_ohos/src/main/ets/components/plugin/MyCookieManager&1.0.0";
import PrintJobManager from "@normalized:N&&&flutter_inappwebview_ohos/src/main/ets/components/plugin/print_job/PrintJobManager&1.0.0";
import FlutterWebViewFactory from "@normalized:N&&&flutter_inappwebview_ohos/src/main/ets/components/plugin/webview/FlutterWebViewFactory&1.0.0";
import { InAppWebViewManager } from "@normalized:N&&&flutter_inappwebview_ohos/src/main/ets/components/plugin/webview/InAppWebViewManager&1.0.0";
import InAppBrowserManager from "@normalized:N&&&flutter_inappwebview_ohos/src/main/ets/components/plugin/in_app_browser/InAppBrowserManager&1.0.0";
import type common from "@ohos:app.ability.common";
import type UIAbility from "@ohos:app.ability.UIAbility";
const TAG = "InAppWebViewFlutterPlugin";
export default class InAppWebViewFlutterPlugin implements FlutterPlugin, AbilityAware {
public flutterAssets: FlutterAssets | null = null;
public flutterWebViewFactory: FlutterWebViewFactory | null = null;
public messenger: BinaryMessenger | null = null;
public printJobManager: PrintJobManager | null = null;
public myCookieManager: MyCookieManager | null = null;
public headlessInAppWebViewManager: HeadlessInAppWebViewManager | null = null;
public inAppWebViewManager: InAppWebViewManager | null = null;
public inAppBrowserManager: InAppBrowserManager | null = null;
public applicationContext: common.Context | null = null;
public uiAbility: UIAbility | null = null;
constructor() {
}
onAttachedToAbility(binding: AbilityPluginBinding): void {
this.uiAbility = binding.getAbility();
}
onDetachedFromAbility(): void {
this.uiAbility = null;
}
getUniqueClassName(): string {
return "InAppWebViewFlutterPlugin";
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
Log.d(TAG, "onAttachedToEngine");
this.messenger = binding.getBinaryMessenger();
this.flutterAssets = binding.getFlutterAssets();
this.inAppWebViewManager = new InAppWebViewManager(this);
this.inAppBrowserManager = new InAppBrowserManager(this);
this.flutterWebViewFactory = new FlutterWebViewFactory(this);
this.messenger = binding.getBinaryMessenger();
this.applicationContext = binding.getApplicationContext();
binding.getPlatformViewRegistry()
.registerViewFactory(FlutterWebViewFactory.VIEW_TYPE_ID, this.flutterWebViewFactory);
this.myCookieManager = new MyCookieManager(this);
this.printJobManager = new PrintJobManager(this);
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
if (this.printJobManager != null) {
this.printJobManager.dispose();
this.printJobManager = null;
}
if (this.inAppWebViewManager != null) {
this.inAppWebViewManager.dispose();
this.inAppWebViewManager = null;
}
if (this.inAppBrowserManager != null) {
this.inAppBrowserManager.dispose();
this.inAppBrowserManager = null;
}
if (this.myCookieManager != null) {
this.myCookieManager.dispose();
this.myCookieManager = null;
}
}
}
/*
* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const mimeTypes: Record<string, string> = {
'txt': 'text/plain',
'html': 'text/html',
'css': 'text/css',
'js': 'text/javascript',
'json': 'application/json',
'xml': 'application/xml',
'pdf': 'application/pdf',
'doc': 'application/msword',
'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'xls': 'application/vnd.ms-excel',
'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'ppt': 'application/vnd.ms-powerpoint',
'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'zip': 'application/zip',
'gif': 'image/gif',
'jpeg': 'image/jpeg',
'jpg': 'image/jpeg',
'png': 'image/png',
'svg': 'image/svg+xml',
'mp3': 'audio/mpeg',
'mp4': 'video/mp4',
'wav': 'audio/wav',
'ogg': 'audio/ogg',
'mpg': 'video/mpeg',
'mpeg': 'video/mpeg',
'avi': 'video/x-msvideo',
'mov': 'video/quicktime',
'wmv': 'video/x-ms-wmv',
'flv': 'video/x-flv',
'odt': 'application/vnd.oasis.opendocument.text',
'ods': 'application/vnd.oasis.opendocument.spreadsheet',
'odp': 'application/vnd.oasis.opendocument.presentation',
'csv': 'text/csv',
'rtf': 'application/rtf',
'yaml': 'application/x-yaml',
'ics': 'text/calendar',
'vcard': 'text/vcard',
'tar': 'application/x-tar',
'7z': 'application/x-7z-compressed',
'rar': 'application/x-rar-compressed',
'bmp': 'image/bmp',
'ico': 'image/x-icon',
'tif': 'image/tiff',
'tiff': 'image/tiff',
'webp': 'image/webp',
'woff': 'font/woff',
'woff2': 'font/woff2',
'eot': 'application/vnd.ms-fontobject',
'otf': 'font/otf',
'ttf': 'font/ttf',
'apk': 'application/vnd.android.package-archive',
'exe': 'application/x-msdownload',
'deb': 'application/x-debian-package',
'rpm': 'application/x-rpm',
'dmg': 'application/x-apple-diskimage',
'iso': 'application/x-iso9660-image',
'tar.gz': 'application/x-tar-gz',
'tgz': 'application/x-tar-gz',
'tar.bz2': 'application/x-tar-bz2',
'tbz': 'application/x-tar-bz2',
'tar.xz': 'application/x-tar-xz',
'txz': 'application/x-tar-xz',
'bin': 'application/octet-stream',
'dll': 'application/octet-stream',
'jar': 'application/java-archive',
'war': 'application/java-archive',
'ear': 'application/java-archive',
'swf': 'application/x-shockwave-flash',
'webm': 'video/webm',
'wasm': 'application/wasm',
'ogm': 'video/x-ogm',
'mkv': 'video/x-matroska',
'flac': 'audio/flac',
'ape': 'audio/x-ape',
'm4a': 'audio/mp4',
'opus': 'audio/opus',
'spx': 'audio/ogg',
'wavpack': 'audio/x-wavpack',
'wv': 'audio/x-wavpack',
'tta': 'audio/x-tta',
'dsf': 'audio/x-dsf',
'dff': 'audio/x-dff',
'aac': 'audio/aac',
'amr': 'audio/amr',
'ra': 'audio/x-realaudio',
'rm': 'audio/x-pn-realaudio',
'ram': 'audio/x-pn-realaudio',
'm3u': 'audio/x-mpegurl',
'pls': 'audio/x-scpls',
'wma': 'audio/x-ms-wma',
'ogv': 'video/ogg',
'm4v': 'video/x-m4v',
};
export default class MimeTypes {
public static getMimeTypeFromExtension(extension: string): string {
let item = mimeTypes[extension];
return item ? item : extension;
}
}
import ChannelDelegateImpl from "@normalized:N&&&flutter_inappwebview_ohos/src/main/ets/components/plugin/types/ChannelDelegateImpl&1.0.0";
import web_webview from "@ohos:web.webview";
import type InAppWebViewFlutterPlugin from './InAppWebViewFlutterPlugin';
import { MethodChannel } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { Any, MethodCall } from "@normalized:N&&&@ohos/flutter_ohos/index&1.0.0-2317265cd5";
import type { MethodResult } from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel';
import type business_error from "@ohos:base";
import Intl from "@ohos:intl";
import List from "@ohos:util.List";
const LOG_TAG = "MyCookieManager";
const METHOD_CHANNEL_NAME = "com.pichillilorenzo/flutter_inappwebview_cookiemanager";
export default class MyCookieManager extends ChannelDelegateImpl {
public plugin: InAppWebViewFlutterPlugin | null;
constructor(plugin: InAppWebViewFlutterPlugin) {
super(new MethodChannel(plugin.messenger!, METHOD_CHANNEL_NAME));
this.plugin = plugin;
}
public async onMethodCall(call: MethodCall, result: MethodResult): Promise<void> {
switch (call.method) {
case "setCookie":
{
let url: string = call.argument("url") as string;
let name: string = call.argument("name") as string;
let value: string = call.argument("value") as string;
let domain: string = call.argument("domain") as string;
let path: string = call.argument("path") as string;
let expiresDateString: string = call.argument("expiresDate") as string;
let expiresDate: number | null = (expiresDateString != null ? new Number(expiresDateString).valueOf() : null);
let maxAge: number = call.argument("maxAge") as number;
let isSecure: boolean = call.argument("isSecure") as boolean;
let isHttpOnly: boolean = call.argument("isHttpOnly") as boolean;
let sameSite: string = call.argument("sameSite") as string;
this.setCookie(url, name, value, domain, path, expiresDate, maxAge, isSecure, isHttpOnly, sameSite, result);
}
break;
case "getCookies":
result.success(await this.getCookies(call.argument("url") as string));
break;
case "deleteCookie":
{
let url: string = call.argument("url") as string;
let name: string = call.argument("name") as string;
let domain: string = call.argument("domain") as string;
let path: string = call.argument("path") as string;
this.deleteCookie(url, name, domain, path, result);
}
break;
case "deleteCookies":
{
let url: string = call.argument("url") as string;
let domain: string = call.argument("domain") as string;
let path: string = call.argument("path") as string;
this.deleteCookies(url, domain, path, result);
}
break;
case "deleteAllCookies":
this.deleteAllCookies(result);
break;
case "removeSessionCookies":
this.removeSessionCookies(result);
break;
default:
result.notImplemented();
}
}
public setCookie(url: string, name: string, value: string, domain: string, path: string, expiresDate: number | null, maxAge: number, isSecure: boolean, isHttpOnly: boolean, sameSite: string, result: MethodResult): void {
if (!web_webview.WebCookieManager.isCookieAllowed()) {
result.success(false);
return;
}
try {
let cookieValue = name + "=" + value + "; Path=" + path;
if (domain != null) {
cookieValue += "; Domain=" + domain;
}
if (expiresDate != null) {
cookieValue += "; Expires=" + this.getCookieExpirationDate(expiresDate);
}
if (maxAge != null) {
cookieValue += "; Max-Age=" + maxAge.toString();
}
if (isSecure) {
cookieValue += "; Secure";
}
if (isHttpOnly) {
cookieValue += "; HttpOnly";
}
if (sameSite != null) {
cookieValue += "; SameSite=" + sameSite;
}
web_webview.WebCookieManager.configCookie(url, cookieValue);
result.success(true);
}
catch (error) {
let e: business_error.BusinessError = error as business_error.BusinessError;
console.error(`ErrorCode: ${e.code}, Message: ${e.message}`);
result.success(false);
}
}
public async getCookies(url: string): Promise<List<Map<string, Any>>> {
let cookieListMap: List<Map<string, Any>> = new List<Map<string, Any>>();
if (web_webview.WebCookieManager.fetchCookieSync(url) == "")
return cookieListMap;
/// Android中同样只获取了setCookies中“name=value”这一段,因此目前先这样写着
let cookies: string[] = web_webview.WebCookieManager.fetchCookieSync(url).split(";");
for (let cookie of cookies) {
let nameValue: string[] = cookie.split("=");
let name: string = nameValue[0].trim();
let value: string = (nameValue.length > 1) ? nameValue[1].trim() : "";
let cookieMap: Map<string, Any> = new Map<string, Any>();
cookieMap.set("name", name);
cookieMap.set("value", value);
cookieMap.set("expiresDate", null);
cookieMap.set("isSessionOnly", null);
cookieMap.set("domain", null);
cookieMap.set("sameSite", null);
cookieMap.set("isSecure", null);
cookieMap.set("isHttpOnly", null);
cookieMap.set("path", null);
cookieListMap.add(cookieMap);
}
return cookieListMap;
}
public deleteCookie(url: string, name: string, domain: string, path: string, result: MethodResult): void {
if (!web_webview.WebCookieManager.isCookieAllowed()) {
result.success(false);
return;
}
try {
let cookieValue = name + "=; Path=" + path + "; Max-Age=-1";
if (domain != null)
cookieValue += "; Domain=" + domain;
web_webview.WebCookieManager.configCookieSync(url, cookieValue);
result.success(true);
}
catch (error) {
let e: business_error.BusinessError = error as business_error.BusinessError;
console.error(`ErrorCode: ${e.code}, Message: ${e.message}`);
}
}
public deleteCookies(url: string, domain: string, path: string, result: MethodResult): void {
if (!web_webview.WebCookieManager.isCookieAllowed()) {
result.success(false);
return;
}
let cookiesString: string = web_webview.WebCookieManager.fetchCookieSync(url);
if (cookiesString != null) {
for (let cookiesValue of cookiesString.split(";")) {
let nameValue: string[] = cookiesValue.split("=");
let name: string = nameValue[0].trim();
let cookieValue = name + "=; Path=" + path + "; Max-Age=-1";
if (domain != null)
cookieValue += "; Domain=" + domain;
web_webview.WebCookieManager.configCookieSync(url, cookieValue);
}
}
result.success(true);
}
public deleteAllCookies(result: MethodResult): void {
if (!web_webview.WebCookieManager.isCookieAllowed()) {
result.success(false);
return;
}
try {
web_webview.WebCookieManager.clearAllCookiesSync();
result.success(true);
}
catch (e) {
console.error(LOG_TAG, e);
}
}
public removeSessionCookies(result: MethodResult): void {
if (!web_webview.WebCookieManager.isCookieAllowed()) {
result.success(false);
return;
}
try {
web_webview.WebCookieManager.clearSessionCookieSync();
result.success(true);
}
catch (e) {
console.error(LOG_TAG, e);
}
}
public getCookieExpirationDate(timestamp: number): string {
let dateFormat = new Intl.DateTimeFormat("en-US", { weekday: 'short', day: '2-digit',
month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', timeZone: 'GMT' });
return dateFormat.format(new Date(timestamp));
}
public dispose(): void {
super.dispose();
this.plugin = null;
}
}
import type { Any } from '@ohos/flutter_ohos';
import display from "@ohos:display";
export default class Util {
static LOG_TAG: string = "Util";
constructor() {
}
/// android.text.TextUtils未找对应的,未完善
public static replaceAll(s: string, oldString: string, newString: string): string {
return s.replace(new RegExp(oldString, 'g'), newString);
}
public static getOrDefault(map: Map<string, Any>, key: string, defaultValue: Any): Any {
let keys = map.keys();
for (let keyValue of keys) {
if (keyValue == key) {
return map.get(key) as Any;
}
}
return defaultValue;
}
public static objEquals(a: Any, b: Any): boolean {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// return Objects.equals(a, b);
// }
return (a == b) || (a != null && a.equals(b));
}
public static formatString(format: string, ...args: Any[]): string {
return format.replace(/{(\d+)}/g, (match, index: number) => {
const arg: Any = args[index];
return arg !== undefined ? arg.toString() + "" : match;
});
}
static getPixelDensity(): number {
return display.getDefaultDisplaySync().densityPixels;
}
}
import type ContentBlockerAction from './ContentBlockerAction';
import type ContentBlockerTrigger from './ContentBlockerTrigger';
export default class ContentBlocker {
private trigger: ContentBlockerTrigger;
private action: ContentBlockerAction;
constructor(trigger: ContentBlockerTrigger, action: ContentBlockerAction) {
this.trigger = trigger;
this.action = action;
}
}
import type { Any } from '@ohos/flutter_ohos';
import type { ContentBlockerActionType } from './ContentBlockerActionType';
export default class ContentBlockerAction {
private type: ContentBlockerActionType;
private selector: string;
constructor(type: ContentBlockerActionType, selector: string) {
this.type = type;
this.selector = selector;
}
static fromMap(map: Map<string, Any>): ContentBlockerAction {
let type: ContentBlockerActionType = map.get("type");
let selector: string = map.get("selector");
return new ContentBlockerAction(type, selector);
}
}
import type ContentBlocker from './ContentBlocker';
import ArrayList from "@ohos:util.ArrayList";
import type InAppWebView from '../webview/in_app_webview/InAppWebView';
import type WebResourceRequestExt from '../types/WebResourceRequestExt';
import { ContentBlockerTriggerResourceType } from "@normalized:N&&&flutter_inappwebview_ohos/src/main/ets/components/plugin/content_blocker/ContentBlockerTriggerResourceType&1.0.0";
export default class ContentBlockerHandler {
protected ruleList = new ArrayList<ContentBlocker>();
constructor(ruleList?: ArrayList<ContentBlocker>) {
if (ruleList) {
this.ruleList = ruleList;
}
}
getRuleList(): ArrayList<ContentBlocker> {
return this.ruleList;
}
setRuleList(newRuleList: ArrayList<ContentBlocker>) {
this.ruleList = newRuleList;
}
checkUrl(webView: InAppWebView, request: WebResourceRequestExt, contentType?: string): WebResourceResponse | null {
return this.checkUrlWithResourceType(webView, request, contentType ? this.getResourceTypeFromContentType(contentType) : ContentBlockerTriggerResourceType.RAW);
}
checkUrlWithResourceType(webView: InAppWebView, request: WebResourceRequestExt, responseResourceType: ContentBlockerTriggerResourceType): WebResourceResponse | null {
return null;
}
getResourceTypeFromContentType(contentType: string): ContentBlockerTriggerResourceType {
let responseResourceType = ContentBlockerTriggerResourceType.RAW;
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types
if (contentType == "text/css") {
responseResourceType = ContentBlockerTriggerResourceType.STYLE_SHEET;
}
else if (contentType == "image/svg+xml") {
responseResourceType = ContentBlockerTriggerResourceType.SVG_DOCUMENT;
}
else if (contentType.startsWith("image/")) {
responseResourceType = ContentBlockerTriggerResourceType.IMAGE;
}
else if (contentType.startsWith("font/")) {
responseResourceType = ContentBlockerTriggerResourceType.FONT;
}
else if (contentType.startsWith("audio/") || contentType.startsWith("video/") || contentType == "application/ogg") {
responseResourceType = ContentBlockerTriggerResourceType.MEDIA;
}
else if (contentType.endsWith("javascript")) {
responseResourceType = ContentBlockerTriggerResourceType.SCRIPT;
}
else if (contentType.startsWith("text/")) {
responseResourceType = ContentBlockerTriggerResourceType.DOCUMENT;
}
return responseResourceType;
}
}
import type { Any } from '@ohos/flutter_ohos';
export default class ContentBlockerTrigger {
static fromMap(map: Map<string, Any>): ContentBlockerTrigger {
return new ContentBlockerTrigger();
}
}